Servlet
Servlet是Java web 开发的基石,与平台无关的服务器组件(操作系统),它运行在Servlet容器/web应用服务器/Tomcat中,负责与客户端通信
Servlet的功能
1.创建并返回基于客户请求的动态 HTML 页面
2.可以与数据库进行通信
Servlet的使用
Servlet本身是一种接口,存在与Javax.servlet,自定义一个类,实现servlet接口
这个类就具备了接受客户端请求以及做出响应的功能
servlet不能直接访问,但是index.jsp可以直接访问
是因为在编辑配置后编译时,生成一个out文件;out文件将编译的文件提供给Tomcat加载运行,而设置工件时,会给tomcat提供一个目录,而index.jsp文件就在这个目录之下,而servlet文件在下级目录,所以不能直接访问。
当在浏览器输入url时填写out文件下servlet文件路径还是不能直接访问,是因为权限不够。
解决方法:
1.通过映射,在web.WEB-INF.web.xml文件中进行配置
<servlet><servlet-name>MyServlet</servlet-name><servlet-class>com.southwind.servlet.MyServlet</servlet-class></servlet><servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/myservlet</url-pattern></servlet-mapping>
通过name进行关联,
2.基于注解的方式
直接在servlet文件中写
package com.southwind.servlet;import javax.jws.WebService;import javax.servlet.*;import javax.servlet.annotation.WebServlet;import javax.swing.text.html.HTML;import java.io.IOException;@WebServlet("/demo1")public class MyServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {//初始化}@Overridepublic ServletConfig getServletConfig() {// 反映一个对象 用来获取servlet本身信息的return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {// 处理客户端信息的System.out.println("lllll");// 通过url请求传参(?key-values)// 接收信息String id = servletRequest.getParameter("id");// 设置响应类型servletResponse.setContentType("text/html;charset=utf-8");// 响应返回一句话servletResponse.getWriter().write("hello");servletResponse.getWriter().write("你好");}@Overridepublic String getServletInfo() {// 返回字符串信息return null;}@Overridepublic void destroy() {// 卸载销毁}}
互联网简单通信
import javax.servlet.*;import javax.swing.text.html.HTML;import java.io.IOException;public class MyServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {//初始化}@Overridepublic ServletConfig getServletConfig() {// 反映一个对象 用来获取servlet本身信息的return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {// 处理客户端信息的System.out.println("lllll");// 通过url请求传参(?key-values)// 接收信息String id = servletRequest.getParameter("id");// 设置响应类型servletResponse.setContentType("text/html;charset=utf-8");// 响应返回一句话servletResponse.getWriter().write("hello");servletResponse.getWriter().write("你好");}@Overridepublic String getServletInfo() {// 返回字符串信息return null;}@Overridepublic void destroy() {// 卸载销毁}}
Servlet的生命周期
有垃圾回收机制
init创建,service服务,destroy 销毁
只创建一个对象反复调用(减少开销)
当程序关闭时执行destory,销毁对象
非静态方法调用方法必须创建对象,而上述代码没有创建对象
上述代码的对象是由Tomcat容器完成,并且是通过反射机制完成。
所以在配置web.xml时使用全类名
反射创建对象一般是调用无参构造器,
package com.southwind.servlet;import javax.servlet.*;import javax.servlet.annotation.WebServlet;import java.io.IOException;@WebServlet("/demo2")public class HelloServleet implements Servlet {public HelloServleet () {//无参构造器System.out.println("创建Servlet");}@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("初始化");}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("实现方法");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {System.out.println("释放方法");}}
因为java是面向对象的,所以使用方法时必须有对象,当自己不需要创建对象时,一定是程序自己创建一个对象
反射机制创建对象

package com.southwind.servlet;import java.lang.reflect.Constructor;public class TomcatTest {public static void main(String[] args) {//shrows ClassCastException抛出异常// 不建议抛出,因为异常是抛出给上一级或者虚拟机// 会造成上述机制压力过大String str = "com.southwind.servlet.HelloServleet";// 通过反射机制创建对象// 通过运行实类,// 程序启动,对象的创建都是动态的,类都是来自于静态文件的,虚拟机内存结构// class就是运行实类try {//因为class类可能不存在,所以要处理异常Class clazz = Class.forName(str);// 因为它是运行实类,所以可以拿到类的信息// 获取构造函数Constructor constructor = clazz.getConstructor();System.out.println(constructor);Object o = constructor.newInstance();System.out.println(o);// getconstructor获取构造器,()里不填内容获取无参,// 这里抛出异常可能不存在这个方法 constructor构造器} catch (Exception e) {//实际上是多态的体现e.printStackTrace();//print stack trace 打印跟踪信息}// 可以简化写法,直接使用父类// catch (ClassNotFoundException e) {// e.printStackTrace();// } catch (NoSuchMethodException e){// e.printStackTrace();// }//捕获异常}}
ServletConfig
该接口使用来描述Servlert的基本信息的
getServletName 返回Servlet名称,全类名包含包名
getInitParameter 获取init参数的值 (web.xml)
getInitParameterNames 以集合的形式返回所有的intparameter值
通过遍历的方式
getservletcontext 返回servletcontext的上下文,整个servletcontext的管理者信息
使用方法getcontextpath 获取当前应用的名称
方法getserverinfo获取服务器信息
servletconfig与servletcontext的区别
servletconfig作用于某个servlet实例,每个对象都有一个servletconfig
servletcontext作用于整个web应用,一个web对应一个servletcontext,
servlet的层次结构
1.servlet是最顶端的接口
2.GenericServlet
3.HttpServlet
只需要继承httpservlet在开发过程中
HTTP 请求有很多类型
常用的有四种:1.get 读取2.post 保存 3.put 修改 4.delete 删除
RESTful架构会用这四种,
-
GenericServlet实现Servlet接口,同时为它的子类屏蔽了不常用的方法,子类只需要重写service方法即可。 -
HttpServlet继承GenericServlet,根据请求类型进行分发处理,GET 请求进入doGet方法,POST 请求进入doPost方法。 -
开发者自定义的
Servlet类只需要继承HttpServlet即可,重新实现doGet和doPost方法。
