Servlet继承体系
- servlet运行原理
servlet属于单例模式,该类只会被创建一次对象,始终调用构造函数一次,可以减少创建servlet频率,减少内存得使用
问题:
1.1.我i们子定义的Servlet的为很么不能直接实现servlet接口?
因为servlet接口中有五个抽象方法,我们的servlet必须重写这五个方法,而我们实际想要的servlce方法,所以GeericServlet重写了四个方法,只浏览一个抽象的service方法。
2.servlet体系结构
1.2.为什么你子定义的servlet不直接继承GenericServlet?
原因:1.因为我们得请求和响应都是基于Http的,而GenericServlet中的参数是ServletRequest和ServletResponse,此时有一些专属于HttpServlet的方法没办法调用,所有我们需要将ServletRequest转化成HttpServletRequest,将ServletResponse转化成HttpServletResponse.所以需要继承HttpServlet.
2.我们的请求方式一般常用两种,get/post,但是现在用的是service,在service中会根据你请求的方式进行请求的分发,选择合适的方法。
总结
什么时候用Service(),什么时候用doGet()/doPost()?
如果涉及到get和post的就用doGet()/doPost()
如果涉及不到get和post()就用service();
3.servlet的生命周期----面试题
不同阶段执行不同的方法。int–service—destory
/默认servlet什么时候创建,调用时创建 ---开启tomcat服务器自动创建servlet
//loadOnStartup =1 值越小优先级越高。 值得范围0-intmax
@WebServlet(name="LifeServlet",urlPatterns = "/lifeServlet",loadOnStartup =0)
public class LifeServlet extends HttpServlet {
//构造函数只会被调用一次
public LifeServlet(){
System.out.println("创建Servlet");
}
//初始化只会被调用一次
@Override
public void init() throws ServletException {
System.out.println("初始化方法");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("执行的代码");
}
//服务器关闭后会销毁servlet
@Override
public void destroy() {
System.out.println("销毁");
}
}
4.service中的两个参数
request:接口封装了客户请求信息,如客户请求方式、参数、客户使用的协议、以及发出请求的远程主机信息等,其主要方法
request.getMethod();获取请求方式 request.getParameter(参数名);获取请求参数的值 request.getParameterValues(参数名);根据参数名获取一组值 request.setCharacterEncoding("utf-8"); //设置请求的编码方式
Response对象:接口封装了服务响应信息,主要用来输出信息到客户端浏览器,其主要方法:
response.sendRedirect(url);//重定向
response.getWriter();//获取输出对象
response.setContentType("text/html;charset=utf-8");设置响应的内容类型