Servlet 响应客户端请求的流程
Servlet 的生命周期
3个主要方法(对应servlet生命周期的三个阶段)
- init() 初始化阶段(当servlet实例不存在时才会执行初始化阶段,它只会执行一次)
- service() 运行阶段
- destory() 销毁阶段(服务器关闭或者web应用终止的时候,执行销毁阶段,servlet容器会调用所有servlet的destory()方法,对所有servlet实例进行销毁)
Servlet API
所有的servlet类都必须实现Servlet接口,这个接口包含了上面说到的三个主要方法init(),service(),destory()。
继承关系
- Servlet 接口
- GenericServlet抽象类 实现了 Servlet 接口
唯一的一个抽象方法是 service(),如果要继承GenericServlet 抽象类的话,必须实现 service(),对来自客户端的请求进行处理。
可以通过继承 GenericServlet 抽象类 覆写 init(),destory() 方法,和实现 service() 方法,来测试Servlet的生命周期。
- HttpServlet抽象类 继承了GenericServlet 抽象类
它在实现service()方法中,会根据请求的对象来判断请求的类型,来调用对应的方法。
doPost() (如果是 post请求 则调用doPost()方法)
doGet()(如果是 get请求 则调用doGet()方法)
put请求,delete请求等,以此类推。
所以,当我们的写的 servlet 继承 HttpServlet 时, 需要改写 do 开头的方法来处理对应的请求。
常用对象
- ServletRequest (这就是上面提到的,Servlet容器 会解析客户端请求的原始数据并包装成ServletRequest对象 和 ServletResponse对象 传递给特定servlet的service()方法)
获取请求数据的三个常用方法:- getParameter()
- setAttribute()
- getAttribute()
- ServletResponse
响应结果的三个常用方法:- setCharacterEncoding() 设置响应的正文字符编码
- setContentType() 设置响应的类型
- getWriter() 返回一个 PrintWriter 对象,用来输出HTML的内容
- HttpServletRequest (这里对应的就是 HttpServlet抽象类 的do开头的方法的request和response对象,它继承了 ServletRequest)
- HttpServletResponse
- ServletConfig (Servlet接口 的 init() 方法中使用了ServletConfig对象,里面存放的是servlet初始化的参数信息,可以直接使用 getInitParameter() 来返回一些初始化参数,也可以直接通过getServletContext() 来得到下面要说的 ServletContext对象)
- ServletContext (它是servlet 与 Servlet容器通信的一个接口,每一个web应用都会有一个ServletContext对象,所有的servlet都共享这个对象,都可以通过这个对象来访问容器的一些资源)
用法记录
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("HTML代码");
out.close();
this.getServletInfo(); //this一般省略
getInitParameter("initValue");
getServletContext().getInitParameter("contextValue");
//这两个参数需要在web.xml中进行配置,如下:
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.czq.servlet.HelloServlet</servlet-class>
<init-param>
<param-name>initValue</param-name>
<param-value>设置initValue值,这个值只在本servlet中可调用,不共享</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextValue</param-name>
<param-value>设置contextValue值,所有servlet共享</param-value>
</context-param>