入门servlet系列

Servlet简介

servlet系列要实现的功能便是接收浏览器的请求,响应请求。
完成这个功能可以有三种方式:

  • 实现Servlet接口,这个最为原始,共有五种方法
  • 继承GenericServlet类,对Servlet接口的两种方法实现了重写
  • 继承HttpServlet类,对GenericServlet类也进行了重写

通常继承HttpServlet类实现功能

Servlet接口

Servlet接口中有三个生命周期方法,由Tomcat调用:

  • public void init(ServletConfig arg0)
    方法讲解:当Tomcat接收到请求时创建对象,并调用init方法。可以看作是生命周期的开始。

  • public void service(ServletRequest arg0, ServletResponse arg1)
    方法讲解:这个方法负责响应请求,浏览器每发送一次请求就运行一次servlet。ServletRequest类对象是接收的客户端发送的请求数据,ServletResponse返回给客户端服务器端的响应结果。

  • public void destroy()
    方法讲解:当结束时会调用这个方法,但不是通过这个方法来结束,只是用来传递一些‘遗言’,用处不大。

还有两个方法,由我们自己调用:

  • public ServletConfig getServletConfig()
    方法讲解:返回的ServletConfig类型数据是Servlet的配置参数

最后一个方法作用是返回Servlet的信息,基本没用。

public class AServlet implements Servlet {
	@Override
	public void destroy() {

	}

	@Override
	public ServletConfig getServletConfig() {
		return null;
	}

	@Override
	public String getServletInfo() {
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {

	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {

	}
}
GenericServlet类

Servlet接口在使用时不够便利,将一些每次都要写的固定操作写到GenericServlet类,以供调用。

	//在Servlet接口的基础上增加了一个私有属性
	private ServletConfig config;
	
	//接收servletConfig,即Servlet的配置信息
	//添加了init()方法,是为了继承GenericServlet时可以再次覆写init()
	public void init(ServletConfig config) throws ServletException {
		this.config = config;
		this.init();
	}
	public void init(){
	
	}
	
	//此时配置数据已经被赋值,可以返回
	public ServletConfig getServletConfig() {
		return this.config;
	}
HttpServlet类

HttpServlet在GenericServlet类的基础上,再次对Servlet进行了覆写,将参数ServletRequest arg0, ServletResponse arg1进行强制转换成HttpServletRequest arg0,HttpServletResponse arg1,并且根据请求类型调用doGet(),doPost()方法,service()不再需要覆写。

大体代码如下:

public class CServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public CServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
		Integer number = (Integer)this.getServletContext().getAttribute("访问量");
		System.out.println(number);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}
Servlet不是线程安全的

一个类型的Servlet只有一个对象,同一时间内一个Servlert可能会处理多个请求,一存一取间就会产生错误。

解决之道:

  • 不定义成员变量,,只定义局部变量
  • 定义无状态的成员变量
  • 定义只有读状态的成员变量
何时创建Servlet

当标签load-on-startup内的值大于负数时,Tomcat一启动就创建该Servlet。
注意::值越小越早创建。

  <servlet>
  	<servlet-name>xxx</servlet-name>
  	<servlet-class>Com.AServlet</servlet-class>
  	<load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>xxx</servlet-name>
  	<url-pattern>/AServlet</url-pattern>
  </servlet-mapping>

当没有标签load-on-startup,默认情况下Tomcat在第一次接收到该Servlet的请求时创建该Servlet

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值