spring 31MVC实战.docx

上传人:b****5 文档编号:6337300 上传时间:2023-01-05 格式:DOCX 页数:40 大小:367.14KB
下载 相关 举报
spring 31MVC实战.docx_第1页
第1页 / 共40页
spring 31MVC实战.docx_第2页
第2页 / 共40页
spring 31MVC实战.docx_第3页
第3页 / 共40页
spring 31MVC实战.docx_第4页
第4页 / 共40页
spring 31MVC实战.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

spring 31MVC实战.docx

《spring 31MVC实战.docx》由会员分享,可在线阅读,更多相关《spring 31MVC实战.docx(40页珍藏版)》请在冰豆网上搜索。

spring 31MVC实战.docx

spring31MVC实战

Spring3.1MVC实战

邮箱:

86207344@

一、spring3.1mvc核心思想介绍2

二、spring3.1mvc框架的特点3

三、spring3.1MVC入门列子HelloWorld3

四、springMVC参数传递6

五、springMVC标签介绍9

(2)input标签10

(3)checkbox标签11

(4)radiobutton标签12

六、springMVC拦截器14

七、spring3MVC类型转换17

八、json格式数据的输入和输出21

九、spring3mvc文件上传23

十、springmvc国际化和本地化25

十一、使用jsr303进行验证29

 

一、spring3.1mvc核心思想介绍

SpringMVC是spring的一个web组件,它为构建稳健的web应用提供了丰富的功能。

SpringMVC是基于每个逻辑和功能是高可配置的这样架构和设计的。

当然springMVC可以与其它流行的web框架像struts、webwork、javaserverface及tapestry实现无缝集成。

我们看一下springMVC的核心思想。

Spring请求的生命周期

为了便于理解,我把springMVC的生命周期拆解为如下一个步骤。

总结一下springMVC几个关键的步骤,总共可以分为六个步骤,分别为:

(1)客户端向spring容器发起一个http请求

(2)发起的请求被前端控制起所拦截(DispatcherServlet),前端控制器会去找恰当的映射处理器来处理这次请求。

(3)根据处理器映射(HandlerMapping)来选择并决定将请求发送给那一个控制器。

(4)在控制器中处理所发送的请求,并以modeandView(属性值和返回的页面)的形式返回给向前端控制器。

(5)前端控制器通过查询viewResolver对象来试着解决从控制返回的视图。

(6)如果前端控制找到对应的视图,则将视图返回给客户端,否则抛异常。

通过上面的图和springMVC生命周期的六个步骤,想必大家对springMVC的核心思想有个了大概的了解了,下面我们以实例为主,带领大家慢慢熟悉整个springMVC及如何使用springMVC。

(本教程基于maven实现springMVC中的例子,所以大家得对maven需要有大概的了解)。

二、spring3.1mvc框架的特点

如果仅仅关注于web方面的支持,Spring有下面一些特点:

∙清晰的角色划分:

控制器,验证器,命令对象,表单对象和模型对象;分发器,处理器映射和视图解析器;等等。

∙直接将框架类和应用类都作为JavaBean配置,包括通过应用上下文配置中间层引用,例如,从web控制器到业务对象和验证器的引用。

∙可适应性,但不具有强制性:

根据不同的情况,使用任何你需要的控制器子类(普通控制器,命令,表单,向导,多个行为,或者自定义的),而不是要求任何东西都要从Action/ActionForm继承。

∙可重用的业务代码,而不需要代码重复:

你可以使用现有的业务对象作为命令对象或表单对象,而不需要在ActionForm的子类中重复它们的定义。

∙可定制的绑定和验证:

将类型不匹配作为应用级的验证错误,这可以保存错误的值,以及本地化的日期和数字绑定等,而不是只能使用字符串表单对象,手动解析它并转换到业务对象。

∙可定制的处理器映射,可定制的视图解析:

灵活的模型可以根据名字/值映射,处理器映射和视图解析使应用策略从简单过渡到复杂,而不是只有一种单一的方法。

∙可定制的本地化和主题解析,支持JSP,无论有没有使用Spring标签库,支持JSTL,支持不需要额外过渡的Velocity,等等。

∙简单而强大的标签库,它尽可能地避免在HTML生成时的开销,提供在标记方面的最大灵活性。

三、spring3.1MVC入门列子HelloWorld

(1)在WEB-INF/web.xml中加入如下代码:

dispatcherServlet

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath*:

spring-servlet.xml

1

dispatcherServlet

*.html

上述的配置的就是前段控制器,在servlet-mapping配置了*.html,意味着所有以.html结尾的请求多会通过这个servlet,当dispatcherServlet启动时,他默认会在web-info目录下查找一个spring-servlet.xml的配置文件。

上面我们通过显示指定了这个文件的位置,即在类路径底下的spring-servlet.xml.这个文件我们会在第二步点给他家做详细介绍。

(2)在类路径底下添加spring-servlet.xml文件,其内容如下:

xmlversion="1.0"encoding="UTF-8"?

>

//www.springframework.org/schema/beans"

xmlns:

xsi="http:

//www.w3.org/2001/XMLSchema-instance"

xmlns:

p="http:

//www.springframework.org/schema/p"

xmlns:

context="http:

//www.springframework.org/schema/context"

xsi:

schemaLocation="http:

//www.springframework.org/schema/beans

http:

//www.springframework.org/schema/beans/spring-beans-3.0.xsd

http:

//www.springframework.org/schema/context

http:

//www.springframework.org/schema/context/spring-context-3.0.xsd">

component-scan

base-package="com.pango.spring.helloworld.controller"/>

class="org.springframework.web.servlet.view.UrlBasedViewResolver">

value="org.springframework.web.servlet.view.JstlView"/>

上面这个文件,我们定义了一个

component-scan

base-package="com.pango.spring.helloworld.controller"/>

这样的标签,定义了这个后,当spring在启动时,会加载com.pango.spring.helloworld.controller这个包底下及子包底下的所有的组件(这就包的自动扫描机制,即spring会将标有@Controller@Component等类加载到spring容器管理中),后面我们还定义了

class="org.springframework.web.servlet.view.UrlBasedViewResolver">

value="org.springframework.web.servlet.view.JstlView"/>

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"/hello";

}

}

在这里简单介绍下上面的配置,后面我们会详细讲解各个参数:

ØController即声明这个类是一个控制器,上面第二部分我们说明了,只要加了@Controller标示的,spring会通过自动扫描机制,将这个类纳入spring容器管理中。

Ø@RequestMapping(value="/hello"),这个定义的就是一个请求路径,只要符合/hello路径的多会交给这个控制器的sayhello方法来处理。

Ø最后我们返回/hello的视图给客户端。

(4)好了,大功告成,我们再在web-info/jsp/目录下添加一个hello.jsp文件,就可以启动运行我们的第一个程序了。

hello.jsp的内容如下:

<%@pagelanguage="java"contentType="text/html;charset=UTF-8"

pageEncoding="UTF-8"%>

<%@tagliburi="prefix="c"%>

DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http:

//www.w3.org/TR/html4/loose.dtd">

Inserttitlehere

${sayHello}

运行后访问ip;port/project/hello.html就可以看到我们预期的结果了。

四、springMVC参数传递

mvc结构中,v层不断有数据和c层交互,所以弄明白在springMVC中如何与后台进行数据交互是极其重要的,当然在下面我不会介绍每一个方法,只是对常用的方法,对于我这里没有涉及的方法大家可以参考spring官方的文档中springMVC这个章节。

下面我们来看一幅图。

当我们向springMVC发起请求到视图返回前,springMVC帮我们做了主要是上面几个步骤,通过数据绑定、数据类型转换、验证、结果绑定这几个步骤。

让我们看下实例:

@RequestMapping("/user/find")

publicStringfindUserById(@RequestParam("userId")intuserId,ModelMapmodelMap){

modelMap.put("userId",userId);

return"/user";

}

Ø@RequestMapping("/user/find"),是对请求映射的说明,这个注解中主要包含四个属性,分别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="userId",required=false)。

Ø直接将属性映射到对象中

@RequestMapping("/user/find2")

publicStringfind2UserById(Useruser,ModelMapmodelMap){

modelMap.put("user",user);

return"/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风格的支持。

我们看实例

@RequestMapping("/user/find/{id}")

publicStringrest(@PathVariableintid,ModelMapmodelMap){

Useruser=newUser();

user.setName("marcle");

user.setPassword("123");

user.setId(id);

modelMap.put("user",user);

return"/user";

}

这里需要注意的地方时@RequestMapping("/user/find/{id}")和@PathVariableintid名称必须一样,否则会出现异常。

Ø简单介绍返回视图的方式

◆ModelAndView形式返回

@RequestMapping("/user/save2")

publicModelAndViewsave2(Useruser,ModelMapmodelMap){

ModelAndViewmav=newModelAndView();

mav.setViewName("/user");

mav.addObject("user",user);

returnmav;

}

ModelAndView就是对返回到页面的值和视图进行封装。

◆直接字符串的形式返回,如”return“/user””,再把属性通过modelMap进行封装,modelMap存储的值属于request范围内,如果要发送服务器端请求,springMVC非常方便,你只要这样写即可return”direct:

user”.

还有一种传递参数的方法,我放在springMVC中的rest技术介绍

下面我们看看springMVC返回的过程

五、springMVC标签介绍

SpringMVC简单没几个标签,用起来还是非常好用的,在使用springMVC中的标签之前需要向每个jsp的头部引入标签支持<%@taglibprefix="form"uri="http:

//www.springframework.org/tags/form"%>

(1)form标签

这个标签会生成一个HTML的form标签,同时为内部标签的绑定暴露了一个绑定路径,它把命令对象(commandobject)放在pageContext中,这样内部的标签就可以访问这个对象,这个库中的其它标签都是这个标签的嵌套标签。

如我们有个user的域对象,包含id、name、password属性,我们将把它当作返回index.jsp表单控制器的对象,如下面的代码:

formaction="${ctx}/user/save.${ext}"method="post"commandName="user">

Id:

inputpath="id"/>

name:

inputpath="name"/>

password:

inputpath="password"/>

form>

上述的id、name、password由页面控制器放置在pageContext中,即在内部控制器方法中需要做这样的声明:

@RequestMapping(value="/user/save",method=RequestMethod.GET)

publicStringforSave(@ModelAttributeUseruser){

return"/index";

}

后台控制器中必须绑定这个@ModelAttributeUseruser命令行对象,而form下面的属性需要于这个user中的属性对应起来,否则将会抛异常。

标签经过解析后生成的代码如下:

Id:

name:

password:

(2)input标签

使用时如上面的表达

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 金融投资

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1