servlet知识要点

内容概要:

1. servlet的生命周期

servlet生命周期

如果servlet实现了javax.servlet.SingleThreadModel,容器会为每个请求创建一个实例
每次来一个请求时,容器就会分配一个线程,然后这个新线程调用service()—> doGet()和doPost()…因此,每一次GET,POST都运行在单独的线程中。
当service()结束,线程也就结束,或者是放回到线程池中。

ServletOutputStream和PrintWriter : ServletOutputStream用于输出字节,而PrintWriter用于输出字符。

ServletContext和ServletConfig :

  • ServletContext针对整个web应用,但是如果应用是分布式的,那么每个JVM有一个单独的ServletContext。容器会为这个web应用创建一个新的ServletContext,所有的Servlet可以共享这个context
  • ServletConfig只针对单个servlet

属性API:

  • 上下文ServletContext:上下文属性ServletContextAttribute不是线程安全的
  • 请求ServletRequest:请求属性是线程安全的
  • 会话HttpSession

RequestDispatcher:

  • request.getRequestDispatcher(URL): 这里可以用相对路径,也可是用绝对路径
  • getServletContext().getRequestDispatcher(URL): 这里必须是绝对路径
  • RequestDispatcher.forward()
  • RequestDispatcher.include()

session(会话)

  • 生成会话ID,创建新的cookie对象,把会话ID放到cookie中,把cookied设置为响应的一部分等等工作都将由容器负责。
  • 你只需要告诉容器你想要创建或使用一个session

cookie

JSP

jsp生成servlet后的.class和.java文件位置:apache-tomcat/work目录下面

  • /usr/local/apache-tomcat/work/Catalina/localhost/first.servlet/org/apache/jsp
    1. JSP的生命周期
  • .jsp文件部署之后容器首先不做处理(例如MyJSP.jsp)
  • 客户点击一个.jsp的链接,容器尝试将.jsp文件转换为servlet类的.java代码:MyJSP_jsp.java
  • 容器把这个servlet.java源文件编译为.class文件MyJSP_jsp.class
  • 容器加载这个新生成的servlet类
  • 容器实例化servlet,运行jspInit(),对象现在成为一个完整的servlet
  • 每次来一个请求,容器就创建一个新线程来处理客户请求, servlet的_jspService()方法运行

初始化JSP

WAR文件: WebArchive,WAR文件其实就是一个JAR(Java Archive)文件

web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>Servlet Web Application</display-name>

<!-- 设置servlet及其映射 -->
<servlet>
<servlet-name>beerSelect</servlet-name>
<servlet-class>com.head.first.servlet.BeerSelect</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>beerSelect</servlet-name>
<url-pattern>/selection</url-pattern>
</servlet-mapping>


<servlet>
<servlet-name>download</servlet-name>
<servlet-class>com.head.first.servlet.DownloadServlet</servlet-class>
<!-- ServletConfig参数 -->
<init-param>
<param-name>email</param-name>
<param-value>24zhangjie@gmail.com</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>download</servlet-name>
<url-pattern>/down</url-pattern>
</servlet-mapping>


<servlet>
<servlet-name>liste</servlet-name>
<servlet-class>com.head.first.servlet.listener.ListenerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>liste</servlet-name>
<url-pattern>/listen</url-pattern>
</servlet-mapping>

<!-- 设置jsp servlet -->
<servlet>
<servlet-name>res</servlet-name>
<jsp-file>/jsps/jspServlet.jsp</jsp-file>
<init-param>
<param-name>username</param-name>
<param-value>KobeBryant</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>res</servlet-name>
<url-pattern>/jspServlet</url-pattern>
</servlet-mapping>



<!-- 设置整个web应用的context参数 -->
<context-param>
<param-name>email</param-name>
<param-value>24zhangjie@gmail.com</param-value>
</context-param>
<context-param>
<param-name>breed</param-name>
<param-value>Dog'sBreed</param-value>
</context-param>


<!-- 设置servletContextListener -->
<listener>
<listener-class>
com.head.first.servlet.listener.MyServletContextListener
</listener-class>
</listener>


<!-- 安全 -->

<security-role>
<role-name>Admin</role-name>
</security-role>
<security-role>
<role-name>Member</role-name>
</security-role>
<security-role>
<role-name>Guest</role-name>
</security-role>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/log/login.html</form-login-page>
<form-error-page>/log/loginerr.html</form-error-page>
</form-login-config>
</login-config>
<security-constraint>
<web-resource-collection>
<web-resource-name>beer</web-resource-name>
<url-pattern>/selection</url-pattern>
<url-pattern>/listen</url-pattern>
<url-pattern>/down</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>Admin</role-name>
<role-name>Member</role-name>
<role-name>Guest</role-name>
</auth-constraint>
<!-- user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint -->
</security-constraint>

</web-app>