您的位置:首页 > 编程语言 > Java开发

Spring源码阅读(八)—SpringMVC基础Servlet

2017-09-02 13:56 465 查看
个人主页:tuzhenyu’s page

原文地址:Spring源码阅读(八)—SpringMVC基础Servlet

(1)Servlet定义

Servlet是运行在应用服务器上的程序,是Web浏览器和服务器数据库或者应用程序的中间层,主要用来连接HTTP请求和后端服务程序;

Java Servlet 是运行在 Web 服务器上的 Java 类,Servlet 可以使用 javax.servlet 和 javax.servlet.http 包来创建。

Servlet应用程序需要运行在Servlet容器内,如Tomcat,Jetty等

(2)Servlet的作用

接收客户端(浏览器)发送的HTTP请求,一般包含显式数据如表单数据,隐式数据如cookies等

处理接收到的数据并生成结果

发送结果数据到客户端(浏览器),如文本文件HTML,XML等

(3)Servlet的创建

定义Servlet类继承HttpServlet父类重写doPost()方法和doGet()方法

public class FirstServlet extends javax.servlet.http.HttpServlet {

public void init() throws ServletException {
str = "<h1>hello world!</h1>";
}
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

}

protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
response.setContentType("text/html");
PrintWriter pw = response.getWriter();
pw.write("<h1> hello first servlet!</h1>");
}

public void destroy() {}
}


在web.xml配置文件中注册servlet

<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>cn.tzy.FirstServlet</servlet-class>
</servlet>


在web.xml配置文件中配置servlet的路由URL

<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>


(4)Servlet的生命周期

1.初始化:调用Servlet类的init()方法

init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。

init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期

浏览器请求进入Tomacat,会首先检查对应的Servlet实例是否存在,如果存在则直接调用对应实例的service()方法;如果不存在则会首先装载/tomcat/webapps/文件下的对应的Servlet
d0bb
类并创建类实例;然后会调用实例的init()方法初始化ServletConfig具体的配置。

public void init() throws ServletException {
// 初始化代码...
}


2.具体服务方法:调用Servlet类的service()方法

每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

service() 方法是由容器调用,实现一个Servlet类不需要改写service() 方法,只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。

public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}


public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}


3.关闭:调用Servlet类的destroy()方法

destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收.

public void destroy() {
// 终止化代码...
}


(5)Servlet执行流程

根据浏览器请求URL访问/tomcat/webapps文件夹下的Servlet工程文件夹

http://localhost:8080/helloapp/hello


http://localhost:8080/helloapp/hello,其中localhost是服务器主机名,也可以是IP地址127.0.0.1;8080是tomcat服务器的端口号;helloapp是web工程的上下文地址ContexRoot(一般情况下与web工程名一致);

根据URL定位到具体工程文件夹下的Context容器中的web,xml文件,搜索servlet-mapping标签找出URL对应的Servlet名字

<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>


根据Setvlet名称定位具体的Servlet类,查看是否存在该类实例,如果存在则直接调用,如果不存在则创建并初始化

<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>org.javathinker.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>    //tomcat容器启动时自动加载初始化,数字越小加载优先级越高
</servlet>


根据具体的请求类型定位Servlet类中具体的doGet()或者doPost()方法

(6)Listener监听器的分类

1. ServletContext对象的监听器

ServletContextListener

ServletContextListener主要监听ServletContext对象,一个web工程一般只有一个ServletContextListener监听器主要有两个方法:

contextInitialized()当Context上下文创建时后触发该方法,可以访问context-param标签数据用于初始化Context时数据库的连接等;

contextDestroyed()当Context上下文销毁时后触发该方法,用于数据库的关闭等

ServletContextAttributeListener

主要用来监听ServletContext属性的删除或者增加事件

主要有三个方法:attributeAdded() attributeRemoved() attributeReplace()方法

HttpSession对象的监听器

2. HttpSessionListener会话监听器

用户打开浏览器第一次访问该web工程,就会分配一个session,用户可以在session中保存一些信息;关闭浏览器一段时间session会自动销毁;

HttpSessionListener主要监听HttpSession对象,一个web工程可以有多个HttpSession监听器,主要有两个方法:

sessionCreated():创建session对象,一般是一个ip浏览器第一次访问web工程时会创建一个session对象

sessionDestroyed():销毁session对象,浏览器关闭,session超时,Context关闭都会触发session的关闭;

HttpSessionAttributeListener

主要用来监听HttpSession属性的删除或者增加事件

主要有三个方法:attributeAdded() attributeRemoved() attributeReplace()方法

3.ServletRequest对象的监听器

ServletRequestListener

ServletRequestListener主要监听ServletRequest对象,一个web工程可以有多个ServletRequest监听器,主要有两个方法:

RequestInitialized():创建ServletRequest对象,用户每一次访问web工程时都会创建一个ServletRequest对象,用于获取请求ServletRequest参数

RequestDestroyed():销毁ServletRequest对象,访问结束会触发ServletRequest的关闭;

ServletRequestAttributeListener

主要用来监听ServletRequest属性的删除或者增加事件

主要有三个方法:attributeAdded() attributeRemoved() attributeReplace()方法

(7)Listener监听器的创建和使用

创建监听器类继承ServletContextListener,ServletRequestListener,HttpSessionListen类

public class ListenerTest implements HttpSessionListener, ServletContextListener, ServletRequestListener {

// 创建 session
public void sessionCreated(HttpSessionEvent se) {
HttpSession session = se.getSession();
System.out.println("新创建一个session, ID为: " + session.getId());
}

// 销毁 session
public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession();
System.out.println("销毁一个session, ID为: " + session.getId());
}

// 加载 context
public void contextInitialized(ServletContextEvent sce) {
ServletContext servletContext = sce.getServletContext();
System.out.println("即将启动" + servletContext.getContextPath());
}

// 卸载 context
public void contextDestroyed(ServletContextEvent sce) {
ServletContext servletContext = sce.getServletContext();
System.out.println("即将关闭" + servletContext.getContextPath());
}

// 创建 request
public void requestInitialized(ServletRequestEvent sre) {

HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();

String uri = request.getRequestURI();
uri = request.getQueryString() == null ? uri : (uri + "?" + request.getQueryString());

request.setAttribute("dateCreated", System.currentTimeMillis());

System.out.println("IP " + request.getRemoteAddr() + " 请求 " + uri);
}

// 销毁 request
public void requestDestroyed(ServletRequestEvent sre) {

HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();

long time = System.currentTimeMillis() - (Long) request.getAttribute("dateCreated");

System.out.println(request.getRemoteAddr() + "请求处理结束, 用时" + time + "毫秒. ");
}

}


在web.xml文件中注册监听器

<listener>
<listener-class>cn.tzy.ListenerTest</listener-class>
</listener>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: