SherryLang / javalearning

while(Java){ learn !! }
3 stars 1 forks source link

基础4:J2EE基础(servlet、JSP、web容器) #4

Open SherryLang opened 7 years ago

SherryLang commented 7 years ago

servlet

定义

Servlet 是服务 HTTP 请求并实现 javax.servlet.Servlet 接口的 Java 类。Web 应用程序开发人员通常编写 Servlet 来扩展 javax.servlet.http.HttpServlet,并实现 Servlet 接口的抽象类专门用来处理 HTTP 请求。

servlet生命周期

servlet生命周期 Servlet生命周期的三个核心方法分别是 init() , service() 和 destroy()。每个Servlet都会实现这些方法,并且在特定的运行时间调用它们。 最简单的示例:

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// 扩展 HttpServlet 类
public class HelloWorld extends HttpServlet {

  private String message;

  public void init() throws ServletException
  {
      // 执行必需的初始化
      message = "Hello World";
  }

  public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
  {
      // 设置响应内容类型
      response.setContentType("text/html");

      // 实际的逻辑是在这里
      PrintWriter out = response.getWriter();
      out.println("<h1>" + message + "</h1>");
  }

  public void destroy()
  {
      // 什么也不做
  }
}

另外,为了在web容器里注册Servlet,要为应用建一个web.xml入口文件。

<web-app>      
    <servlet>
        <servlet-name>HelloWorld</servlet-name>
        <servlet-class>HelloWorld</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>
        <url-pattern>/HelloWorld</url-pattern>
    </servlet-mapping>
</web-app>  

推荐阅读:Java Servlet完全教程

servlet的4个作用域、9个内置对象和4个作用域关系

servlet的作用域 具体在王者归来这本书上写得很清楚。

JSP

定义

Java Server Pages,中文名叫java服务器页面,本质上是一个简化的Servlet设计。

编译运行的过程

JSP编译运行

*web容器:如tomcat

在执行jsp网页时,通常分为两个时期:编译时期和请求时期。编译时期jsp页面被翻译成Servlet类,然后编译成Class文件;用户请求时期,servlet类被执行,生成HTML响应至客户端。

1. 请求

用户请求jsp页面

2. 预处理

判断jsp是否编译过。如果而没有编译过,jsp引擎会将jsp文件中的脚本代码(HTML)和代码片段(Java代码)全部转换为java代码,转换过程非常直观:对于HTML文本只需要用简单的out.println方法包裹,对于java脚本只做保留或简单的处理。

3. 编译阶段

预处理阶段把jsp文件解析为java代码,编译阶段jsp引擎把java代码编译成servlet类文件(.class),对于Tomcat,生成的class文件默认情况下存放在/work目录下。

4. 响应阶段

编译后的class对象被加载到容器中,并根据用户的请求生成HTML格式的响应页面返回给客户端。

关于 jsp和servlet的执行速度

jsp的转译和请求都在在第一次访问时进行的,所以用户在第一次访问jsp页面时响应时间会比较长。在之后的请求中,这些工作已经完成,时间延长问题不存在了。在处理后续的访问时jsp和servlet的执行速度是一样的。

web.xml文件

参考:web.xml文件详解

作业:web容器的加载顺序图

web容器加载顺序:

  1. 启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取两个结点。
  2. 紧急着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。
  3. 容器将转换为键值对,并交给servletContext。
  4. 容器创建中的类实例,创建监听器。
  5. 容器创建中的类实例,创建过滤器。

最终得出的结论是:ServletContext-> listener ->filter -> servlet