SpringMVC 学习指南

-----------内容摘要------------
翻译作者介绍:
林仪明 IBM高级工程师 研究软件架构、应用中间件,从事软件技术开发,软件架构设计以及团队管理工作
崔毅 研究Web服务、信息交换中间件,从事开发、系统分析、系统实施、咨询顾问、和产品研发管理,负责一个产品线


SpringMVC 学习指南

前言
核心技术:基于Spring框架的SpringMVC、Servlet、JSP

第1章 Spring框架

(1) 通过构造器或者是set方法的方式将依赖的对象B注入到A中(1.0版本)
(2) 注解的方式@Autowired将对象注入(2.5版)
以上由Spring的控制反转IoC容器进行管理
(1) xml配置bean的方式
(2) 注解注入的方式
ApplicationContext代表容器,实现接口ClassPathXmlAplicationContext(从类加载路径中加载配置文件)、FileSystemXmlApplicationContext(从文件系统中加载)
以上都需要至少一个包含beans信息的xml文件加载
ApplicationContext context = new ClassPathXmlApplicationCOntext(new String[]{"config1.xml","config2.xml"})
Product product = context.getBean("product",Product.class)

1.1 XML配置文件
1.2 Spring控制反转容器的使用
1.2.1 通过构造器创建一个bean实例
1.2.3 DestroyMethod的使用
1.2.4 向构造器传递参数
1.2.5 setter方式依赖注入
1.2.6 构造器方式依赖注入
1.3 小结
[code] servlet02 

第2章 模型2和MVC模式
2.1 模型1介绍
2.2 模型2介绍
2.3 模型2之Servlet控制器
2.3.1 Product类
2.3.2 ProductForm类
2.3.3 ControllerServlet类
2.3.4 视图
2.3.5 测试应用
2.4 解耦控制器代码
2.5 校验器
2.6 后端
2.7 小结
[code] serlvet03
(1) servlet 配置实际上也类似于是filter的配置,可以用filter来执行相应的请求分发,继承一个httpServlet接口一个filter来完成实现
(2) el表达式需要在页面头上设置 false 保证el表达式开启能取得相应的值<%@ page isELIgnored="false" %>
(3) filter的url-pattern属性后缀匹配时候需要用 *.do 加斜杠会报错,
(4) 容器对请求路径的请求顺序
a. 什么是请求资源路径
localhost:8080/appname/list
端口号之后的部分
b. 如何处理
容器会先根据ip:8080与服务器建立连接,根据应用名取webapps文件夹下查找对应的文件夹,如果找到,那么容器会先假设访问的是servlet,根据url-pattern 当中的配置匹配应用名之后的地址,如果匹配成功调用相应的servlet处理请求,如果匹配失败,容器会认为访问的是静态资源文件,比如(abc.html),容器会查找该文件,如果找到,返回该文件,反之,返回404。 
匹配规则:
1) 精确匹配,以"/"开头,比如/some
2) 通配符匹配,以"/"开头,比如/* (*表示任意长度的字符)      <url-pattern>/*</url-pattern>
  如: http://localhost:8080/servlet04/aaaa/bbbb/cccc
3) 后缀匹配,不能以"/"开头,一般以.do .action等结尾,比如 *.do   <url-pattern>*.do</url-pattern>
   如: http://localhost:8080/servlet04/aaaaa.do          

(5)  servlet设置spring的分发器,路径配上的url "/"  welcome页面设置相应的路径,比如 login,进行controller拦截跳转,进行初始化。
查询session中的登录状态,如果没有就跳转到相应的login页面。


第3章 Spring MVC介绍
3.1 采用Spring MVC的好处
3.2 Spring MVC的DispatcherServlet
3.3 Controller接口
3.4 第一个Spring MVC应用
3.4.1 目录结构
3.4.2 部署描述符文件和Spring MVC配置文件
3.4.3 Controller
3.4.4 View
3.4.5 测试应用
3.5 View Resolver
[code] 无
(1) web.xml使用spring的servlet分发,在spring-mvc包中
(2) web.xml使用spring的字符过滤,在spring-web包中
(3) 加入初始化contextConfigLocation参数为spring的xml配置文件
(4) spring-servlet配置文件可以设置bean 以及视图路径的前后缀名(spring-web servlet.view包中)
(5) 可以用new ModeAndView 来传递参数及页面

第4章 基于注解的控制器
4.1 Spring MVC注解类型
4.1.1 Controller注解类型
4.1.2 RequestMapping注解类型
4.2 编写请求处理方法
4.3 应用基于注解的控制器
4.3.1 目录结构
4.3.2 配置文件
4.3.3 Controller类
4.3.4 View
4.3.5 测试应用
4.4 应用@Autowired和@Service进行依赖注入
4.5 重定向和Flash属性
4.6 请求参数和路径变量
4.7 @ModelAttribute
4.8 小结
[code] spring01
(1) 基于注解来扫描controller,指定一个范围小的包,而不要范围很大
(2) 可传参类型:ServletRequest、HttpServletRequest、ServletResponse、HttpServletResponse、HttpSession、WebRequest、NativeWebRequest
Locale、Reader、Writer、Principal、HttpEnity<?>、Model、ModelMap、RedirectAttributes、Errors、BindingResult、命令或表单对象、SessionStatus、
UriComponentsBuilder、@PathVariable、@MatrixVariable注释的对象、@RequestParam、@RequestHeader、@RequestBody、@RequestPart  26种类型
(3) 可返回参类型:ModelAndView、Model、Map包含模型的属性、View、代表逻辑视图的String、void、提供Servlet的访问以相应Http头部和内容的HttpEnity或
ResponseEntity对象、Callable、DeferredResult、其他任意类型(Spring将其输出给View的对象模型)
(4) 使用Resource标签防止某些文件被dispatcherServlet访问,需要配合<annotation-driven/>一起使用
(5) requestMapping注解后可以添加 子标签 value="/..." method=RequestMethod.POST
(6) @PathVariable路径变量,RequestMapping 的value值中添加 {变量名}
(7) @ModelAndView("key")将用key作为键值添加实例到Model对象中,用在方法上,springMVC会在调用方法之前调用注解用的方法,返回对象或者void,void需要添加Model类型的参数
(8) JSTL标签正确解析在有无上下文情况下的路径,即绝对路径  <c:url value="/css/main.css" /> ,在与路径变量冲突的时候(即查不到的时候),自动从项目上文查找

第5章 数据绑定和表单标签库
5.1 数据绑定概览
5.2 表单标签库
5.2.1 表单标签
5.2.2 input标签
5.2.3 password标签
5.2.4 hidden标签
5.2.5 textarea标签
5.2.6 checkbox标签
5.2.7 radiobutton标签
5.2.8 checkboxes标签
5.2.9 radiobuttons标签
5.2.10 select标签
5.2.11 option标签
5.2.12 options标签
5.2.13 errors标签
5.3 数据绑定范例
5.3.1 目录结构
5.3.2 Domain类
5.3.3 Controller类
5.3.4 Service类
5.3.5 配置文件
5.3.6 视图
5.3.7 测试应用
5.4 小结

[code] spring_02_form02
[问题] delete 删除的部分 [解决] 路径变量添加了多余的$
[注意1] 在controller中redirect使用绝对路径"/",不使用相对路径
[注意2] controller中的路径不能重复,否则启动的时候会报错
使用form:select 标签可以覆盖下拉框的情况

第6章 转换器和格式化
6.1 Convert
6.2 Formatter
6.3 用Registrar注册Formatter
6.4 选择Converter,还是Formatter

6.5 小结


(1) 实现Converter 任意S 转T 
(2) 实现Fromatter String 转T 适用于Web层 需要进行包扫描
[code] spring_02_form02
Converter
sdf方法parse的时候如果setLenient(false)则为严格匹配,如果是默认就是true,宽松匹配
xml配置文件需要配置转换配置 bean class=org.springframework.context.support.ConversionServiceFactoryBean
注解 mvc:annotation-driven conversion-service = "conversionService"

第7章 验证器
7.1 验证概览
7.2 Spring验证器
7.3 ValidationUtils类
7.4 Spring的Validator范例
7.5 源文件
7.6 Controller类
7.7 测试验证器
7.8 JSR 303验证器
7.9 JSR 303 Validator范例
7.10 小结
[code] spring_02_form02
两种验证方式:
(1) spring的validation框架
(2) JSR 303 验证器

第8章 表达式语言
8.1 表达式语言的语法
${expression}  $开头
${x+y}
${a+b}and${c+d}的取值结果8and10
<my:tag someAttribute="${expression}"/>


8.1.1 关键字
and 
eq 
gt 
true 
instanceof
or 
ne 
le 
false 
empty
not 
It 
ge 
null 
div 
mod

8.1.2 []和.运算符
el表达式可以返回任意类型的值,如果是带有属性的对象,则可以利用[]或者.运算符来访问该属性。[]和.运算符相似;[]是比较规范的形式,
. 运算符来访问该属性
${object["propertyName"]}
${object.propertyName}
如果propertyName不是有效的java变量名只能使用[]来访问隐式对象标题中的HTTP标题host,例如一下均可
${header["host"]}
${header.host}

但如果访问accept-language标题只能使用[]运算符,因为accept-language不是合法的变量名
用.会导致异常
以下得到的值相同:
${pageContext["request"]["servletPath"]}
${pageContext.request["servletPath"]}
${pageContext.request.servletPath}
${pageContext["request"].servletPath}

要访问HttpSession,可以使用一下语法
${pageContext.session}

8.1.3  取值规则
expr-a[expr-b]
(1) 先计算expr-a得到 value-a
(2) 如果value-a 为null,则返回null
(3) 然后计算expr-b得到value-b
(4) 如果value-b 为null,则返回null
(5) value-a为 map,则查看value-b是否为map的key,若是,则返回value-a.get(value-b),若不是,返回null
(6) 如果value-a为List,或者假如它是一个array,则要进行以下处理
a. 强制value-b为int,如果强制失败,则抛出异常
b. 如果value-a.get(value-b)抛出IndexOutOfBoundsException,或者加入Array.get(value-a,value-b)抛出ArrayIndexOutOfBoundsException
c. 否则,若value-a是个List,则返回
(7) 如果value-a 不是一个map、list、或者array,那么,value-a必须是一个JavaBean。在这种情况下,必须强制value-b为String。如果value-b是value-a的可读属性,则要调用改属性的getter方法,从中返回值。如果getter方法抛出异常,改表达式就是无效的,否则该表达式有效。

8.2 访问 JavaBean
(1) 利用.或者[] 运算符,可以访问bean的属性
如果属性中有属性还可以继续访问
${beanName["propertyName"]}
${beanName.propertyName}
${myBean.secret}

8.3 EL隐式对象
pageContext 这是当前JSP的javax.servlet.jsp.PageContext
initParam 这是一个包含所有环境初始化参数,并用参数名作为key的map
param key value 这是包含所有请求参数,并用参数名作为key的map。每个key的值就是指定名称的第一个参数值。因此,如果两个请求参数同名,则只有第一个
能够利用param获取值。要想访问同名参数的所有参数值,可用params代替
paramValues key+数组value 包含所有请求参数,并用参数名作为key的map,每个key的值就是一个字符串数组,其中包含了指定参数名称的所有参数值。就算该
参数只有一个值,它也仍然会返回一个带有一个元素的数组

header:请求标题,标题名作为key,value返回第一个值
headerValues:请求标题为key,value返回字符串组
cookie:包含了当前请求对象中所有Cookie对象的Map,Cookie名称就是key名称,并且每个key对应一个Cookie
applicationScope:这是一个包含ServletContext对象中所有属性的Map,并用属性名称作为key
sessionScope:这是一个包含所有HttpSession对象中的所有属性,并用属性名称作为key
requestScope:这是一个Map, 包含HttpServletRequest对象中的所有属性,并且属性名称作为key
pageScope:这是一个map,其中包含了全页面范围内的所有属性


8.3.1 pageContext
包含:
reqeust
response
out
session
application
config
PageContext
page
exception

8.3.2 initParam
上下文参数
${initParam.password}
或者
${initParam["password"]}

8.3.3 param
请求参数
${param.userName}
${param[userName]}

8.3.4 param Values
获得某参数的第一个值或者第二个值
${paramValues.selectedOptions[0]}
${paramValues.selectedOptions[1]}

8.3.5 header
${header["accept-language"]}


8.3.6 cookie
当前请求中的所有cookie值
${cookie.jsessionid.value}
${cookie.jsessionid.path}

8.3.7 applicationScope,sessionScope,requestScope 和 pageScope
${applicationScope.myVar}
有界对象是指在以下对象中作为属性的对象:PageContext、SevletRequest、HttpSession或者ServletContext
隐式对象sessionScope、 requestScope、pageScope与applicationScope相似,范围分别是session、request、page
有界对象也可以通过没有范围的EL表达式获取
这种情况下,JSP容器将返回PageContext、ServletRequest、HttpSession或者ServletContext中第一个同名的对象,执行范围从
最小范围(PageContext)到最大范围(ServletContext)。例如,以下表达式将返回today引用的任意范围的对象。

8.4 使用其他EL运算符
8.4.1 算数运算符
+ - * 
/和div
%和mod
优先级是从高到低,从左到右进行
* / div % mod
+ -

8.4.2 逻辑运算符
和 && 和 and
或 || 和 or
非 !和 not

8.4.3 关系运算符
下面关系运算符列表:
== 和 eq
!= 和 ne
> 和 gt
< 和 it
小于或等于(<= 和 le)
例如,
表达式${3==4}返回false
${"b"<"d"}则返回true

关系表达式
${statment? A:B}
如果statement的计算结果为true,输出结果为A否则为B

8.4.4 empty运算符
${empty x}
如果x为null,或者x是一个长度为0的字符串,那么该表达式将返回true。如果X是一个空Map、空数组或者空集合,它也将返回True
否则,将返回false

8.5  如何在JSP2.0 及其更高版本中配置EL
8.5.1 实现免脚本的JSP页面
禁用脚本配置
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>

8.5.2 禁用EL计算

第一种 禁用
<%@page isELIgnored="true" %>

第二种
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>

8.6 小结

第9章 JSTL
9.1  下载JSTL
核心 http://java.sun.com/jsp/jstl/core 变量支持、流控制、URL管理、其他
xml http://java.sun.com/jsp/jstl/xml 核心、流控制、转换
国际化 http://java.sun.com/jsp/jstl/fmt 语言区域、消息格式、
数据库 http://java.sun.com/jsp/jstl/sql sql
函数 http://java.sun.com/jsp/jstl/functions 集合长度 字符串操作


9.2  JSTL库
<%@ taglib uri="uri" prefix="prefix" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"/>


9.3 一般行为
9.3.1 out标签

<c:out value="${sessionScope.myVar}" default="${applicationScope.myVar}"/> 
以下如果没找到则输出一个空的字符串
将结果输出为JspWriter

9.3.2 set标签
(1) 创建一个字符串和一个引用该字符串的有界变量
(2) 创建一个引用现存有界对象的有界变量
(3) 设置有界对象的属性
用set创建有界变量,那么该标签出现后的整个JSP页面中都可以使用该变量

四种形式:
scope指定有界变量的范围
1.
<c:set value ="value" var="varName" [scope="{page|request|session|application}"]/>
例子:
<c:set var = "foo" value="The wisest fool"/>
<c:set var = "job" value="${requestScope.position}" scope="page"/>
2. 
<c:set var ="varName" [scope="{page|request|session|application}"]>
body Content
</c:set>

3.
<c:set target="target" property="propertyName" value="value"/>
<c:set target="${address}" property="city" value="Tokyo"/>


4.
<c:set target="target" property="propertyName" >
bodyContent
</c:set>
同上 value值替换body Content

9.3.3 remove标签
删除掉有界变量
<c:remove var = "varName" [scope="{page|request|session|application}"] />
有界变量引用的对象不能删除。因此,如果另一个有界对象也引用了同一个对象,仍然可以通过另一个有界变量访问该对象
例子:
<c:remove var="job" scope="page"/>

9.4 条件行为
9.4.1 if标签
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>
一般是通过其他标签在同一个JSP的后续阶段再进行测试
将test的结果保存在页面范围中
<c:if var = "loggedIn" test="${param.user== ‘ken' && param.password=='blackcomb'}"
...
${(logedIn)? "You logged in successfully" : "Login failed"}

9.4.2 choose、when和otherwise标签
choose when与 java中的switch和case类似
<c:choose>
<c:when test="${param.status=='full'}"
You are a full member
</c:when>
<c:when test="${param.status=='student'}"
You are astudent menber
</c:when>
<c:otherwise>
Please register
</c:otherwise>
</c:choose>

9.5 遍历行为
9.5.1 forEach标签
固定数值
<c:forEach [var=varName] begin="begin" end="end" step="step">
bodyContext
</c:forEach>

对象集合
<c:forEach items="collection" var="varName" varStatus="varStatusName" begin="begin" end="end" step="step"
bodyContent
</c:forEach>

step是指每一次的步长

9.5.2 forTokens标签
用来遍历隔开的令牌
<c:forTokens var="item" items="abc,def,fgh" delims=",">
<c:out value="${item}"
</c:forTokens>
用","分隔开 输出上面的值

9.6 与URL相关的行为
9.6.1 url标签
<c:url value="/../.."/>

9.6.2 redirect标签
<c:redirect url="url地址" context="上下文" />

9.7 格式化行为
9.7.1 formatNumber标签
<fmt:formatNumber value="">

</fmt:formatNumber>
将数字转换成货币类型等格式

9.7.2 formatDate标签
<fmt:formatDate>  </fmt:formatDate>
格式化日期
pattern = “”
value = 要格式化的java.util.date数据

9.7.3 timeZone标签
<fmt:timeZone value="GMT+1:00">
<fmt:formatDate value="${now}" type="both" dateStyle="full"
</fmt:timeZone>

9.7.4 setTimeZone标签
<fmt:setTimeZone value="timeZone"  [var="varName"] scope="{page|request|session|application}"/>


9.7.5 parseNumber标签
用于将字符串标识的数字货币或者百分比解析成数字
<fmt:parseNumber value=""  type=""/>

9.7.6 parseDate标签
地域的格式解析以字符串表示的日期和时间
<fmt:parseDate value="" type=""/>

其中type 有三种类型 time date 和both 显示分别是时间 日期和都显示


9.8 函数
prefix ="fn"
9.8.1 contains函数
${fn:contains(myString,"Hello")}
是否包含后面的指定字符"Hello"

9.8.2 containsIgnoreCase函数
${fn.containsIgnoreCase(String,subString)}
忽略大小写

9.8.3 endsWith函数
${fn.endsWith("hello World","World")}
是否以指定后缀结尾

9.8.4 escapeXml函数
用于给String编码比如
${fn:escapeXml("Use <br/> to change lines")}
将被渲染成
Use &lt;br/&gt; to change lines

9.8.5 indexOf函数
返回第一次出现的索引
${fn:indexOf(string,subString)}

9.8.6 join函数
将一个String 数组中的所有元素都合并成一个字符串,并用指定的分隔符分开
join(array, separator)
${fn:join(myArray,",")}
将返回 “my,world”

9.8.7 length函数
返回集合中的项目数,或者是字符串中的字符数
length{input}
${fn:length("stella cadente","cadente")}返回14

9.8.8 replace函数
将字符串中的所有beforeString用afterString替换,并返回结果,
replace(String,beforeString,afterString)
${fn:replace("stella cadente","e","E")}
将返回 stElla cadEntE

9.8.9 split函数
将一个字符串分离成一个子字符串数组
${fn:split("my,world",",")}
可以再用for each遍历出来

9.8.10 startsWith函数
以什么开头
${fn:startsWith("Stella Cadente","St")}
返回true或者false

9.8.11 subString函数
截取,返回截取后的string
${fn:substring("stella cadente","0","4")}

9.8.12 substringAfter函数
用于返回指定子字符串第一次出现后的字符串部分,其语法如下
subStringAfter(string, substring)
例如,下列的EL表达式
${fn:substringAfter("stella cadente","e")}
将返回 "lla cadente"

9.8.13 substringBefore函数
将返回指定字符串第一次出现前的字符串部分
${fn:substringBefore("stella cadente","e")} 返回 st

9.8.14 toLowerCase函数
转换成小写
${fn:toLowerCase("Stella Cadente")}

9.8.15 toUpperCase函数
转换成大写
${fn:toUpperCase("Stella Cadente")}

9.8.16 trim函数
删除开头和结尾的空白
trime(String)
${fn:trim(" stella cadente ")}

9.9 小结

第10章 国际化
10.1 语言区域
10.2 国际化Spring MVC应用程序
10.2.1 将文本元件隔离成属性文件
10.2.2 选择和读取正确的属性文件
10.3 告诉Spring MVC使用哪个语言区域
10.4 使用message标签
10.5 范例
10.6 小结

第11章 上传文件
11.1 客户端变成
<form action="action" encType="multipart/form-data" method="post">
select a file <input type="file" name="fileName"/>
<input type="submit"  value="Upload"/>
</form>
表中必须包含一个类型为file的一个input元素,显示成一个按钮,点击会打开一个对话框
上传多个文件就需要多个 file类型input
h5中可以 加属性 multiple="multiple"

11.2 MultipartFile接口
用接口为 MultipartFile的接口编写一个domain类

11.3 用Commons FileUpload上传文件
1. apache commons fileupload 元件
2. 在springMVC文件中配置multipartResolver bean
设置最大上传尺寸
org.springframework.web.multipart.commons
commons-fileupload-x.y
commons-io-x.y

11.4 Domain类
放一个list属性, 类为 MultipartFile接口

11.5 控制器
从传过来的domain中取相应的对象获得接口
保存已上传文件需要在MultipartFile调用transferTo方法
从 接受到的List<MultipartFile> 得到对应的MultipartFile对象,获得原始的文件名称,
然后从request中获得相应路径,transferTo到相应的路径
for(multipartfile file : list) {
String filename = file.getOriginalFileName();
File imageFile = new File(servletRequest.getServletContext().get
RealPath("/image"), fileName);
multipartFile.transferTo(imageFile)
}

11.6 配置文件
设置最大上传属性
利用org.springframework.web.multipart.commons.CommonsMultipartResolver的maxUploadSize属性,可以设置能够接受的最大文件容量。
如果没有设置,则没有限制,大文件可能导致文件超时,为了处理超大文件的问题
可以利用HTML 5 File API将文件切片,然后再分别上传这些文件

11.7 JSP页面
<input type="file" name="image[0]"/>
保存后

11.8 应用程序的测试
编写code

11.9 用Servlet3 及其更高版本上传文件
servlet3 不需要以上两个jar包
1. 处理已上传文件的Servlets必须以@MultipartConfig进行标注
2. 属性设置 
maxFileSize 上传文件的最大容量 
maxRequestSize 表示多部分Http请求允许的最大容量,默认为值为-1,表示没有限制
location 表示在Part调用write方法时,要将已上传的文件保存到磁盘中的位置
fileSizeThreshold 上传文件超出这个容量界限时,会被写入磁盘

3. 另一种方法
可以servlet3.0 支持的在spring.xml中 用dispatcherServlet的时候配置一个
multipart-config标签,包括
<max-file-size>20848820</max-file-size>
<max-request-size>418018841</max-request-size>
<file-size-threshold>10448576</file-size-threshold>

11.10 客户端上传

解决没有进度条的问题


H5 采用了JavaScript 和 HTML 5 File API 来提供报告上传进度的进度条
1. H5 input元素的change事件,当input元素的值发生改变时,就会被触发
2. 关注HTML5在XMLHttpRequest对象中添加的progress事件
  当异步使用XMLHttpRequest对象上传文件时,就会持续地触发progress事件,直到上传进度完成或者取消,或者直接上传进度因为出错而中断
  通过监听progress事件,可以轻松的监听文件上传操作的进度
3. controller写一个实体类
只包含 multpartFile 属性
从对象中get出来相应的对象
MultipartFile multipartFile = uploadFile.getMultipartFile();
multipartFile.getOriginalFileName();
try{
File file = new File(servletReqeust.getServletContext().getRealPath("/file"), fileName)
multipartFile.transferTo(file)
} catch (IOException e) {
e.printStackTrace();
}
h5页面允许用户选择多个文件,并且一键单击,全部上传
progressBar 的div元素 显示进度
一个表单 input type="file" 提交表单
debug div元素显示提示

用js脚本实现该进度


11.11 小结
三种上传方法
1. 开源工具 Commons FileUpload
2. Servlet 3 本地文件
3. Html5 多文件上传,FileApi提升客户端用户体验

第12章
12.1 文件下载概览
工程下的资源可以访问,但是部分存在数据库当中就需要进行编程获取了
控制器需要实现:
1. 返回void类型,传参HttpServletResponse参数
2. 将响应的内容类型设为文件的内容类型。Content-Type标题在某个实体的body中定义数据的类型,
3.添加一个名为Content-Disposition的HTTP响应标题,并赋值attachment; fileName= fileName,这里的fileName是默认文件名,应该出现在File Download 文件下载对话框中。通常与文件同名,并非一定如此。
以下代码将一个文件发送到浏览器
FileInputStream fis = new FileInputStream(file)
BufferedInputStream bis = new BufferedInputStream(fis)
byte[] bytes = new byte[bis.available()]
response.setContentType(contentType)
OutputStream os = response.getOutPutStream()
bis.read(bytes)
os.write(bytes)

首先读取该文件作为FileInputStream,并将内容加到一个字节数组。随后,
获取HttpServletResponse的OutputStream中

12.2 范例1:隐藏资源
1. 放在WEB-INF/data 的目录里面,
2. code[spring_multipart_01 project] 
ResourceController

第一个方法  将用户名带到登录表单
成功登录所有的用户名和密码必须在login方法中硬解码,
查找session当中是否有相应的用户,如果有相应的用户就跳转到Main.jsp下载文件
如果是没有就回到loginMain页面

12.3 范例2:防止交叉引用
给一个路径名称,这样防止其


12.4 小结
附录A Tomcat
附录B Servlet

@WebServlet

附录C JavaServer Pages
附录D 部署描述符
D.1 概述
(1) web.xml传递初始参数给ServletContext
(2) 多个过滤器要指定调用顺序
(3) 更改会话超时设置
(4) 限制资源访问,配置用户身份验证方式
[新] [metadata-complete = "true|false"] true容器忽略Servlet注解,false诸检查Servlet注解并且扫描web fragments文件

D.1.1 核心元素
(1) ssesion-config、jsp-confi、login-config只能出现一次
(2) Servlet、filter和welcome-file-list可以出现多次

D.1.2 context-param
用context-param元素传给ServletContext,有param-name,param-value,description(可无)三个属性
例如:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-camp-webadmin.xml</param-value>
</context-param>
每个参数必须在本应用中唯一,
ServletContext.getInitParameterNames()方法返回所有参数名称
getInitParameter方法来读取每一个值

D.1.3 distributable
表示应用程序已部署到分布式的Servlet/JSP容器,元素必须为空,如下:
<distributable/>

D.1.4 error-page
包含错误码或者异常类型,
location指定要显示的资源位置,必须以“/”开始。如下:
<error-page>
<error-code>404</error-code>
<location>/error.html</location>
</error-age>

<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/exception.html</location>
</error-age>


D.1.5 filter
指定一个Servlet过滤器,至少包括filter-name(必须全局唯一)、filter-class元素,也可包含icon、display-name、discription、init-param以及async-supported
一般指定的filter类都接口Filter接口进行实现,可以初始化相应的参数
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


<filter>
<filter-name>urlSecurityFilter</filter-name>
<filter-class>com.suning.framework.uaa.access.web.UaaSecurityFilter</filter-class> 
<init-param>
<param-name>system</param-name>
<param-value>camp</param-value>
</init-param>
<init-param>
<param-name>errorPage</param-name>
<param-value>/error.htm</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>urlSecurityFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


D.1.7  listener
listener元素用来注册一个真挺器,子元素listener-class包含监听器类的全路径名,如下:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
  <listener>
          <listener-class>com.suning.framework.log.LogContextListener</listener-class>
  </listener>
  <listener>
    <listener-class>com.suning.rsf.consumer.ConsumerContextListener</listener-class>
</listener>
实现接口:ServletContextListener


D.1.8 locale-encoding-mapping-list和locale-encoding-mapping
list包含多个mapping元素,每个mapping定义了locale以及编码映射,分别用locale及encoding元素定义
[注] Locale元素的值必须是定义在ISO 639中的语言编码,如en,或者用“语言编码_国家编码”格式,如en_US,其中国家编码之必须定义在ISO 3166中。如下:
<locale-encoding-mapping-list>
<locale-encoding-mapping>
<locale> ja </locale>
<encoding>Shift_JIS</encoding>
</locale-encoding-mapping>
</locale-encoding-mapping-list>


D.1.9 login-config
包括 auth-method、realm-name以及form-login-config元素,均可选
auth-method 定义认证方式:BASIC、DIGEST、FORM、CLIENT-CERT
realm-name 定义用于 BASIC以及DIGEST认证方式的realm名称
form-login-config 则定义了用于FORM认证方式的登录页面和失败页面,若没有采用FORM认证方式
该元素被忽略。包括form-login-page和form-error-page两个子元素,均为页面在应用目录的相对资源路径必须以"/"开始。如下:
<login-config>
<auth-method> DIGEST </auth-method>
<realm-name> Members Only </realm-name>
</login-config>


<login-config>
<auth-method> FORM </auth-method>
<form-login-config>
<form-login-page>/loginForm.jsp</form-login-page>
<form-error-page>/errorPage.jsp</form-error-page>
<form-login-config>
</login-config>


D.1.10 mime-mapping
用来映射一个MIME类型到一个扩展名,由一个extension元素和一个mime-type元素组成
<mime-mapping>
<extension> txt </extension>
<mime-type> text/plain </mime-type>
</mime-mapping>


D.1.11 security-constraint
允许对一组资源进行限制访问
子元素:display-name、auth-constraint、user-data-constraint元素均可选,一个或多个web-resource-collection
auth-constraint:默认为所有角色,指明哪些角色可以访问受限资源,包含一个可选的description和多个role-name角色名称
user-data-constraint:指示在客户端和Servlet/JSP容器传输的数据是否保护,包含一个可选的description和一个transport-guarantee元素(取值范围:
NONE(标识不需要安全传输保障)、INTEGRAL(表示服务器和客户端之间的数据在传输过程中不能被篡改)或CONFIDENTIAL(表示必须加密传输数据)。大多数情况下,安全套接字层(SSL)会被应用于INTEGRAL或CONFIDENTIAL)
web-resource-collection:标识了一组需要进行限制访问的资源集合,包含一个可选description元素,0个或多个url-pattern元素,以及零个或多个http-method
web-resource:指定受保护的资源名称
http-method:指定HTTP方法,如GET、POST或者TRACE
如下:
<security-constraint>
<web-resource-collection>
<web-resource-name> Members Only </web-resource-name>
<url-pattern>/members/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>payingMember</role-name>
</auth-constraint>
</security-constraint>


<login-config>
<auth-method>Digest</auth-method>
<realm-name> Digest Access Authentication </realm-name>
</login-config>


D.1.12 security-role
security-role 元素声明用于安全限制的安全角色。可选description 和 role-name元素
<security-role>
<role-name>payingMember</role-name>
</security-role>


D.1.13 Servlet
(1) 一个可选的icon元素
(2) 可选的description元素
(3) 可选的display-name元素
(4) 一个servlet-name元素
(5) 一个servlet-class元素或一个jsp-file元素
(6) 零个或更多的init-param元素
(7) 一个可选的load-on-startup元素
(8) 可选的run-as元素
(9) 可选的enable元素
(10) 可选的async-supported元素
(11) 可选的multipart-config元素
(12) 零个或多个security-role-ref元素


一个servlet元素至少包含一个servlet-name元素和一个servlet-class元素,或者一个servlet-name和一个jsp-file元素
servlet-name必须是唯一的,servlet-class为全路径
jsp-file指定jsp页面路径,必须以“/”开始
init-param的子元素可以用来传递一个初始参数Servlet,init-param的元素构成context-param
load-on-startup元素在当Servlet/JSP启动时自动加载Servlet,指实例化Servlet和调用它的init方法。
使用此元素可以避免由于加载Servlet而导致对第一个请求的响应延迟。如果指定改元素为jsp-file元素,则JSP文件被预编译成Servlet,并加载。
值越小,优先级越高,值相同,顺序不确定。
run-as:用来覆盖调用EJB的安全标识,角色名是当前WEB应用程序定义的安全角色之一。
security-role-ref元素映射在调用Servlet的isUserInRole方法时角色名到应用程序定义的安全角色。包含一个可选的desciption,一个role-name和一个role-link元素
role-link元素用于安全角色映射到已定义的安全角色,必须包含一个定义在security-role元素中的安全角色
async-supported元素是一个可选的元素,它的值是True或False。它标识Servlet是否支持异步处理
enabled元素也是一个可选的元素,它的值可以是True或者False。设置为False则禁用这个Servlet




security-role-ref示例:
<security-role-ref>
<role-name>PM</role-name>
<role-link>payingMember</role-link>
</security-role-ref>
以上,如果属于payingMember角色用户调用Servlet的isUserInRole("payingMember")的方法,则结果为真。

D.1.14 servlet-mapping
servlet-mapping元素映射到一个Servlet都一个URL模式。该元素必须有一个Servlet-name和url-pattern元素
可以自定义servlet然后用servlet-mapping进行路径指定

D.1.15 session-config
session-config定义了用于javax.servlet.http.HttpSession实例的参数。可包含session-timeout、cookie-config 或tracking-mode
session-timeout:指定回话超时间隔(分钟)。该值必须是整数,如果该值是零或负数,则会话将永不超时
cookie-config:定义了跟踪会话创建的cookie的配置
tracking-mode:定义了跟踪会话模式,其有效值是COOKIE、URL或SSL
下面示例在12min后失效:
<session-config>
<session-timeout>12</session-timeout>
</session-config>


D.1.16 welcome-file-list
容器会一次查找相应的文件,直到最后一个
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>servlet/welcome</welcome-file>
</welcome-file-list>

D.1.17 taglib
定义了JSP标签库,包含 taglib-uri 元素和 taglib-location元素
taglib-uri:定义Servlet/JSP应用程序所用的标签库的URI,其值相当于在不熟描述符路径
taglib-location元素:指定TLD文件的位置


<jsp-config>
<taglib>
<taglib-uri>
http://brainysoftware.com/taglib/complex
</taglib-uri>
</taglib>
<taglib-location>/WEB-INF/jsp/conplex.tld</taglib-location>
</jsp-config>

D.1.18 JSP-Specific Elements
web-app 元素下的jsp-config元素,可以指定JSP配置,它可以具有零个或多个标签taglib和零个或多个jsp-property-group元素。


D.1.19 jsp-property-group
jsp-property-group元素可以为一组JSP文件统一配置属性,可以做到如下几点
(1) 指示EL显示是否忽略
(2) 指示脚本元素是否允许
(3) 指明页面的编码信息
(4) 指示一个资源是JSP文件(XML编写)
(5) 预包括和代码自动包含

有一下子元素:
(1) 一个可选的description元素
(2) 一个可选的display-name元素
(3) 一个可选的icon元素
(4) 一个或者多个url-pattern元件:指定可应用相应属性配置的URL模式
(5) 一个可选的el-ignored元素:True/False, True表示el禁用,默认False
(6) 一个可选的page-encoding元素:若与页面JSP编码不同会产生转换错误,与XML也会产生相应错误
(7) 一个可选的scripting-invalid元素:True表示页面不支持Scripting语法,默认是False
(8) 一个可选的is-xml元素,True表示匹配URL模式的页面是JSP文件
(9) 零个或多个include-prelude元素:设置该元素,会在匹配URL模式的JSP页面开头出会自动包含给定路径文件
(10) 零个或多个include-coda元素:设置该元素,会在匹配URL模式的JSP页面结尾处自动包含给定路径文件。


例如一下jsp页面无法执行EL表达式
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true </el-ignored>
</jsp-property-group>
</jsp-config>


下面例子所有的JSP页面不支持<% scripting %> 语法
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>

D.2 部署
(1) 将原始目录结构压缩成WAR文件,可以用jar工具或者流行工具,如WinZip,确保扩展名为.war扩展名
如果用WinZip需要压缩完成后重命名文件
(2) war文件必须包含所有库文件、类文件、HTML文件、JSP页面、图像文件以及版权声明(如果有),但不包含java源文件。
(3) 任何人都可以获取war文件的副本,部署在Servlet/JSP容器上

D.3 web fragment
[新] Servlet 3 新功能
(1) 一个web fragment包含常用的web对象,如Servlet、过滤器和监听器,JSP页面和静态图像的包文件(JAR包
(2) 可以部署为XML描述符,必须命名为web-fragment.xml,并且位于META-INFO目录下,包含web-app元素下任意元素
在加上一些web fragment的特定元素。一个应用程序可以有多个web片段

例如 
(1) 一个Servlet类继承HttpServlet实现doGet方法
(2) web-fragment.xml中配置相应的servlet 及 servlet-mapping同web.xml


-----------以下可用于复制------------


第1章 Spring框架
1.1 XML配置文件
1.2 Spring控制反转容器的使用
1.2.1 通过构造器创建一个bean实例
1.2.3 DestroyMethod的使用
1.2.4 向构造器传递参数
1.2.5 setter方式依赖注入
1.2.6 构造器方式依赖注入
1.3 小结

第2章 模型2和MVC模式
2.1 模型1介绍
2.2 模型2介绍
2.3 模型2之Servlet控制器
2.3.1 Product类
2.3.2 ProductForm类
2.3.3 ControllerServlet类
2.3.4 视图
2.3.5 测试应用
2.4 解耦控制器代码
2.5 校验器
2.6 后端
2.7 小结

第3章 Spring MVC介绍
3.1 采用Spring MVC的好处
3.2 Spring MVC的DispatcherServlet
3.3 Controller接口
3.4 第一个Spring MVC应用
3.4.1 目录结构
3.4.2 部署描述符文件和Spring MVC配置文件
3.4.3 Controller
3.4.4 View
3.4.5 测试应用
3.5 View Resolver

第4章 基于注解的控制器
4.1 Spring MVC注解类型
4.1.1 Controller注解类型
4.1.2 RequestMapping注解类型
4.2 编写请求处理方法
4.3 应用基于注解的控制器
4.3.1 目录结构
4.3.2 配置文件
4.3.3 Controller类
4.3.4 View
4.3.5 测试应用
4.4 应用@Autowired和@Service进行依赖注入
4.5 重定向和Flash属性
4.6 请求参数和路径变量
4.7 @ModelAttribute
4.8 小结

第5章 数据绑定和表单标签库
5.1 数据绑定概览
5.2 表单标签库
5.2.1 表单标签
5.2.2 input标签
5.2.3 password标签
5.2.4 hidden标签
5.2.5 textarea标签
5.2.6 checkbox标签
5.2.7 radiobutton标签
5.2.8 checkboxes标签
5.2.9 radiobuttons标签
5.2.10 select标签
5.2.11 option标签
5.2.12 options标签
5.2.13 errors标签
5.3 数据绑定范例
5.3.1 目录结构
5.3.2 Domain类
5.3.3 Controller类
5.3.4 Service类
5.3.5 配置文件
5.3.6 视图
5.3.7 测试应用
5.4 小结

第6章 转换器和格式化
6.1 Convert
6.2 Formatter
6.3 用Registrar注册Formatter
6.4 选择Converter,还是Formatter
6.5 小结

第7章 验证器
7.1 验证概览
7.2 Spring验证器
7.3 ValidationUtils类
7.4 Spring的Validator范例
7.5 源文件
7.6 Controller类
7.7 测试验证器
7.8 JSR 303验证器
7.9 JSR 303 Validator范例
7.10 小结

第8章 表达式语言
8.1 表达式语言的语法
8.1.1 关键字
8.1.2  []和运算符
8.1.3  取值规则
8.2 访问 JavaBean
8.3 EL隐式对象
8.3.1 pageContext
8.3.2 initParam
8.3.3 param
8.3.4 param Values
8.3.5 header
8.3.6 cookie
8.3.7 applicationScope,sessionScope,requestScope 和 pageScope
8.4 使用其他EL运算符
8.4.1 算数运算符
8.4.2 逻辑运算符
8.4.3 关系运算符
8.4.4 empty运算符
8.5  如何在JSP2.0 及其更高版本中配置EL
8.5.1 实现免脚本的JSP页面
8.5.2 禁用EL计算
8.6 小结

第9章 JSTL
9.1  下载JSTL
9.2  JSTL库
9.3 一般行为
9.3.1 out标签
9.3.2 set标签
9.3.3 remove标签
9.4 条件行为
9.4.1 if标签
9.4.2 choose、when和otherwise标签
9.5 遍历行为
9.5.1 forEach标签
9.5.2 forTokens标签
9.6 与URL相关的行为
9.6.1 url标签
9.6.2 redirect标签
9.7 格式化行为
9.7.1 formatNumber标签
9.7.2 formatDate标签
9.7.3 timeZone标签
9.7.4 setTimeZone标签
9.7.5 parseNumber标签
9.7.6 parseDate标签
9.8 函数
9.8.1 contains函数
9.8.2 containsIgnoreCase函数
9.8.3 endsWith函数
9.8.4 escapeXml函数
9.8.5 indexOf函数
9.8.6 join函数
9.8.7 length函数
9.8.8 replace函数
9.8.9 split函数
9.8.10 startsWith函数
9.8.11 subString函数
9.8.12 subStringAfter函数
9.8.13 subStringBefore函数
9.8.14 toLowerCase函数
9.8.15 toUpperCase函数
9.8.16 trim函数
9.9 小结


第10章 国际化
10.1 语言区域
10.2 国际化Spring MVC应用程序
10.2.1 将文本元件隔离成属性文件
10.2.2 选择和读取正确的属性文件
10.3 告诉Spring MVC使用哪个语言区域
10.4 使用message标签
10.5 范例
10.6 小结

第11章 上传文件
11.1 客户端变成
11.2 MultipartFile接口
11.3 用Commons FileUpload上传文件
11.4 Domain类
11.5 控制器
11.6 配置文件
11.7 JSP页面
11.8 应用程序的测试
11.9 用Servlet3 及其更高版本上传文件
11.10 客户端上传
11.11 小结

第12章
12.1 文件下载概览
12.2 范例1:隐藏资源
12.3 范例2:防止交叉引用
12.4 小结

附录A Tomcat
附录B Servlet
附录C JavaServer Pages
附录D 部署描述符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值