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(); } }
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容器时的监听