读书笔记:Servlet JSP和Spring MVC初学指南
Servlet JSP和Spring MVC初学指南,作者: 克尼亚万 (Budi Kurniawan) / 戴克 (Paul Deck)
目录
内容提要
Servlet和JSP是开发Java Web应用程序的两种基本技术。Spring MVC是Spring框架中用于Web应用快速开发的一个模块, 是当今最流行的Web开发框架之一。
前言
Servlet/JSP应用架构
Web用户通过Web浏览器来访问Servlet应用。通常,Web浏览器又叫Web客户端。
Web服务器和Web客户端问通过HTTP协议通信,因此Web服务器也叫HTTP服务器。
Servlet和JSP只是Java企业版中众多技术中的两个,其他Java EE技术还有Java消息服务,企业Java对象、JavaServer Faces以及Java持久化等,完整的Java EE技术列表可以访问如下地址:
https://www.oracle.com/java/technologies/java-ee-8.html
我们可以将一个 Servlet/JSP 应用部署到一个Java EE容器上,但一个Servet/JSP容器就已经满足需要了,并且更加轻量。
HTTP
HTTP 1.1版本的RFC编号是2616,下载地址
为 https://www.w3.org/Protocols/HTTP/1.1/rfc2616.pdf
2011年,标准化组织IETF发布了WebSocket协议,即RFC 6455规范。该协议允许一个HTTP连接升级为WebSocket连接,支持双向通信,这就使得服务端可以通过WebSocket协议主动发起同客户端的会话通信。
通常,HTTP的URL格式如下
protocol://[host.]domain[:port][/context][/resource] [?query string]
另外,example.com 或者example.org无法被注册,因为它们被保留作为各类文档手册举例使用。
localhost 作为一个保留关键字,用于指向本机。
URL中的context部分用来代表应用名称,该部分也是可选的。一台 Web服务器可以运行多个上下文(应用),其中一个可以配置为默认上下文,对于访问默认上下文中的资源,可以跳过context部分。
最后,一个context 可以有一个或多个默认资源(通常为index.html, index.htm 或者default.htm)。一个没有带资源名称的URL通常指向默认资源。当存在多个默认资源时,其中最高优先级的资源将被返回给客户端。
在资源名之后可以有一个或多个查询语句或者路径参数。查询语句是一个Key/Value组,多个查询语句间用“&”符号分隔。路径参数类似于查询语句,但只有value部分,多个value部分用“/" 符号分隔。
HTTP请求
一个HTTP请求包含三部分内容:
- 方法-URI-协议/版本
- 请求头信息
- 请求正文
HTTP响应
同HTTP请求一样,HTTP响应包含三部分:
- 协议一状态码描述
- 响应头信息
- 响应正文
第一部分 Servlets和SP
第1章 Servlets 3
1.1 Servlet API概览 3
1.2 Servlet 4
init、service 和destroy是生命周期方法。Servlet 容器根据以下规则调用这3个方法:
- init,当该Servlet第一次 被请求时,Servlet 容器会调用这个方法。
- service,每当请求Servlet 时,Servlet 容器就会调用这个方法。
- destroy,当要销毁Servlet时,Servlet 容器就会调用这个方法。
1.3 编写基础的Servlet应用程序 5
1.3.1 编写和编译Servlet类 5
1.3.2 应用程序目录结构 7
放在应用程序目录下的任何资源,用户只要输入资源URL,都可以直接访问到。如果想让某一个资源可以被Servlet访问,但不可以被用户访问,那么就要把它放在WEB-INF目录下。
现在,准备将应用程序部署到Tomcat。使用Tomcat 时,一种部署方法是将应用程序目录复制到Tomcat 安装目录下的webapps目录中。也可以通过在Tomeat 的conf目录中编辑serverxml文件实现部署。
部署Servlet/JSP应用程序时,建议将它部署成一个WAR文件。WAR文件其实就是以.war作为扩展名的JAR文件。然后,将WAR文件复制到Tomcat的webapps目录下。当开始启动Tomeat时,Tomcat就会自动解压这个war文件。
1.3.3 调用Servlet 8
要测试这个Servlet, 需要启动或者重启Tomcat, 并在浏览器中打开下面的URL可以输出对应的页面。
1.4 ServletRequest 8
1.5 ServletResponse 9
1.6 ServletConfig 9
1.7 ServletContext 12
1.8 GenericServlet 12
1.9 Http Servlets 14
1.9.1 HttpServlet 15
1.9.2 HttpServletRequest 16
1.9.3 HttpServletResponse 16
1.10 处理HTML表单 17
你可以轻松地将一个 HTML表单从一个Servlet 发送到浏览器。当用户提交表单时,在表单元素中输入的值就会被当作请求参数发送到服务器。
现在,填写表单,并单击Submit按钮。在表单中输入的值,将利用HTTP POST方法被发送给服务器,这样就会调用Servlet 的doPost方法。
1.11 使用部署描述符 22
部署的一个方面是用一个路径配置Servlet的映射。
利用部署描述符是配置Servlet应用程序的另一种方法。部署描述符总是命名为web.xml, 并且放在WEB-INF 目录下。
清单:部署描述符
<servlet-mapping>
	<servlet-name>SimpleServlet</servlet -name>
	<url-pattern>/simple</url-pattern>
</servlet-mapping>
1.12 小结 24
Servlet技术是Java EE技术的一部分。 所有Servlet都运行在Servlet容器中,容器和Servlet间的接口为javax sevet.Servlet. javax.servlet。
第 2章 会话管理 25
由于HTTP的无状态性,一个 Web 服务器无法区分一个HTTP请求是否为第一次访问。
例如,一个Web邮件应用要求用户登录后才能查看邮件,
本章将阐述4种不同的状态保持技术: URL重写、隐藏域、cookies 和HTTPSession对象。
2.1 URL重写 25
URL重写是一种会话跟踪技术, 它将一个或多个token添加到URL的查询字符串中,每
个token通常为key=value形式,如下:
url?key-1=value-1&key-2=value-2
注意,URL和tokens间用问号(? )分割,token 间用与号(&)。
有如下限制:
- URL在某些浏览器上最大长度为2000字符;
- 若要传递值到下一个资源,需要将值插入到链接中,换句话说,静态页面很难传值;
- URL重写需要在服务端上完成,所有的链接都必须带值,因此当一个页面存在很多链接时,处理过程会是一个不小的挑战;
- 某些字符,例如空格、与和问号等必须用base64编码;
- 所有的信息都是可见的,某些情况下不合适。
示例:若选择了伦敦,并点击了Page2,则将以下URL发送给服务端:
http: //localhost: 8080/app02a/top10?city=london&page=2
2.2 隐藏域 30
使用隐藏域来保持状态类似于URL重写技术,但不是将值附加到URL上,而是放到HTML表单的隐藏域中。当表单提交时,隐藏域的值也同时提交到服务器端。隐藏域技术仅当网页有表单时有效。该技术相对于URL重写的优势在于:没有字符数限制,同时无须额外
的编码。但该技术同URL重写一样, 不适合跨越多个界面。
该隐藏域为所编辑的客户id,因此当表单提交时,服务端就知道应更新哪个客户信息。
2.3 Cookies 34
Cookies是一个很少的信息片段, 可自动地在浏览器和 Web服务器间交互。
浏览器在访问同一Web 服务器时,会将之前收到的cookie一并发送。
2.4 HttpSession对象 41
一个用户可以有且最多有一个HttpSession并且不会被其他用户访问到。
HttpSession对象在用户第一次访问网站的时候自动被创建, 你可以通过调用HttpServletRequest的getSession方法获取该对象。
请注意,不同于URL重写、隐藏域或cookie,放入到HttpSession的值,是存储在内存中的,因此,不要往HttpSession放入太多对象或大对象。
注意,所有保存在HttpSession的数据不会被发送到客户端,不同于其他会话管理技术,Servlet容器为每个HttpSession生成唯一的标识, 并将该标识发送给浏览器。
ShoppingCartServlet 映射有如下URL:
- /products:显示所有商品。
- /viewProductDetails:展示.个商品的细节。
- /addToCart:将一个商品添加到购物车中
- /viewCart:展示购物车的内容。
除/addToCart外,其他URL都会调用doGCet方法。doGet首先根据所请求的URL来生成相应内容:
String uri = request.getRequestURI();
if (uri.endsWith("/products")) {
	sendProductList(response) ;
} else if (uri.endsWith("/viewProductDetails") {
	sendProductDetails (request, response) ; 
} else if (uri.endsWith ("viewCart")) {
	showCart(request, response) ;
}
如下URL访问应用的主界面:
http://localhost: 8080/app02a/products
当用户单击View Cart (查看购物车)链接时,Web容器调用showCart方法,获取当前用户的Htt
pSession并调用其gettribute方法来获取购物商品列表:
HttpSession session = request.getSession();
List<ShoppingItem> cart = (List<ShoppingItem>) session.getAttribute (CART ATTRIBUTE) ;
然后迭代访问List对象,并将购物项发送给浏览器:
if (cart != null) {
for (ShoppingItem shoppingItem:cart) {
	Product product = shoppingItem.getProduct();
	int quantity = shoppingItem.getQuantity();
2.5 小结 49
第3章 JavaServer Pages(JSP) 50
Servlet 有两个缺点是无法克服的: 首先,写在Servlet中的所有HTML标签必须包含Java 字符串,这使得处理HTTP响应报文的工作十分烦琐:第二,所有的文本和HTML标记是硬编码,导致即使是表现层的微小变化,如改变背景颜色,也需要重新编译。
JavaServer Pages (JSP)解决了上述两个问题。同时,JSP 不会取代Servlet,相反,它们具有互补性。
3.1 JSP概述 50
首先,不必编译JSP页面:其次,JSP 页面是一个以jsp为扩展名的文本文件。
JSP页面在JSP容器中运行,一个Servlet 容器通常也是 JSP容器。
容器就是运行环境。
Servlet/JSP容器主要做以下两件事情:
(1)转换JSP页面到JSP页面实现类,
(2)如果转换成功,Servlet/JSP容器随后编译该Servlet类,并装载和实例化该类。
一个JSP页面的第一次调用的实际花费总比后来的花费多,因为它涉及翻译和编
译。为了解决这个问题,可以执行下列动作之一:
- 配置应用程序,使所有的JSP页面在应用程序启动时被调用(实际上也可视为翻译和编译),而不是在第一次请求时调用。
- 预编译 JSP页面,并将其部署为Servlet。
JSP页面可以包含模板数据和语法元素。这里,语法元素是一些具有特殊意义的 JSP转换符。例如,“<%”是一个元素,因为它表示在JSP页面中的Java代码块的开始。“%>”也是一个元素,因为它是Java代码块的结束符。
清单3.1 welcome.jsp
<html>
<head><title>Welcome</tit1e></head>
<body>
Welcome
</body>
</html>
在Tomcat中,welcome.jsp 页面在第一次请求时 被翻译成名为welcome jsp 的Servlet。你可以在Tomcat工作目录下的子目录中找到生成的Servlet。
servlet是java代码。
welcom.jsp --> servlet --> HTML
JSP                    java运行环境
可以通过如下URL访问welcome.jsp页面:
http://localhost:8080/app03a/welcome.jsp
如何在JSP页面中使用Java代码来生成动态页面。
<body>
<%
	DateFormat dateFormat =
		DateFormat. getDate Instance (DateFormat.LONG);
	String s = dateFormat. format (new Date());
	out.println("Today is”+ s);
%>
</body>
todaysDate.jsp页面发送了几个HTML标签和字符串“今天是”以及今天的日期到浏览器。
请注意两件事情。首先,Java 代码可以出现在JSP页面中的任何位置,并通过
"<%"和“%>”包括起来。
"<%...%>”块被称为scriplet。
3.2 注释 54
JSP支持两种不同的注释格式:
(1) JSP注释。该注释记录页面中做了什么。
(2) HTML/XHTML注释。这些注释将会发送到浏览器上。
JSP注释以“<%--”开始,以“--%>”结束。下面是一个例子:
<%-- retrieve products to display --%>
JSP注释不会被发送到浏览器端,也不会被嵌套。
HTML/XHTML注释语法如下:
<!-- retrieve products to display --!>
一个HTML/XHTML注释不会被容器处理,会原样发送给浏览器。
3.3 隐式对象 55
Servlet容器会传递几个对象给它运行的Servlet。例如,可以通过Servlet的
service方法拿到HttpServletRequest 和HttpServletResponse 对象,以及可以通过init 方法访问到ServletConfig对象。此外,可以通过调用HttpServletRequest 对象的getSession 方法访问到HttpSession对象。处理HTML页面
此外,PageContext中提供了另组有趣的方法:用于获取和设置属性的方法,即getAttribute方法和setAttribute方法。属性值可被存储在4个范围之一: 页面、请求、会话和应用程序。
3.4 指令 58
指令是JSP语法元素的第一种类型。 它们指示JSP转换器如何翻译JSP页面为Servlet。
3.4.1 page指令 58
可以使用page指令来控制JSP转换器转换当前JSP页面的某些方面。例如,可以告诉JSP用于转换隐式对象out的缓冲器的大小、内容类型,以及需要导入的Java类型,等等。
page指令的语法如下:
<%@ page attribute1="valuel" attribute2="value2" %>
3.4.2 include指令 59
可以使用inelude指令将其他文件中的内容包含到当前JSP页面。
include指令的语法如下:
<%@ include file="url" %>
3.5 脚本元素 60
.个脚本程序是一个 Java 代码块,以<%符号开始, 以%>符号结束。
3.5.1 表达式 61
表达式以<%=符号开始, 以%>符号结束。
3.5.2 声明 61
3.5.3 禁用脚本元素 64
3.6 动作 65
3.6.1 useBean 65
3.6.2 setProperty和getProperty 66
3.6.3 include 67
对于include 指令,资源引入发生在页面转换时,即当JSP容器将页面转换为生成的Servlet 时。而对于include动作,资源引入发生在请求页面时。
3.6.4 forward 67
3.7 错误处理 67
请使用page指令的isErrorPage属性(属性值必须为True)来标识一个 JSP页面是错误
页面。
3.8 小结 68
第4章 表达式语言 69
4.1 表达式语言的语法 69
EL表达式以${开头,并以}结束。
例如,表达式x+y,可以写成:
${x+y}
4.1.1 关键字 70
以下是关键字,它们不能用作标识符:
and or not eq ne lt gt le ge
4.1.2 [ ]和.运算符 70
为了访问对象的属性,可以使用以下任意一种形式:
${object["propertyName"] }
${object.propertyName }
4.1.3 取值规则 71
4.2 访问JavaBean 71
4.3 EL隐式对象 72
4.3.1 pageContext 72
4.3.2 initParam 73
4.3.3 param 73
4.3.4 paramValues 73
4.3.5 header 74
4.3.6 cookie 74
隐式对象cookie可以用来获取一个cookie。
4.3.7 applicationScope、sessionScope、requestScope和pageScope 74
4.4 使用其他EL运算符 75
4.4.1 算术运算符 75
4.4.2 逻辑运算符 75
下面是逻辑运算符列表:
- 和(&&和and)
4.4.3 关系运算符 76
下面是关系运算符列表:
- 等于(== 和eq)
4.4.4 empty运算符 76
4.5 应用EL 76
4.6 如何在JSP 2.0及其更高版本中配置EL 80
4.6.1 实现免脚本的JSP页面 80
4.6.2 禁用EL计算 80
4.7 小结 81
第5章 JSTL 82
JSP标准标签库(JavaServer Pages Standard Tag Library, JSTL)是一个定制标签库的集合,用来解决像遍历Map或集合、条件测试、XML处理,甚至数据库访问和数据操作等常见的问题。
JSP中写java程序
JSTL标签库
| 区域 | 子函数 | URI | 前缀 | 
|---|---|---|---|
| 核心 | 变量支持 | http://java.sun.com/jsp/jstl/core | c | 
| 流控制 | |||
| URL管理 | |||
| 其他 | |||
| 例如,要使用Core库,必须在JSP页面的开头处做以下声明: 引入库 | 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
5.1 下载JSTL 82
5.2 JSTL库 82
5.3 一般行为 83
5.3.1 out标签 83
使用库
<c:out value="value">
5.3.2 set标签 84
5.3.3 remove标签 86
5.4 条件行为 86
5.4.1 if标签 87
5.4.2 choose、when和otherwise标签 88
5.5 遍历行为 89
5.5.1 forEach标签 89
5.5.2 forTokens标签 96
5.6 格式化行为 99
5.6.1 formatNumber标签 99
5.6.2 formatDate标签 101
5.6.3 timeZone标签 102
5.6.4 setTimeZone标签 103
5.6.5 parseNumber标签 104
5.6.6 parseDate标签 104
5.7 函数 106
5.7.1 contains函数 106
5.7.2 containsIgnoreCase函数 106
5.7.3 endsWith函数 106
5.7.4 escapeXml函数 107
5.7.5 indexOf函数 107
5.7.6 join函数 107
5.7.7 length函数 107
5.7.8 replace函数 108
5.7.9 split函数 108
5.7.10 startsWith函数 108
5.7.11 substring函数 108
5.7.12 substringAfter函数 109
5.7.13 substringBefore函数 109
5.7.14 toLowerCase函数 109
5.7.15 toUpperCase函数 109
5.7.16 trim函数 109
5.8 小结 110
JSTL可以完成一般的任务(如遍历、集合和条件)、处理XML文档、格式化文本、访间数据库以及操作数据, 等等。
第6章 自定义标签 111
6.1 自定义标签概述 111
6.2 简单标签处理器 112
6.3 SimpleTag示例 112
6.3.1 编写标签处理器 113
6.3.2 注册标签 114
6.3.3 使用标签 114
6.4 处理属性 115
6.5 访问标签内容 118
6.6 编写EL函数 120
6.7 发布自定义标签 122
6.8 小结 124
第7章 标签文件 125
7.1 Tag File简介 125
7.2 第 一个Tag File 126
7.3 Tag File指令 127
7.3.1 tag指令 127
7.3.2 include指令 128
7.3.3 taglib指令 130
7.3.4 attribute指令 131
7.3.4 variable指令 132
7.4 doBody 134
7.5 invoke 137
7.6 小结 138
第8章 监听器 139
Servlet API提供了一系列的事件和事件监听接口。上层的servletJSP应用能够通过调用这些API进行事件驱动的开发。监听器接口可以分为三类: ServletContext. HttpSession 和ServletRequest。
8.1 监听器接口和注册 139
8.2 Servlet Context监听器 140
8.2.1 ServletContextListener 140
8.2.2 ServletContextAttributeListener 142
8.3 Session Listeners 142
8.3.1 HttpSessionListener 142
8.3.2 HttpSessionAttributeListener 145
8.3.3 HttpSessionActivationListener 145
8.3.4 HttpSessionBindingListener 146
8.4 ServletRequest Listeners 147
8.4.1 ServletRequestListener 147
8.4.2 ServletRequestAttributeListener 149
8.5 小结 149
本章,我们学习了Servlet API提供的多个监听器类型。这些监听器可以分成三类: application范围、session范围和request范围。
第9章 Filters 150
Filter是拦截Request请求的对象:在用户的请求访问资源前处理ServletRequet以及ServletResponse,它可用于日志记录、加解密、Session 检查、图像文件保护等。
9.1 Filter API 150
9.2 Filter配置 151
9.3 示例1:日志Filter 153
作为第1个例子,将做一个简单的Filter:在app09a的应用中把Request请求的URL记来到日志文本文件中。
9.4 示例2:图像文件保护Filter 156
9.5 示例3:下载计数Filter 158
9.6 Filter顺序 162
9.7 小结 162
第 10章 修饰Requests及Responses 163
10.1 Decorator模式 163
10.2 Servlet封装类 164
10.3 示例:AutoCorrect Filter 165
10.4 小结 172
第 11章 异步处理 173
11.1 概述 173
11.2 编写异步Servlet和过滤器 173
11.3 编写异步Servlets 174
11.4 异步监听器 179
11.5 小结 181
第 12章 安全 182
12.1 身份验证和授权 182
12.1.1 指定用户和角色 183
12.1.2 实施安全约束 184
security-constraint元素指定一个资源集合和角色或角色可以访问的资源。这个元素有两个子元素: web-resource-collection 和auth-constraint。
12.2 身份验证方法 185
12.2.1 基于表单的认证 189
12.2.2 客户端证书认证 192
12.3 安全套接层 192
12.3.1 密码学 192
12.3.2 加密/解密 193
12.3.3 认证 193
12.3.4 数据的完整性 195
12.3.5 SSL是怎么工作的 195
12.4 编程式安全 196
12.4.1 安全注释类型 196
12.4.2 Servlet的安全API 197
12.5 总结 199
第 13章 部署 200
13.1 概述 200
13.1.1 核心元素 202
13.1.2 context-param 202
13.1.3 distributable 202
13.1.4 error-page 202
13.1.5 filter 203
13.1.6 filter-mapping 204
13.1.7 listener 204
13.1.8 locale-encoding-mapping-list
和locale-encoding-
mapping 204
13.1.9 login-config 205
13.1.10 mime-mapping 205
13.1.11 security-constraint 206
13.1.12 security-role 207
13.1.13 Servlet 207
13.1.14 servlet-mapping 209
13.1.15 session-config 209
13.1.16 welcome-file-list 209
13.1.17 JSP-Specific
Elements 210
13.1.18 taglib 210
13.1.19 jsp-property-group 210
13.2 部署 212
从Servlet 1.0 开始,可以很方便地部署一个 Servlet/JSP 应用程序。仅需要将应用原始目录结构压缩成一个 WAR文件。可以在JDK中使用jar工具或流行的工具,如WinZip。需要确保压缩文件有.war扩展名。如果使用WinZip,则在压缩完成后重命名文件。
WAR文件必须包含所有库文件、类文件、HTML文件、JSP 页面、图像文件以及版权声明(如果有的话)等,但不包括Java 源文件。任何人都可以获取一个WAR文件的副本,井部署到一个Servlet/JSP容器上。
13.3 web fragment 212
13.4 小结 214
第 二部分 Spring mvc
第 14章 动态加载及Servlet
容器加载器 217
14.1 动态加载 217
14.2 Servlet容器加载器 220
14.3 小结 222
第 15章 Spring框架 223
15.1 Spring入门 223
15.2 依赖注入 223
依赖注入框架会分别创建对象A和对象B,将对象B注入到对象A中。
15.3 XML配置文件 226
15.4 Spring控制反转容器的
使用 226
15.4.1 通过构造器创建一个
bean实例 226
15.4.2 通过工厂方法创建
一个bean实例 227
15.4.3 Destroy Method的
使用 227
15.4.4 向构造器传递参数 228
15.4.5 setter方式依赖注入 229
15.4.6 构造器方式依赖
注入 231
15.5 小结 232
第 16章 模型2和MVC模式 233
16.1 模型1介绍 233
16.2 模型2介绍 233
16.3 模型2之Servlet控制器 234
16.3.1 Product类 236
16.3.2 ProductForm类 237
16.3.3 ControllerServlet类 238
16.3.4 视图 241
16.3.5 测试应用 243
16.4 解耦控制器代码 243
16.5 校验器 247
16.6 后端 251
16.7 小结 252
第 17章 Spring MVC介绍 253
Spring MVC框架可以帮助开发人员快速地开发MVC应用。
17.1 采用Spring MVC的好处 253
17.2 Spring MVC的
DispatcherServlet 254
17.3 Controller接口 255
17.4 第 一个Spring MVC应用 255
17.4.1 目录结构 255
17.4.2 部署描述符文件和Spring
MVC配置文件 256
17.4.3 Controller 257
17.4.4 View 259
17.4.5 测试应用 260
17.5 View Resolver 261
17.6 小结 263
第 18章 基于注解的控制器 264
18.1 Spring MVC注解类型 264
18.1.1 Controller注解
类型 264
18.1.2 RequestMapping
注解类型 265
18.2 编写请求处理方法 267
18.3 应用基于注解的控制器 269
18.3.1 目录结构 269
18.3.2 配置文件 270
18.3.3 Controller类 272
18.3.4 View 273
18.3.5 测试应用 274
18.4 应用@Autowired和@Service
进行依赖注入 275
18.5 重定向和Flash属性 278
作为一个经验丰富的ServletUJSP程序员,必须知道转发和重定向的区别。转发比重定向快,因为重定向经过客户端,而转发没有。但是,有时采用重定向更好,若需要重定向到一个外部网站,则无法使用转发。
使用重定向的一个不便的地方是:无法轻松地传值给目标页面。而采用转发,则可以简单地将属性添加到Model,使得目标视图可以轻松访问。由于重定向经过客户端,所以Model中的一切都在重定向时丢失。幸运的是,Spring 3.1版本以及更高版本通过Flash 属性提供了一种供重定向传值的方法。
18.6 请求参数和路径变量 279
18.7 @ModelAttribute 281
18.8 小结 282
第 19章 数据绑定和表单标签库 283
19.1 数据绑定概览 283
19.2 表单标签库 284
| 标签 | 描述 | 
|---|---|
| form | 渲染表单元素 | 
| input | 渲染 <input type="text"/>元素 | 
19.2.1 form标签 284
19.2.2 input标签 285
19.2.3 password标签 286
19.2.4 hidden标签 287
19.2.5 textarea标签 287
19.2.6 checkbox标签 287
19.2.7 radiobutton标签 288
19.2.8 checkboxes标签 288
19.2.9 radiobuttons标签 289
19.2.10 select标签 290
19.2.11 option标签 290
19.2.12 options标签 291
19.2.13 errors标签 291
19.3 数据绑定范例 292
19.3.1 目录结构 292
19.3.2 Domain类 293
19.3.3 Controller类 294
19.3.4 Service类 295
19.3.5 配置文件 298
19.3.6 视图 299
19.3.7 测试应用 301
19.4 小结 302
第 20章 转换器和格式化 303
20.1 Converter 303
20.2 Formatter 307
20.3 用Registrar注册
Formatter 310
20.4 选择Converter,还是
Formatter 312
20.5 小结 312
第 21章 验证器 313
21.1 验证概览 313
验证器则作用于object级。它决定某一个对象中的所有field是否均是有效的,以及是否遵循某些规则。
21.2 Spring验证器 314
21.3 ValidationUtils类 315
21.4 Spring的Validator范例 316
21.5 源文件 317
21.6 Controller类 318
21.7 测试验证器 319
21.8 JSR 303验证 320
@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
21.9 JSR 303 Validator范例 322
21.10 小结 323
第 22章 国际化 324
22.1 语言区域 324
22.2 国际化Spring MVC
应用程序 326
22.2.1 将文本元件隔离成
属性文件 326
22.2.2 选择和读取正确的
属性文件 328
22.3 告诉Spring MVC使用哪个
语言区域 329
22.4 使用message标签 329
22.5 范例 330
22.6 小结 334
第 23章 上传文件 335
为此,在Spring MVC中处理文件上传有两种方法:
(1)购买Apache Commons FileUpload元件。
(2)利用Servlet 3.0及其更高版本的内置支持。
23.1 客户端编程 335
23.2 MultipartFile接口 336
23.3 用Commons FileUpload
上传文件 336
23.4 Domain类 337
23.5 控制器 338
23.6 配置文件 340
23.7 JSP页面 341
23.8 应用程序的测试 343
23.9 用Servlet 3.0及其更高版本
上传文件 344
23.10 客户端上传 347
虽然Servlet 3.0中的文件上传特性使文件上传变得十分容易,只需在服务器端编程即可,但这对提升用户体验毫无帮助。单独一个 HTML表单并不能显示进度条,或者显示已经成功工传的文件数量。开发人员采用了各种不同的技术来改善用户界面,例如,单独用一个浏览器线程对服务器发出请求,以便报告上传进度。
HTML 5在其DOM中添加了一个FileAPI。它允许访问本地文件。HTML 5似乎是针对客户端文件上传局限性的最佳解决方案。
23.11 小结 355
第 24章 下载文件 356
像图片或者HTML文件这样的静态资源,在浏览器中打开正确的URL即可下载。只要该资源是放在应用程序的目录下,或者放在应用程序目录的子目录下,而不是放在WEB-INF下,ServletJSP 容器就会将该资源发送到浏览器。然而,有时静态资源是保存在应用程序目录外,或者是保存在某一个数据库中, 或者有时需要控制它的访间权限, 防止其他网站交叉引用它。如果出现以上任意一种情况, 都必须通过编程来发送资源。
24.1 文件下载概览 356
24.2 范例1:隐藏资源 357
24.3 范例2:防止交叉引用 360
24.4 小结 363
附录A Tomcat 364
A.1 下载和配置Tomcat 364
A.2 启动和终止Tomcat 364
A.3 定义上下文 365
A.4 定义资源 366
A.5 安装SSL证书 366
附录B Web Annotations 368
B.1 HandlesTypes 368
B.2 HttpConstraint 368
B.3 HttpMethodConstraint 369
B.4 MultipartConfig 369
B.5 ServletSecurity 370
B.6 WebFilter 370
B.7 WebInitParam 371
B.8 WebListener 371
B.9 WebServlet 371
附录C SSL证书 372
C.1 证书简介 372
C.2 KeyTool 373
C.2.1 生成密钥对 373
C.2.2 获得认证 374
C.2.3 将证书导入到密钥库 375
C.2.4 从密钥库导出证书 375
C.2.5 列出密钥库条目 375
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号