JAVAWEB-2

servlet得运行原理

 

servlet属于单例模式。该类只会被创建一次对象。始终调用构造函数一次。

减少创建servlet频率,减少内存的使用。

servlet得体系结构

 

GenericServlet

编写Servlet需要通过实现Servlet接口来编写Servlet,但是我们每次都必须为Servlet中的所有方法都提供实现,还需要将ServletConfig对象保存到一个类级别的变量中,GenericServlet抽象类就是为了为我们省略一些模板代码,实现了Servlet和ServletConfig。

继承体系讲解

1.service() 函数的调用

问题:这是一个重写的函数,我们并没有调用,但是service被调用了,谁调用的?

解决:tomcat帮我们调用的。先去缓存池中找servlet对象,如果找到了,直接使用这个对象调用service()方法,如果没有找到,通过java反射 Class.forName().Instance();创建一个servlet对象放入缓存池中,在调service()。

CLass.forName("com.qy143.servlet.PeopleServlet");

2.servlet 接口

此时我们已经知道,tomcat会默认创建类的对象并且调用这个类的service函数

问题1:万一这个类没有实现servlet接口还能调用码?直接报错

解决方案: tomcat要求程序员配置的servlet类 ,必须实现一个接口 叫做Servlet,如果不实现 则报错。

问题2 为什么我们自己写的servlet不去直接实现Servlet接口,此时tomcat为了定制规则,让程序员自己的类必须实现Servlet接口,但是有一个新问题出现了。这个Servlet接口定制了5个函数,其中只有service函数比较有用,剩下的四个基本上用不到。怎么解决?

解决:官方创建了一个新的类叫做 GenericServlet 实现servlet接口,我们自己写的servlet类只需要继承GenericServlet类就可以了。

问题3:自己写的类为什么不继承GenericServlet而是要继承 HttpServlet 类呢?

 

 

解决:

原因①:

​ 因为我们的请求和响应都是基于HTTP的,而GenericServlet中的参数是ServletRequest和ServletResponse,此时有一些专属于HttpServlet的方法没办法调用 ,所以我们需要将ServletRequest转化成HttpServletRequest,将ServletResponse转换成HttpServletResponse,

所以需要继承HttpServlet。

原因②:

​ 我们的请求方式一般常用两种,get/post,但是现在用的是service,在service中会根据你请求的方式进行请求的分发,选择合适的方法。

 

总结:什么时候用service(),什么时候用doGet()/doPost(),

如果涉及到get 和post那么你就用 doGet()/doPost()

如果涉及不到get和post()就用service();

servlet得生命周期

 不同阶段执行不同的方法。init ---service----destroy

package com.ykq.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//默认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("销毁");
    }
}

 小结:

1. servlet运行原理:
2. servlet得体系结构!
3. servlet得生命周期。

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");设置响应的内容类型

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值