-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnote.txt
256 lines (210 loc) · 10.2 KB
/
note.txt
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
MappingMatch
1.CONTEXT_ROOT
环境路径
{{host}}:{{port}}/{{context_path}}
{{host}}:{{port}}/{{context_path}}/
This is used when the mapping was achieved with an exact match to the application's context root.
2.DEFAULT
默认
找不到合适的 URI 模式时,使用默认模式
{{host}}:{{port}}/{{context_path}}/error-path
This is used when the mapping was achieved with an exact match to the default servlet of the application, the '/' character.
3.EXACT
完全匹配,严格对应
This is used when the mapping was achieved with an exact match to the incoming request.
4.EXTENSION
扩展映射
This is used when the mapping was achieved using an extension, such as "*.xhtml"
5.PATH
路径映射
This is used when the mapping was achieved using a path, such as "/faces/*"
jsp 元素
1.指示元素 Directive <%@ 指示类型 [属性="值"] %>
常用指示类型
page 指示类型告知容器如何转译目前的 JSP 网页
include 指示类型告知容器,将指定的 JSP 页面包括进来转译
taglib 指示类型告知容器如何转译这个页面中的标签库(Tag Library)
2.声明元素 Declaration <%! 类成员声明或方法声明 %>
3.Srciptlet 元素 <% Java语句 %>
<% int i = 1; %>
4.表达式元素 <%= Java 表达式%>
<%= "text" %>
5.注释元素 <%-- JSP 注释 -->
标准标签
<jsp:forward>
<jsp:include>
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
JSP 的 XML 格式标签
<jsp:directive.page import="java.util.*"/> 指示元素 Directive <%@ 指示类型 [属性="值"] %>
<jsp:declaration> String name; </jsp:declaration> 声明元素 Declaration <%! 类成员声明或方法声明 %>
<jsp:scriptlet> name = "test-name"; </jsp:scriptlet> Srciptlet 元素 <% Java语句 %>
<jsp:expression> name </jsp:expression> 表达式元素 <%= Java 表达式%>
<jsp:text> 网页文字 </jsp:text> 网页文字
tips:
一:如果在属性范围内找到 user, 会新建一个对象并设置其属性值;如果可以找到对象,就直接使用,不设置其属性值
<jsp:useBean id="user" class="cc.openhome.User" scope="session">
<jsp:setProperty name="user" property="*"/>
</jsp:userBean>
二:不管在属性范围内找到 user,还是新建一个 user,都会设置其属性值
<jsp:useBean id="user" class="cc.openhome.User" scope="session"/>
<jsp:setProperty name="user" property="*"/>
JSP 隐式对象
1.out JspWriter
2.request HttpServletRequest
3.response HttpServletResponse
4.config ServletConfig
5.application ServletContext
6.session httpSession
7.pageContext PageContext 提供 JSP 页面资源的封装,并可设置页面范围属性
8.exception Throwable 代表由其他 JSP 页面抛出的异常对象,只会出现于 JSP 错误页面(isErrorPage 设置为 true 的 JSP 页面)
9.page this
EL 隐式对象
1.pageContext
2.pageScope
3.requestScope
4.sessionScope
5.applicationScope
6.param
7.paramValues
8.header
9.headerValues
10.cookie
11.initParam
JSTL 标签库五大类
1.核心标签库:提供条件判断、属性访问、URI 处理及错误处理等标签
2.I18N 兼容格式标签库:提供数字、日期等的格式化功能,以及区域(Local)、信息、编码处理等国际化功能的标签
3.SQL 标签库:提供基本的数据库查询、更新、设置数据源(DataSource)等功能的标签
4.XML 标签库:提供 XML 解析、流程控制、转换等功能的标签
5.函数标签库:提供常用字符处理的自定义 EL 函数标签库
JSP 文件最后还是会被容器转译为 Servlet 源代码,编译为 .class 文件,加载 .class 文件,生成 Servlet 对象
JSP 指示(Driective)元素的主要目的在于指示容器将 JSP 转译为 Servlet 源代码时,必须遵守的一些信息
<%@ 指示类型 [属性="值"] %> import contentType charset pageEncoding include
JSP 转移后的 Servlet 应该包含哪些类成员、哪种方法声明,使用声明(Declaration)元素
<%! 类成员声明或方法声明 %>
Scriptlet 元素 <% %> 之间的内容将被转译为 Servlet 源代码 _jspService() 方法中的内容
在表达式(Expression)元素中编写 Java 表达式的运算结果将直接输出为网页的一部分
<%= "text" %>
为减少使用 Scriptlet, JSP 规范提供了标准标签(Standard Tag),标准标签都以<jsp:> 作为前缀
<jsp:forward> <jsp:include> <jsp:useBean> <jsp:setProperty> <jsp:getProperty>
后来提出的 JSTL(JavaServer Pages Standard Tag Library) 与表达式语言 (Expression Language) 在许多功能上可以取代原有的标准标签
可以将业务逻辑编写在 JavaBean 中,然后搭配 <jsp:userBean> <jsp:setProperty> <jsp:getProperty> 来取得、生成 JavaBean 对象,设置或取得 JavaBean 的值,这样有助于减少页面上的 Scriptlet 的分量
对于 JSP 中一些简单的属性、请求参数、标头与 Cookie 等信息的取得,一些简单的运算或判断,可以使用表达式语言 (EL) 来处理,也可以将一些常用的公用函数编写为 EL 函数
减少网页上的 Scriptlet ${param.name} ${1 + 1}
在 JavaEE 7 之后,发布了 Expression Language 3.0, 成为一个独立的规格(JSR 341)
在 EL 3.0 之后,允许指定变量
${a = "10"} ${b = "20"}
被指定值之后, EL 3.0 会将 a、b 的值输出至页面
相当与
<% pageContext.setAttribute("a","10")> <%= pageContext.getAttribute("a")%>
<% pageContext.setAttribute("b","20")> <%= pageContext.getAttribute("b")%>
可以直接调用静态方法、静态成员 ${Integer.parseInt("123")} ${Math.PI}
使用 JSP 标准标签、EL 表达,仍不能表达页面显示逻辑,还是需要使用 Scriptlet 编写 Java 代码
例如需要按照某个条件来决定显示某个网页片段,或者需要使用循环来显示表格内容
JSTL 提供跟页面显示相关的逻辑判断标签
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:if test="${ EL表达式 }"> text </c:if>
<c:choose>
<c:when test=" EL表达式1 "> text1 </c:when>
<c:when test=" EL表达式2 "> text2 </c:when>
<c:otherwise> text </c:otherwise>
</c:choose>
items 属性值可以是 数组、Collection、Iterator、Enumeration、Map、字符串
<c:forEach var="message" items="${messageService.messages}">
<tr>
<td> ${message.name} </td>
<td> ${message.text} </td>
</tr>
</c:forEach>
异常
<c:catch var="error">
...
</c:catch>
<c:if test="${error != null}">
${error}
</c:if>
<c:import> 标签可以视作<jsp:include>加强版,可以导非目前 Web 应用程序的网页,可以指定导入网页的 charEncoding
<c:redirect url="test.jsp"> 重定向
<c:url value="test.jsp"> 相当与 response 的 encodeURL() 方法,在用户关闭 Cookie 功能时,自动用 SessionID 作 URI 重写
JSP 的 <jsp:setProperty> 功能有限,只能设置 JavaBean 的属性,如果想要在 page、request、session、application 等范围内设置属性,或者想要设置 Map 对象的键与值可以使用 <c:set> 标签
<c:set var="key" value="value" scope="session"/>
相当于 <% session.setAttribute("key","value"); %>
也可以用 EL 表达式 <c:set var="key" value="${ EL 表达式}" scope="session"/>
<c:set> 也可以设置 JavaBean 的属性或 Map 对象的键值 <c:set target="${user}" property="name" value="${param.name}" />
<c:remove var="key" scope="session">
<c:out> 输出指定的文本 <c:out value="${param.message}">
为什么不直接用 EL 表达式写 ${param.message} 而要用 <c:out>
param.message 中可能有 HTML 语句
<c:out> 会自动将角括号、单引号、双引号等字符用代替字符取代。这个功能是由 <c:out> 的 escapeXml 属性来控制,默认是 true
EL 表达式运算结果是 null 时,不会显示任何值,<c:out> 可以设置默认值 <c:out value="${param.message}" default="default_message">
servlet dispatcher
一.response header:
1.include
在被包含的 servlet 中设置 response header 无效
在原 servlet 中设置 response header 有效
2.forward
在 forward 前后两个 servlet 中设置 response header 都有效
二.servlet path
1.include
include 前后两个 servlet path 一致
想要在被包含的 servlet 中取得本 servlet 的 servlet path 需要用 httpRequest.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH)
2.forward
forward 前后两个 servlet path 不一致
想要在转发后的 servlet 中取得转发前的 servlet 的 servlet path 需要用 httpRequest.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH)
三.characterEncoding
1.include
在前后两个 servlet 中设置都有效,会互相传递
2.forward
在前后两个 servlet 中设置都有效,会互相传递
四.param
1.include
被包含的 servlet 可以获取到原 servlet 的参数和本 servlet 的参数
原 servlet 获取不到 被包含的 servlet 参数
2.forward
转发后的 servlet 可以获取到转发前的 servlet 参数和本 servlet 的参数
转发前的 servlet 获取不到转发后的 servlet 参数
五.attribute
1.include
在前后两个 servlet 中设置都有效,会互相传递
2.forward
在前后两个 servlet 中设置都有效,会互相传递
Server Push
HTTP2.0 支持服务器推送(Server Push)
在一次请求中,允许服务器主动推送必要的 CSS、JavaScript、图片等资源到浏览器
httpServletRequest.newPushBuilder()
异步
一.AsyncContext
AsyncContext asyncContext = httpRequest.startAsync();
CompletableFuture.runAsync(() -> {
asyncContext.complete();
});
二.Long Polling
javaScript: 递归发送请求
java:
httpServletRequest.startAsync()
List<AsyncContext> foreach
三.Server-Sent Event
javaScript:EventSource
ContentType 必须 text/event-stream
CharacterEncoding 必须 UTF_8
java:
resp.setContentType("text/event-stream");
resp.setHeader("Cache-Control", "no-cache");
resp.setCharacterEncoding(StandardCharsets.UTF_8.name());
httpServletRequest.startAsync()
List<AsyncContext> foreach{
PrintWriter writer = asyncContext.getResponse().getWriter();
// 响应必须包含 data:
// 必须以 \n\n 结尾
writer.printf("data:%s\n\n", Math.random());
}
四.异步读写
WriteListener
AsyncContext asyncContext = httpServletRequest.startAsync();
ServletOutputStream outputStream = httpServletResponse.getOutputStream();
outputStream.setWriteListener(new WriteListener() {});
ReadListener
AsyncContext asyncContext = httpServletRequest.startAsync();
ServletInputStream servletInputStream = httpServletRequest.getInputStream();
servletInputStream.setReadListener(new ReadListener() {});