spring 31MVC实战Word文件下载.docx
《spring 31MVC实战Word文件下载.docx》由会员分享,可在线阅读,更多相关《spring 31MVC实战Word文件下载.docx(40页珍藏版)》请在冰豆网上搜索。
二、spring3.1mvc框架的特点
如果仅仅关注于web方面的支持,Spring有下面一些特点:
∙清晰的角色划分:
控制器,验证器,命令对象,表单对象和模型对象;
分发器,处理器映射和视图解析器;
等等。
∙直接将框架类和应用类都作为JavaBean配置,包括通过应用上下文配置中间层引用,例如,从web控制器到业务对象和验证器的引用。
∙可适应性,但不具有强制性:
根据不同的情况,使用任何你需要的控制器子类(普通控制器,命令,表单,向导,多个行为,或者自定义的),而不是要求任何东西都要从Action/ActionForm继承。
∙可重用的业务代码,而不需要代码重复:
你可以使用现有的业务对象作为命令对象或表单对象,而不需要在ActionForm的子类中重复它们的定义。
∙可定制的绑定和验证:
将类型不匹配作为应用级的验证错误,这可以保存错误的值,以及本地化的日期和数字绑定等,而不是只能使用字符串表单对象,手动解析它并转换到业务对象。
∙可定制的处理器映射,可定制的视图解析:
灵活的模型可以根据名字/值映射,处理器映射和视图解析使应用策略从简单过渡到复杂,而不是只有一种单一的方法。
∙可定制的本地化和主题解析,支持JSP,无论有没有使用Spring标签库,支持JSTL,支持不需要额外过渡的Velocity,等等。
∙简单而强大的标签库,它尽可能地避免在HTML生成时的开销,提供在标记方面的最大灵活性。
三、spring3.1MVC入门列子HelloWorld
(1)在WEB-INF/web.xml中加入如下代码:
<
servlet>
servlet-name>
dispatcherServlet<
/servlet-name>
servlet-class>
org.springframework.web.servlet.DispatcherServlet<
/servlet-class>
init-param>
<
param-name>
contextConfigLocation<
/param-name>
param-value>
classpath*:
spring-servlet.xml
/param-value>
<
/init-param>
load-on-startup>
1<
/load-on-startup>
/servlet>
servlet-mapping>
url-pattern>
*.html<
/url-pattern>
<
/servlet-mapping>
上述的配置的就是前段控制器,在servlet-mapping配置了*.html,意味着所有以.html结尾的请求多会通过这个servlet,当dispatcherServlet启动时,他默认会在web-info目录下查找一个spring-servlet.xml的配置文件。
上面我们通过显示指定了这个文件的位置,即在类路径底下的spring-servlet.xml.这个文件我们会在第二步点给他家做详细介绍。
(2)在类路径底下添加spring-servlet.xml文件,其内容如下:
?
xmlversion="
1.0"
encoding="
UTF-8"
>
beansxmlns="
http:
//www.springframework.org/schema/beans"
xmlns:
xsi="
//www.w3.org/2001/XMLSchema-instance"
p="
//www.springframework.org/schema/p"
context="
//www.springframework.org/schema/context"
xsi:
schemaLocation="
//www.springframework.org/schema/beans
http:
//www.springframework.org/schema/beans/spring-beans-3.0.xsd
//www.springframework.org/schema/context
//www.springframework.org/schema/context/spring-context-3.0.xsd"
context:
component-scan
base-package="
com.pango.spring.helloworld.controller"
/>
beanid="
viewResolver"
class="
org.springframework.web.servlet.view.UrlBasedViewResolver"
propertyname="
viewClass"
value="
org.springframework.web.servlet.view.JstlView"
prefix"
value="
/WEB-INF/jsp/"
suffix"
.jsp"
/bean>
/beans>
上面这个文件,我们定义了一个<
这样的标签,定义了这个后,当spring在启动时,会加载com.pango.spring.helloworld.controller这个包底下及子包底下的所有的组件(这就包的自动扫描机制,即spring会将标有@Controller@Component等类加载到spring容器管理中),后面我们还定义了<
ViewResolver是一个试图解析器,就是我们第一部分提到的springMVC生命周期中的第五步,上面这段的配置的意思就是,当我们从后端控制器中返回的视图时,前端控制器就根据这一段配置来返回一个具体的视图,如后端控制返回的是一个hello,根据上面的配置,最后前端控制器会组并成这样的一个地址:
/web-inf/jsp/hello.jsp,然后从/web-inf/jsp/这个目录下面查找一个hello.jsp返回客户端。
第三部分我们看我们写得HelloworldController后台控制器。
(3)在包底下写一个HelloWorldController的类,其内容如下:
@Controller
publicclassHelloWorldController{
@RequestMapping(value="
/hello"
)
publicStringsayHello(ModelMapmodelMap){
modelMap.put("
sayHello"
"
helloworld"
);
return"
;
}
}
在这里简单介绍下上面的配置,后面我们会详细讲解各个参数:
Ø
Controller即声明这个类是一个控制器,上面第二部分我们说明了,只要加了@Controller标示的,spring会通过自动扫描机制,将这个类纳入spring容器管理中。
),这个定义的就是一个请求路径,只要符合/hello路径的多会交给这个控制器的sayhello方法来处理。
最后我们返回/hello的视图给客户端。
(4)好了,大功告成,我们再在web-info/jsp/目录下添加一个hello.jsp文件,就可以启动运行我们的第一个程序了。
hello.jsp的内容如下:
%@pagelanguage="
java"
contentType="
text/html;
charset=UTF-8"
pageEncoding="
%>
%@tagliburi="
prefix="
c"
%>
!
DOCTYPEhtmlPUBLIC"
-//W3C//DTDHTML4.01Transitional//EN"
"
//www.w3.org/TR/html4/loose.dtd"
html>
head>
metahttp-equiv="
Content-Type"
content="
title>
Inserttitlehere<
/title>
/head>
body>
span>
${sayHello}<
/span>
/body>
/html>
运行后访问ip;
port/project/hello.html就可以看到我们预期的结果了。
四、springMVC参数传递
mvc结构中,v层不断有数据和c层交互,所以弄明白在springMVC中如何与后台进行数据交互是极其重要的,当然在下面我不会介绍每一个方法,只是对常用的方法,对于我这里没有涉及的方法大家可以参考spring官方的文档中springMVC这个章节。
下面我们来看一幅图。
当我们向springMVC发起请求到视图返回前,springMVC帮我们做了主要是上面几个步骤,通过数据绑定、数据类型转换、验证、结果绑定这几个步骤。
让我们看下实例:
@RequestMapping("
/user/find"
publicStringfindUserById(@RequestParam("
userId"
)intuserId,ModelMapmodelMap){
userId);
/user"
@RequestMapping("
),是对请求映射的说明,这个注解中主要包含四个属性,分别value、method、params、header,这四个参数分别表示:
Value:
指定路径
Method:
请求方式
Params:
参数
Headers:
请求头
后面三个就是对请求路径的一个限制条件。
SpringMVC对于路径的定义非常的灵活
以下URL都是合法的:
●/user/*/createUser
匹配/user/aaa/createUser、/user/bbb/createUser等URL。
●/user/**/createUser
匹配/user/createUser、/user/aaa/bbb/createUser等URL。
●/user/createUser?
匹配/user/createUseraa、/user/createUserbb等URL。
●/user/{userId}
匹配user/123、user/abc等URL。
●/user/**/{userId}
匹配user/aaa/bbb/123、user/aaa/456等URL。
●company/{companyId}/user/{userId}/detail
匹配company/123/user/456/detail等的URL。
对RequestParam的介绍
@RequestParam有以下三个参数。
●value:
参数名。
●required:
是否必需,默认为true,表示请求中必须包含对应的参数名,如果不存在将抛出异常。
●defaultValue:
默认参数名,设置该参数时,自动将required设为false。
极少情况需要使用该参数,也不推荐使用该参数。
当发送请求时,请求参数中必须要包含userId这个参数,当不包含这个参数,请求将找不到这个映射。
当属性required=true时,不包含这个参数将会抛异常,如果不能确定是否需要这个参数是我们可以写成,@RequestParam(value="
required=false)。
直接将属性映射到对象中
/user/find2"
publicStringfind2UserById(Useruser,ModelMapmodelMap){
user"
user);
SpringMVC按:
“HTTP请求参数名=命令/表单对象的属性名”
的规则,自动绑定请求数据,支持“级联属性名”,自动进行基本类型数据转换。
如:
发起下面这个请求,springMVC会自动将id、name、password属性的值填充到user对象中。
http:
//localhost:
8080/springParam/user/save.html?
id=12&
name=marcle&
password=123
SpringMVC以rest技术向springMVC传递参数
通过REST风格体系架构,请求和响应都是基于资源表示的传输来构建的。
资源是通过全局ID来标识的,这些ID一般使用的是一个统一资源标识符(URI)。
客户端应用使用HTTP方法(如,GET、POST、PUT或DELETE)来操作一个或多个资源。
通常,GET是用于获取或列出一个或多个资源,POST用于创建,PUT用于更新或替换,而DELETE则用于删除资源。
例如,GEThttp:
//host/context/employees/12345将获取ID为12345的员工的表示。
这个响应表示可以是包含详细的员工信息的XML或ATOM,或者是具有更好UI的JSP/HTML页面。
您看到哪种表示方式取决于服务器端实现和您的客户端请求的MIME类型。
RESTfulWebService是一个使用HTTP和REST原理实现的WebService。
通常,一个RESTfulWebService将定义基本资源URI、它所支持的表示/响应MIME,以及它所支持的操作。
Spring3.0之后引入了对rest风格的支持。
我们看实例
/user/find/{id}"
publicStringrest(@PathVariableintid,ModelMapmodelMap){
Useruser=newUser();
user.setName("
marcle"
user.setPassword("
123"
user.setId(id);
这里需要注意的地方时@RequestMapping("
)和@PathVariableintid名称必须一样,否则会出现异常。
简单介绍返回视图的方式
◆ModelAndView形式返回
/user/save2"
publicModelAndViewsave2(Useruser,ModelMapmodelMap){
ModelAndViewmav=newModelAndView();
mav.setViewName("
mav.addObject("
returnmav;
ModelAndView就是对返回到页面的值和视图进行封装。
◆直接字符串的形式返回,如”return“/user””,再把属性通过modelMap进行封装,modelMap存储的值属于request范围内,如果要发送服务器端请求,springMVC非常方便,你只要这样写即可return”direct:
user”.
还有一种传递参数的方法,我放在springMVC中的rest技术介绍
下面我们看看springMVC返回的过程
五、springMVC标签介绍
SpringMVC简单没几个标签,用起来还是非常好用的,在使用springMVC中的标签之前需要向每个jsp的头部引入标签支持<
%@taglibprefix="
form"
uri="
//www.springframework.org/tags/form"
。
(1)form标签
这个标签会生成一个HTML的form标签,同时为内部标签的绑定暴露了一个绑定路径,它把命令对象(commandobject)放在pageContext中,这样内部的标签就可以访问这个对象,这个库中的其它标签都是这个标签的嵌套标签。
如我们有个user的域对象,包含id、name、password属性,我们将把它当作返回index.jsp表单控制器的对象,如下面的代码:
form:
formaction="
${ctx}/user/save.${ext}"
method="
post"
commandName="
table>
tr>
<
td>
Id:
/td>
inputpath="
id"
/tr>
name:
name"
password:
password"
tdcolspan="
2"
inputtype="
submit"
Save"
/table>
/form:
form>
上述的id、name、password由页面控制器放置在pageContext中,即在内部控制器方法中需要做这样的声明:
@RequestMapping(value="
/user/save"
method=RequestMethod.GET)
publicStringforSave(@ModelAttributeUseruser){
/index"
后台控制器中必须绑定这个@ModelAttributeUseruser命令行对象,而form下面的属性需要于这个user中的属性对应起来,否则将会抛异常。
标签经过解析后生成的代码如下:
formid="
action="
/springTag/user/save.html"
inputid="
name="
type="
text"
0"
/>
"
SaveChanges"
/form>
(2)input标签
使用时如上面的表达