配色: 字号:
spingmvc框架课程
2023-04-13 | 阅:  转:  |  分享 
  

上边的静态代码改为动态jsp代码如下:..........Contrller方法定义如下:public St
ring useraddsubmit(Model model,QueryVo queryVo)throws Exception{S
ystem.out.println(queryVo.getItemList());}Map在包装类中定义Map对象,并添加get/
set方法,action使用包装对象接收。包装类中定义Map对象如下:Public class QueryVo {private
Map itemInfo = new HashMap(); //g
et/set方法..}页面定义如下:
Contrller方法定义如下:public String useraddsubmit(Mo
del model,QueryVo queryVo)throws Exception{System.out.println(que
ryVo.getStudentinfo());}问题总结404页面找不到,视图找不到。HandlerMapping根据url没有找
到Handler。Post时中文乱码在web.xml中加入:CharacterEncod
ingFilter
org.springframework.web.filt
er.CharacterEncodingFilter

encoding
utf-8 >
CharacterEncodingFilter ilter-name>/以上可以解决po
st请求乱码问题。对于get请求中文参数出现乱码解决方法有两个:修改tomcat配置文件添加编码与工程编码一致,如下: ctor URIEncoding="utf-8" connectionTimeout="20000" port="8080" pr
otocol="HTTP/1.1" redirectPort="8443"/>另外一种方法对参数进行重新编码:String use
rName new String(request.getParamter("userName").getBytes("ISO885
9-1"),"utf-8")ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码与struts
2不同springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。springmvc是
基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传
递参数是通过类的属性,只能设计为多例。Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数
解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndV
iew中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。注解开发-高级Validation(了解)b/s
系统中对http请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上考虑,但是在一些安全性要求高的系统中服务端校验是不可缺
少的,本节主要学习springmvc实现控制层添加校验。Spring3支持JSR-303验证框架,JSR-303 是JAVA EE
6 中的一项子规范,叫做Bean Validation,官方参考实现是Hibernate Validator(与Hibernat
e ORM 没有关系),JSR 303 用于对Java Bean 中的字段的值进行验证。需求在商品信息修改提交时对商品信息内容进行
校验,例如商品名称必须输入,价格合法性校验。加入jar包配置validator lue="org.hibernate.validator.HibernateValidator" /> y name="validationMessageSource" ref="messageSource" /> - 校验错误信息配置文件 --> classpath:Custo
mValidationMessages
将valid
ator加到处理器适配器配置方式1 mvc:annotation-driven>配置方式2(自学) let.mvc.method.annotation.RequestMappingHandlerAdapter"> name="webBindingInitializer" ref="customBinder"> n>添加验证规则public class Items { private Integer id; @Size(min=1,max=
30,message="{item.name.length.error}") private String name; @Not
Empty(message="{pic.is.null}") private String pic;错误消息文件CustomVal
idationMessagesitem.name.length.error=商品名称在1到30个字符之间pic.is.null=请
上传图片如果在eclipse中编辑properties文件无法看到中文则参考“Eclipse开发环境配置-indigo.docx”
添加propedit插件。捕获错误修改Controller方法:// 商品修改提交@RequestMapping("/editIt
emSubmit")public String editItemSubmit(@Validated @ModelAttribute
("item") Items items,BindingResult result,@RequestParam("pictureF
ile") MultipartFile[] pictureFile,Model model)throws Exception {/
/如果存在校验错误则转到商品修改页面if (result.hasErrors()) {List erro
rs = result.getAllErrors();for(ObjectError objectError:errors){Sy
stem.out.println(objectError.getCode());System.out.println(object
Error.getDefaultMessage());}return "item/editItem";}注意:添加@Validat
ed表示在对items参数绑定时进行校验,校验信息写入BindingResult中,在要校验的pojo后边添加BingdingRe
sult, 一个BindingResult对应一个pojo,且BingdingResult放在pojo的后边。商品修改页面显示错误
信息:页头:<%@ page language="java" contentType="text/html; charset=UT
F-8" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/js
p/jstl/core" prefix="c" %><%@ taglib uri="http://java.sun.com/jsp
/jstl/fmt" <%@ taglib prefix="spring" uri="http://www.springframe
work.org/tags" %>在需要显示错误信息地方: :forEach items="${errors.allErrors}" var="error">${error.defaultM
essage }
说明: dErrors name="item">表示如果item参数绑定校验错误下边显示错误信息。上边的方法也可以改为:在controll
er方法中将error通过model放在request域,在页面上显示错误信息:controller方法:if(bindingRe
sult.hasErrors()){model.addAttribute("errors", bindingResult);}页面
${error.defau
ltMessage }
分组校验如果两处校验使用同一个Items类则可以设定校验分组,通过分组校验
可以对每处的校验个性化。需求:商品修改提交只校验商品名称长度定义分组:分组就是一个标识,这里定义一个接口:public inter
face ValidGroup1 {}public interface ValidGroup2 {}指定分组校验:public c
lass Items { private Integer id;//这里指定分组ValidGroup1,此@Size校验只适用Va
lidGroup1校验 @Size(min=1,max=30,message="{item.name.length.error}"
,groups={ValidGroup1.class}) private String name;// 商品修改提交@Reques
tMapping("/editItemSubmit")public String editItemSubmit(@Validate
d(value={ValidGroup1.class}) @ModelAttribute("item") Items items,
BindingResult result,@RequestParam("pictureFile") MultipartFile[]
pictureFile,Model model)throws Exception {在@Validated中添加value={V
alidGroup1.class}表示商品修改使用了ValidGroup1分组校验规则,也可以指定多个分组中间用逗号分隔,@Val
idated(value={ValidGroup1.class,ValidGroup2.class })校验注解@Null被注释的
元素必须为 null@NotNull被注释的元素必须不为 null@AssertTrue被注释的元素必须为 true@Assert
False被注释的元素必须为 false@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @Max(
value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @DecimalMin(value) 被注释的元素必须是一
个数字,其值必须大于等于指定的最小值 @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最
大值 @Size(max=, min=)被注释的元素的大小必须在指定的范围内 @Digits (integer, fraction
)被注释的元素必须是一个数字,其值必须在可接受的范围内 @Past被注释的元素必须是一个过去的日期 @Future被注释的元素必须
是一个将来的日期 @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式 Hibernate Val
idator 附加的 constraint@NotBlank(message =)验证字符串非null,且长度必须大于0@Emai
l 被注释的元素必须是电子邮箱地址 @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内 @NotEm
pty被注释的字符串的必须非空 @Range(min=,max=,message=) 被注释的元素必须在合适的范围内数据回显需求
表单提交失败需要再回到表单页面重新填写,原来提交的数据需要重新在页面上显示。简单数据类型对于简单数据类型,如:Integer、St
ring、Float等使用Model将传入的参数再放到request域实现显示。如下:@RequestMapping(value=
"/editItems",method={RequestMethod.GET})public String editItems(M
odel model,Integer id)throws Exception{//传入的id重新放到request域model.a
ddAttribute("id", id);pojo类型springmvc默认支持pojo数据回显,springmvc自动将形参中
的pojo重新放回request域中,request的key为pojo的类名(首字母小写),如下:controller方法:@Re
questMapping("/editItemSubmit")public String editItemSubmit(Integ
er id,ItemsCustom itemsCustom)throws Exception{springmvc自动将itemsC
ustom放回request,相当于调用下边的代码:model.addAttribute("itemsCustom", items
Custom);jsp页面:页面中的从“itemsCustom”中取数据。如果key不是pojo的类名(首字母小写),可以使用@M
odelAttribute完成数据回显。@ModelAttribute作用如下:1、绑定请求参数到pojo并且暴露为模型数据传到视
图页面此方法可实现数据回显效果。// 商品修改提交@RequestMapping("/editItemSubmit")public
String editItemSubmit(Model model,@ModelAttribute("item") ItemsC
ustom itemsCustom)页面:
如果
不用@ModelAttribute也可以使用model.addAttribute("item", itemsCustom)完成数据
回显。2、将方法返回值暴露为模型数据传到视图页面//商品分类@ModelAttribute("itemtypes")public
Map getItemTypes(){Map itemTypes
= new HashMap();itemTypes.put("101", "数码");itemTyp
es.put("102", "母婴");return itemTypes;}页面:商品类型:file的name与controller形参一致:
json数据交互@RequestBody作用:@RequestBody注解用于读取http请求的内容(字符串),通
过springmvc提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到con
troller方法的参数上。本例子应用:@RequestBody注解实现接收http请求的json数据,将json数据转换为jav
a对象@ResponseBody作用:该注解用于将Controller的方法返回的对象,通过HttpMessageConverte
r接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端本例子应用:@ResponseBody注解实现将
controller方法返回对象转换为json响应给客户端请求json,响应json实现:环境准备Springmvc默认用Mapp
ingJacksonHttpMessageConverter对json数据进行转换,需要加入jackson的包,如下:配置json
转换器在注解适配器中加入messageConverters注意:如果使用 riven /> 则不用定义上边的内容。controller编写// 商品修改提交json信息,响应json信息@RequestM
apping("/editItemSubmit_RequestJson")public @ResponseBody Items e
ditItemSubmit_RequestJson(@RequestBody Items items) throws Except
ion {System.out.println(items);//itemService.saveItem(items);retu
rn items;}页面js方法编写:引入 js:
//请求json响应jsonfunction request_json(){$.ajax({type:"post",url:"${
pageContext.request.contextPath }/item/editItemSubmit_RequestJson
.action",contentType:"application/json;charset=utf-8",data:''{"nam
e":"测试商品","price":99.9}'',success:function(data){alert(data);}});}
测试结果:从上图可以看出请求的数据是json格式请key/value,响应json实现:表单默认请求application/x-w
ww-form-urlencoded格式的数据即key/value,通常有post和get两种方法,响应json数据是为了方便客户
端处理,实现如下:环境准备同第一个例子controller编写// 商品修改提交,提交普通form表单数据,响应json@Requ
estMapping("/editItemSubmit_ResponseJson")public @ResponseBody It
ems editItemSubmit_ResponseJson(Items items) throws Exception {Sy
stem.out.println(items);//itemService.saveItem(items);return item
s;}页面js方法编写:function formsubmit(){var user = " name=测试商品&price=99
.9";alert(user); $.ajax({type:''post'',//这里改为get也可以正常执行url:''${pageC
ontext.request.contextPath}/item/ editItemSubmit_RequestJson.acti
on'',//ContentType没指定将默认为:application/x-www-form-urlencodeddata:us
er,success:function(data){alert(data.name);}})}从上边的js代码看出,已去掉Cont
entType的定义,ContentType默认为:application/x-www-form-urlencoded格式。测试结
果从上图可以看出请求的数据是标准的key/value格式。小结实际开发中常用第二种方法,请求key/value数据,响应json结
果,方便客户端对结果进行解析。RESTful支持需求RESTful方式实现商品信息查询,返回json数据添加DispatcherS
ervlet的rest配置springmvc-servlet-rest et-name>org.springframework.web.servlet.Dispatcher
Servlet
contextConfigLocat
ion
classpath:spring/springmvc.xml m-value>
spr
ingmvc-servlet-rest
/ ervlet-mapping>URL 模板模式映射@RequestMapping(value="/ viewItems/{id}"
):{×××}占位符,请求的URL可以是“/viewItems/1”或“/viewItems/2”,通过在方法中使用@PathVa
riable获取{×××}中的×××变量。@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。@Re
questMapping("/viewItems/{id}") public @ResponseBody viewItems(@P
athVariable("id") String id,Model model) throws Exception{//方法中使用
@PathVariable获取useried的值,使用model传回页面//调用 service查询商品信息ItemsCustom
itemsCustom = itemsService.findItemsById(id);return itemsCustom;
}如果RequestMapping中表示为"/viewItems/{id}",id和形参名称一致,@PathVariable不用指
定名称。静态资源访问如果在DispatcherServlet中设置url-pattern为 /则必须
对静态资源进行访问处理。spring mvc 的实现对
静态资源进行映射访问。如下是对js文件访问配置:拦截器定义Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理
器进行预处理和后处理。拦截器定义实现HandlerInterceptor接口,如下:Public class HandlerInt
erceptor1 implements HandlerInterceptor{/ controller执行前调用此方法
返回true表示继续执行,返回false中止执行 这里可以加入登录校验、权限拦截等 /@OverridePublic b
oolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {// TODO Auto-generated method stubReturn false;}/ controller执行后但未返回视图前调用此方法 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示 /@OverridePublic void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {// TODO Auto-generated method stub}/ controller执行后且视图返回后调用此方法 这里可得到执行controller时的异常信息 这里可记录操作日志,资源清理等 /@OverridePublic void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception {// TODO Auto-generated method stub}}拦截器配置针对某种mapping配置拦截器针对所有mapping配置全局拦截器正常流程测试代码:定义两个拦截器分别为:HandlerInterceptor1和HandlerInteptor2,每个拦截器的preHandler方法都返回true。运行流程HandlerInterceptor1..preHandle..HandlerInterceptor2..preHandle..HandlerInterceptor2..postHandle..HandlerInterceptor1..postHandle..HandlerInterceptor2..afterCompletion..HandlerInterceptor1..afterCompletion..中断流程测试代码:定义两个拦截器分别为:HandlerInterceptor1和HandlerInteptor2。运行流程HandlerInterceptor1的preHandler方法返回false,HandlerInterceptor2返回true,运行流程如下:HandlerInterceptor1..preHandle..从日志看出第一个拦截器的preHandler方法返回false后第一个拦截器只执行了preHandler方法,其它两个方法没有执行,第二个拦截器的所有方法不执行,且controller也不执行了。HandlerInterceptor1的preHandler方法返回true,HandlerInterceptor2返回false,运行流程如下:HandlerInterceptor1..preHandle..HandlerInterceptor2..preHandle..HandlerInterceptor1..afterCompletion..从日志看出第二个拦截器的preHandler方法返回false后第一个拦截器的postHandler没有执行,第二个拦截器的postHandler和afterCompletion没有执行,且controller也不执行了。总结:preHandle按拦截器定义顺序调用postHandler按拦截器定义逆序调用afterCompletion按拦截器定义逆序调用postHandler在拦截器链内所有拦截器返成功调用afterCompletion只有preHandle返回true才调用拦截器应用用户身份认证Public class LoginInterceptor implements HandlerInterceptor{@OverridePublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {//如果是登录页面则放行if(request.getRequestURI().indexOf("login.action")>=0){return true;}HttpSession session = request.getSession();//如果用户已登录也放行if(session.getAttribute("user")!=null){return true;}//用户没有登录挑战到登录页面request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);return false;}}用户登陆controller//登陆提交//userid:用户账号,pwd:密码@RequestMapping("/login")public String loginsubmit(HttpSession session,String userid,String pwd)throws Exception{//向session记录用户身份信息session.setAttribute("activeUser", userid);return "redirect:item/queryItem.action";}//退出@RequestMapping("/logout")public String logout(HttpSession session)throws Exception{//session过期session.invalidate();return "redirect:item/queryItem.action";}学生练习商品查询添加查询条件:商品名称、价格范围添加商品功能开发删除商品功能开发javaEE框架课程
Spring web mvc框架课程SpringMVC架构Spring web mvc介绍Spring web mvc和Struts2都属于
表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来: Web MVCmvc设计模式在b/s系统
下应用:1发起请求C 控制器controller作用:接收请求,响应处理结果,没有业务逻辑5 响应结果M 模型pojoservi
cedao2请求业务处理V 视图 View将模型数据展示给用户4 向view中填充模型数据3返回模型注意:b/s下模型无法将数据设
置到视图中用户发起request请求至控制器(Controller)控制接收用户请求的数据,委托给模型进行处理控制器通过模型(Mo
del)处理数据并得到处理结果模型通常是指业务逻辑模型处理结果返回给控制器控制器将模型数据在视图(View)中展示web中模型无法
将数据直接在视图上显示,需要通过控制器完成。如果在C/S应用中模型是可以将数据在视图中展示的。控制器将视图response响应给用
户通过视图展示给用户要的数据或处理结果。Spring web mvc 架构架构图架构流程用户发送请求至前端控制器Dispatche
rServletDispatcherServlet收到请求调用HandlerMapping处理器映射器。处理器映射器根据请求url
找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。DispatcherS
ervlet通过HandlerAdapter处理器适配器调用处理器执行处理器(Controller,也叫后端控制器)。Contro
ller执行完成返回ModelAndViewHandlerAdapter将controller执行结果ModelAndView返回
给DispatcherServletDispatcherServlet将ModelAndView传给ViewReslover视图解
析器ViewReslover解析后返回具体ViewDispatcherServlet对View进行渲染视图(即将模型数据填充至视图
中)。DispatcherServlet响应用户组件说明以下组件通常使用框架提供实现:DispatcherServlet:前端控制
器用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理
用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。HandlerMapping:处理器映射器Handle
rMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件
方式,实现接口方式,注解方式等。Handler:处理器Handler 是继DispatcherServlet前端控制器的后端控制器
,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,
所以一般情况需要程序员根据业务需求开发Handler。HandlAdapter:处理器适配器通过HandlerAdapter对处理
器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。View Resolver:视图解析器View R
esolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成
View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:
jstlView、freemarkerView、pdfView等。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给
用户,需要由程序员根据业务需求开发具体的页面。商品订单业务说明本教程在通过商品订单业务学习使用springmvc进行功能开发。业务
流程1、管理员维护商品信息2、用户挑选商品,购买,创建订单数据库环境先导入sql_table.sql,再导入 sql_data.s
ql脚本:如下:商品订单数据模型用户表:users记录了购买商品的用户信息Id:唯一标识一个用户订单表:orders记录了用户创建
的订单创建用户:users_id(外键)订单号创建时间订单状态 外键:users_id订单明细表:orderdetail记录了用户
购买信息所属订单:orders_id(外键)商品id:items_id(外键)商品数量商品购买价格外键:orders_id商品信息
:items记录了所有商品信息商品id:id(主键)商品名称:商品介绍商品价格外键:items_id一对多用户可以创建多个订单一对
一:一个订单只能由一个用户创建一对多一个订单包括多个购买明细一对一一个订单明细只能属于一个订单一对一一个明细对应一个商品一对多一个
商品对应多个订单明细通过订单明细表订单表和商品表建立 关系一个订单对应多个商品一个商品对应多个订单订单表和商品表是多对多关系Spr
ingMVC入门需求实现商品查询列表功能。开发环境准备本教程使用Eclipse+tomcat7开发详细参考“Eclipse开发环境
配置-indigo.docx”文档第一步:建立一个Web项目在eclipse下创建动态web工程springmvc_first。第
二步:导入spring3.2.0的jar包第三步:前端控制器配置在WEB-INF\web.xml中配置前端控制器, >springmvcorg.springf
ramework.web.servlet.DispatcherServlet
>contextConfigLocationclass
path:springmvc.xml
1 load-on-startup>springmv
c
.action ing>load-on-startup:表示servlet随服务启动;url-pattern:.action的请交给Dispat
cherServlet处理。contextConfigLocation:指定springmvc配置的加载位置,如果不指定则默认加载
WEB-INF/[DispatcherServlet 的Servlet 名字]-servlet.xml。Servlet拦截方式1、
拦截固定后缀的url,比如设置为 .do、.action, 例如:/user/add.action 此方法最简单,不会导致静态
资源(jpg,js,css)被拦截。 2、拦截所有,设置为/,例如:/user/add /user/add.action此方法可
以实现REST风格的url,很多互联网类型的应用使用这种方式。但是此方法会导致静态文件(jpg,js,css)被拦截后不能正常显示
。需要特殊处理。 3、拦截所有,设置为/,此设置方法错误,因为请求到Action,当action转到jsp时再次被拦截,提示不能
根据jsp路径mapping成功。第四步:springmvc配置文件Springmvc默认加载WEB-INF/[前端控制器的名字]
-servlet.xml,也可以在前端控制器定义处指定加载的配置文件,如下:con
textConfigLocation
classpath:springmvc.x
ml
如上代码,通过contextConfigLocation加载classp
ath下的springmvc.xml配置文件。第五步:配置处理器适配器在springmvc.xml文件配置如下: s="org.springframework.web.servlet.mvc.SimpleControllerHandlerAda
pter"/> SimpleControllerHandlerAdapter:即简单控制器处理适配器,所有实现了org.sprin
gframework.web.servlet.mvc.Controller 接口的Bean作为Springmvc的后端控制器。第六
步:处理器开发public class ItemList1 implements Controller {@Overridepub
lic ModelAndView handleRequest(HttpServletRequest request,HttpSer
vletResponse response) throws Exception {//商品列表List itemsL
ist = new ArrayList();Items items_1 = new Items();items_1.
setName("联想笔记本");items_1.setPrice(6000f);items_1.setDetail("Think
Pad T430 联想笔记本电脑!");Items items_2 = new Items();items_2.setName("
苹果手机");items_2.setPrice(5000f);items_2.setDetail("iphone6苹果手机!");
itemsList.add(items_1);itemsList.add(items_2);//创建modelAndView准备填
充数据、设置视图ModelAndView modelAndView = new ModelAndView();//填充数据mode
lAndView.addObject("itemsList", itemsList);//视图modelAndView.setVi
ewName("order/itemsList");return modelAndView;}}org.springframewo
rk.web.servlet.mvc.Controller:处理器必须实现Controller 接口。ModelAndView:包
含了模型数据及逻辑视图名第七步:配置处理器映射器在springmvc.xml文件配置如下: xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLoca
tion="http://www.springframework.org/schema/beans http://www.spri
ngframework.org/schema/beans/spring-beans-3.2.xsd http://www.spri
ngframework.org/schema/mvc http://www.springframework.org/schema/
mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/cont
ext http://www.springframework.org/schema/context/spring-context-
3.2.xsd http://www.springframework.org/schema/aop http://www.spri
ngframework.org/schema/aop/spring-aop-3.2.xsd http://www.springfr
amework.org/schema/tx http://www.springframework.org/schema/tx/sp
ring-tx-3.2.xsd "> et.handler.BeanNameUrlHandlerMapping" />BeanNameUrlHandlerMapping
:表示将定义的Bean名字作为请求的url,需要将编写的controller在spring容器中进行配置,且指定bean的name
为请求的url,且必须以.action结尾。第八步:处理器配置在springmvc.xml文件配置如下:name="/items1.action":前
边配置的处理器映射器为BeanNameUrlHandlerMapping,如果请求的URL 为“上下文/items1.action
”将会成功映射到ItemList1控制器。第九步:配置视图解析器在springmvc.xml文件配置如下: value="/WEB-INF/jsp/"/> an>InternalResourceViewResolver:支持JSP视图解析viewClass:JstlView表示JSP模
板页面需要使用JSTL标签库,所以classpath中必须包含jstl的相关jar 包;prefix 和suffix:查找视图页面
的前缀和后缀,最终视图的址为:前缀+逻辑视图名+后缀,逻辑视图名需要在controller中返回ModelAndView指定,比如
逻辑视图名为hello,则最终返回的jsp视图地址 “WEB-INF/jsp/hello.jsp”第十步:视图开发创建/WEB-I
NF/jsp/order/itemsList.jsp视图页面:<%@ page language="java" contentTy
pe="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib ur
i="http://java.sun.com/jsp/jstl/core" prefix="c" %><%@ taglib uri
="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.or
g/TR/html4/loose.dtd"> content="text/html; charset=UTF-8">查询商品列表<
body>商品列表: >
商品名称商品价格<
/td>
商品描述
${item.name }${item.price }${item.deta
il }
第十一步:部署在tomcat测试通
过请求:http://localhost:8080/springmvc_first/items1.action,如果页面输出商品列
表就表明我们成功了!DispatcherServletDispathcerServlet作为springmvc的中央调度器存在,D
ispatcherServlet创建时会默认从DispatcherServlet.properties文件加载springmvc所
用的各各组件,如果在springmvc.xml中配置了组件则以springmvc.xml中配置的为准,DispatcherServ
let的存在降低了springmvc各各组件之间的耦合度。HandlerMapping处理器映射器HandlerMapping 负
责根据request请求找到对应的Handler处理器及Interceptor拦截器,将它们封装在HandlerExecution
Chain 对象中给前端控制器返回。BeanNameUrlHandlerMappingBeanNameUrl处理器映射器,根据请求
的url与spring容器中定义的bean的name进行匹配,从而从spring容器中找到bean实例。 rl映射器 -->SimpleUrlHandlerMappingsimpleUrlHandlerM
apping是BeanNameUrlHandlerMapping的增强版本,它可以将url和处理器bean的id进行统一映射配置。
key="/items1.action">controller的bean idcontroller的bean idHandl
erAdapter处理器适配器HandlerAdapter会根据适配器接口对后端控制器进行包装(适配),包装后即可对处理器进行执行
,通过扩展处理器适配器可以执行多种类型的处理器,这里使用了适配器设计模式。SimpleControllerHandlerAdapt
erSimpleControllerHandlerAdapter简单控制器处理器适配器,所有实现了org.springframew
ork.web.servlet.mvc.Controller 接口的Bean通过此适配器进行适配、执行。适配器配置如下: class="org.springframework.web.servlet.mvc.SimpleControllerHandl
erAdapter" />HttpRequestHandlerAdapterHttpRequestHandlerAdapter,h
ttp请求处理器适配器,所有实现了org.springframework.web.HttpRequestHandler 接口的Be
an通过此适配器进行适配、执行。适配器配置如下:Controller实现如下:public class I
temList2 implements HttpRequestHandler {@Overridepublic void hand
leRequest(HttpServletRequest request,HttpServletResponse response
) throws ServletException, IOException {// 商品列表List itemsL
ist = new ArrayList();Items items_1 = new Items();items_1.
setName("联想笔记本");items_1.setPrice(6000f);items_1.setDetail("Think
Pad T430 联想笔记本电脑!");Items items_2 = new Items();items_2.setName("
苹果手机");items_2.setPrice(5000f);items_2.setDetail("iphone5 苹果手机!"
);itemsList.add(items_1);itemsList.add(items_2);// 填充数据request.se
tAttribute("itemsList", itemsList);// 视图request.getRequestDispatc
her("/WEB-INF/jsp/order/itemsList.jsp").forward(request, response
);}}从上边可以看出此适配器器的handleRequest方法没有返回ModelAndView,可通过response修改定义响
应内容,比如返回json数据:response.setCharacterEncoding("utf-8");response.se
tContentType("application/json;charset=utf-8");response.getWriter
().write("json串");注解映射器和适配器Controller的代码@Controllerpublic class I
temList3 {@RequestMapping("/queryItem.action")public ModelAndView
queryItem() {// 商品列表List itemsList = new ArrayList
();Items items_1 = new Items();items_1.setName("联想笔记本");items_1.s
etPrice(6000f);items_1.setDetail("ThinkPad T430 联想笔记本电脑!");Items
items_2 = new Items();items_2.setName("苹果手机");items_2.setPrice(50
00f);items_2.setDetail("iphone6苹果手机!");itemsList.add(items_1);ite
msList.add(items_2);// 创建modelAndView准备填充数据、设置视图ModelAndView mode
lAndView = new ModelAndView();// 填充数据modelAndView.addObject("item
sList", itemsList);// 视图modelAndView.setViewName("order/itemsList
");return modelAndView;}}组件扫描器使用组件扫描器省去在spring容器配置每个controller类的繁
琐。使用 troller注解,多个包中间使用半角逗号分隔 -->RequestMappingHandlerMappi
ng注解式处理器映射器,对类中标记@ResquestMapping的方法进行映射,根据ResquestMapping定义的url匹
配ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象
中封装url对应的方法Method。 从spring3.1版本开始,废除了DefaultAnnotationHandlerMapp
ing的使用,推荐使用RequestMappingHandlerMapping完成注解式处理器映射。配置如下:注解描述:@RequestMapping:定义请求url到
处理器功能方法的映射RequestMappingHandlerAdapter注解式处理器适配器,对标记@ResquestMappi
ng的方法进行适配。从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使
用RequestMappingHandlerAdapter完成注解式处理器适配。配置如下: lass="org.springframework.web.servlet.mvc.method.annotation.Reque
stMappingHandlerAdapter"/>springmvc使用 annotation-driven>自动加载RequestMappingHandlerMapping和RequestMapping
HandlerAdapter,可用在springmvc.xml配置文件中使用替代注解
处理器和适配器的配置。springmvc处理流程源码分析用户发送请求到DispatherServlet前端控制器Dispather
Servlet调用HandlerMapping(处理器映射器)根据url查找Handler DispatherServlet调用H
andlerAdapter(处理器适配器)对HandlerMapping找到Handler进行包装、执行。HandlerAdapt
er执行Handler完成后,返回了一个ModleAndView(springmvc封装对象)DispatherServlet 找
一个合适的适配器: 适配器执行HanlderDispatherServlet拿着ModelAndView调用ViewResolve
r(视图解析器)进行视图解析,解析完成后返回一个View(很多不同视图类型的View)视图解析:DispatcherServlet
进行视图渲染,将Model中数据放到request域,在页面展示将model数据放在request域:整合mybatis为了更好的
学习 springmvc和mybatis整合开发的方法,需要将springmvc和mybatis进行整合。整合目标:控制层采用sp
ringmvc、持久层使用mybatis实现。需求实现商品查询列表,从mysql数据库查询商品信息。jar包包括:spring(包
括springmvc)、mybatis、mybatis-spring整合包、数据库驱动、第三方连接池。参考:“mybatis与sp
ringmvc整合全部jar包”目录 Dao目标:1、spring管理SqlSessionFactory、mapper详细参考my
batis教程与spring整合章节。db.propertiesjdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatisjdbc.username=XXXXjdb
c.password=XXXXlog4j.properties# Global logging configuration,建议开
发环境中要用debuglog4j.rootLogger=DEBUG, stdout# Console output...log4j
.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.s
tdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.
layout.ConversionPattern=%5p [%t] - %m%nsqlMapConfig.xml在classpat
h下创建mybatis/sqlMapConfig.xml ?> EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><
!—使用自动扫描器时,mapper.xml文件如果和mapper.java接口在一个目录则此处不用定义mappers --> ppers> ation>applicationContext-dao.xml配置数据源、事务管理,配置SqlSessionFactory、ma
pper扫描器。 "http://www.springframework.org/schema/mvc"xmlns:context="http://
www.springframework.org/schema/context"xmlns:aop="http://www.spri
ngframework.org/schema/aop" xmlns:tx="http://www.springframework.
org/schema/tx"xsi:schemaLocation="http://www.springframework.org/
schema/beans http://www.springframework.org/schema/beans/spring-b
eans-3.2.xsd http://www.springframework.org/schema/mvc http://www
.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.spr
ingframework.org/schema/context http://www.springframework.org/sc
hema/context/spring-context-3.2.xsd http://www.springframework.or
g/schema/aop http://www.springframework.org/schema/aop/spring-aop
-3.2.xsd http://www.springframework.org/schema/tx http://www.spri
ngframework.org/schema/tx/spring-tx-3.2.xsd "> text:property-placeholder location="classpath:db.properties"/> - 数据库连接池 --> operty name="password" value="${jdbc.password}"/>
> d="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactory
Bean"> /> ="classpath:mybatis/SqlMapConfig.xml" />


<
/property>
ItemsMapper.xml encoding="UTF-8" ?> pper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> r namespace="cn.itcast.ssm.mapper.ItemsMapper"> test="items.name!=null and items.name!=''''">and items.name like ''
%${items.name}%''
"price"/>Contrller方法定义如下:@RequestMapping("/editItemSubmit")public
String editItemSubmit(Items items)throws Exception{System.out.pr
intln(items);请求的参数名称和pojo的属性名称一致,会自动将请求参数赋值给pojo的属性。包装pojo如果采用类似s
truts中对象.属性的方式命名,需要将pojo对象作为一个包装对象的属性,action中以该包装对象作为形参。包装对象定义如下:
Public class QueryVo {private Items items;}页面定义:Con
troller方法定义如下:public String useraddsubmit(Model model,QueryVo que
ryVo)throws Exception{System.out.println(queryVo.getItems());自定义参
数绑定需求根据业务需求自定义日期格式进行参数绑定。Converter自定义Converterpublic class Custom
DateConverter implements Converter {@Overridepublic
Date convert(String source) {try {SimpleDateFormat simpleDateFor
mat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return simpleDa
teFormat.parse(source);} catch (Exception e) {e.printStackTrace()
;}return null;}}配置方式1 erty name="converters">配置方式2(
自学) ethod.annotation.RequestMappingHandlerAdapter"> me="conversionService" ref="conversionService" /> - 转换器 --> >集合类字符串数组页面定义如下:页面选中多个checkbox向controller方法传递 ="item_id" value="002"/> ue="002"/>传递到controller方法中的格式是:001,002,003Controller方法中可以用String[
]接收,定义如下:public String deleteitem(String[] item_id)throws Excepti
on{System.out.println(item_id);}ListList中存放对象,并将定义的List放在包装类中,act
ion使用包装对象接收。List中对象:成绩对象Public class QueryVo {Private List
itemList;//商品列表 //get/set方法..}包装类中定义List对象,并添加get/set方法如下:页面定义如下
e="${item.name }"/>
ype="text" name=" itemsList[1].name" value="${item.name }"/>
type="text" name="itemsList[${s.index }].price" value="${item.pr
ice }"/>
学生信息:姓名: "itemInfo[''name'']"/>年龄: >.. .. ..
商品名称 ="name" value="${item.name }"/>
商品价格 put type="text" name="price" value="${item.price }"/>
商品图片 t="${item.pic !=null}"> ht=100 />
td>
献花(0)
+1
(本文系郝总CTO原创)