2. Servlet

Servlet 响应客户端请求的流程

Created with Raphaël 2.2.0 客户端发出一个要求访问特定servlet的请求 servlet容器接收到请求,在jre中解析创建出一个request对象(包含了客户端的请求信息等)和response对象(用于对客户端请求的响应) servlet容器调用客户端访问的特定servlet的service()方法, 并将request对象和response对象传过去 service()方法通过request对象获得相关请求信息, 对请求进行处理,使用response对象生成响应的结果,返回给客户端

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()方法)
    获取请求数据的三个常用方法:
    1. getParameter()
    2. setAttribute()
    3. getAttribute()
  • ServletResponse
    响应结果的三个常用方法:
    1. setCharacterEncoding() 设置响应的正文字符编码
    2. setContentType() 设置响应的类型
    3. 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>
注解 和 web.xml
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值