SpringMVC(一)

Servlet

在外网中,我们通过url访问资源有三个步骤完成:

  • 1.接收请求  -------统一解析  ServletRequest
  • 2.处理请求  ------写servlet自己处理
  • 3.响应请求 --------统一的响应 ServletResponse

作为Java后台,需要web服务器,它将某个主机上的资源映射为一个URL供外界访问,完成接收和响应请求。而Servlet正是完成这个功能的。

servlet容器:存放着servlet对象(由程序员编程提供),处理请求。

tomcat是一个web服务器也是一个Servlet容器,它处理好1/3步骤

Servlet有两种意思:

广义上是:基于Java技术的Web组件,被容器托管,用于生成动态内容。

再详细点说,Servlet是JavaEE组件中的 -> Web组件的 -> 一种。
(其它两种是JavaServer Faces和JavaServer Page)

狭义上说:是JavaEE API中的一个interface,javax.servlet.Servlet;

Servlet 容器/引擎:

Servlet容器也可以叫引擎,Container/Engine,用于执行Servlet。

容器是以内嵌或者附加组件的形式存在于Web服务器或者应用服务器中的。

容器本身(不依赖Web服务器)就提供了基于请求/响应发送模型的网络服务,解码基于MIME的请求,格式化基于MIME的响应。

所有容器必须实现HTTP协议的请求/响应模型。其它协议不强求,如HTTPS。

Servlet接口定义

 

 其中主要的方法:init (初始化),service(处理请求),destroy(销毁),关乎Servlet的生命周期。还有两个获取Servlet主要信息的对象。但是我们自己直接实现这个接口来处理请求显然要处理很多东西,比如:ServletRequest,ServletResponse,ServletConfit都怎么生成,怎么解析的问题。

GenetateServlet

改良版的servlet,抽象类,如果继承这个类之后,会方便很多,它把ServletConfig从局部变量转成全局变量。

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    private static final long serialVersionUID = 1L;
    private transient ServletConfig config;

    public GenericServlet() {
    }

    //并不是销毁servlet的方法,而是销毁servlet前一定会调用的方法。默认空实现,可以借此关闭一些资源
    public void destroy() {
    }

    public String getInitParameter(String name) {
        return this.getServletConfig().getInitParameter(name);
    }

    public Enumeration<String> getInitParameterNames() {
        return this.getServletConfig().getInitParameterNames();
    }

    public ServletConfig getServletConfig() {
        return this.config;//初始化时已被赋值
    }

    public ServletContext getServletContext() {
        //通过ServletConfig获取ServletContext
        return this.getServletConfig().getServletContext();
    }

    public String getServletInfo() {
        return "";
    }

    public void init(ServletConfig config) throws ServletException {
        this.config = config;//提升ServletConfig作用域,由局部变量变成全局变量
        this.init();//提供给子类覆盖
    }

    public void init() throws ServletException {
    }

    public void log(String message) {
        this.getServletContext().log(this.getServletName() + ": " + message);
    }

    public void log(String message, Throwable t) {
        this.getServletContext().log(this.getServletName() + ": " + message, t);
    }

    //空实现
    public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    public String getServletName() {
        return this.config.getServletName();
    }
}
View Code

 

HttpServlet

GenericServlet的升级版,也是抽象的,针对http请求所定制,在GenericServlet的基础上增加了service方法的实现,完成请求方法的判断

抽象类,用来被子类继承,得到匹配http请求的处理,子类必须重写以下方法中的一个

doGet,doPost,doPut,doDelete 未重写会报错(400,405)

service方法不可以重写,因为里面对请求方式做出了判断。

一个类被声明为抽象的,一般有两个原因:

  • 有抽象方法需要被实现
  • 没有抽象方法,但是不希望被实例化

自己在项目中使用Servlet一般就继承HttpServlet就行了,而且里面已经把ServletRequest转成HttpServletRequest了。


 

ServletContext

servlet上下文,代表web.xml文件,其实就是一个map,服务器会为每个应用创建一个servletContext对象:

  • 创建是在服务器启动时完成
  • 销毁是在服务器关闭时完成

javaWeb中的四个域对象:都可以看做是map,都有getAttribute()/setAttribute()方法。

  • ServletContext域(Servlet间共享数据)
  • Session域(一次会话间共享数据,也可以理解为多次请求间共享数据)
  • Request域(同一次请求共享数据)
  • Page域(JSP页面内共享数据)

 

servletConfig对象持有ServletContext的引用,Session域和Request域也可以得到ServletContext

五种方法获取:

* ServletConfig#getServletContext();

* GenericServlet#getServletContext();

* HttpSession#getServletContext();

* HttpServletRequest#getServletContext();

* ServletContextEvent#getServletContext();//创建ioc容器时的监听

 

 

posted @ 2021-05-13 15:16  蒙恬括  阅读(43)  评论(0编辑  收藏  举报