二、SpringMvc 进阶

来源:互联网 发布:mac地址 冲突 编辑:程序博客网 时间:2024/06/07 22:06

1、参数绑定

  • 在controller方法 形参中 添加HttpServletRequest request参数,通过request接收查询条件参数。
  • 在形参中让包装类型的pojo接收查询条件参数。

1.1、pojo属性绑定

  • 页面参数
     <input name="itemsEx.name" />
注意:itemsEx和包装pojo中的属性一致即可。
  • controller方法形参 

         public  ModelAndView queryItems(HttpServletRequest request, ItemsQueryVo itemsQueryVo)throws Exception

public class ItemsQueryVo {//商品信息private Items items;//原始生成的商品po进行扩展private ItemsEx itemsEx;


1.2、集合类型绑定

1.2.1、数组绑定

  • 页面参数
<c:forEach items="${itemsList }" var="item"><tr><td><input type="checkbox" name="items_id" value="${item.id}"/></td><td>${item.name }</td><td>${item.price }</td><td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td><td>${item.detail }</td><td><a href="${pageContext.request.contextPath }/items/editItems.action?id=${item.id}">修改</a></td></tr></c:forEach>
  • controller方法接收页面参数
@RequestMapping("/deleteItems")public String deleteItems(Integer[] items_id) throws Exception {.....}

1.2.2、list绑定

  • 页面参数
<c:forEach items="${itemsList }" var="item" varStatus="status"><tr><td><input name="itemsList[${status.index }].name" value="${item.name }"/></td><td><input name="itemsList[${status.index }].price" value="${item.price }"/></td><td><input name="itemsList[${status.index }].createtime" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td><td><input name="itemsList[${status.index }].detail" value="${item.detail }"/></td></tr></c:forEach>


  • controller方法接收页面参数
public ModelAndView editItemsQuery(HttpServletRequest request,ItemsQueryVo itemsQueryVo) throws Exception {

  • ItemsQueryVo定义
public class ItemsQueryVo {//商品信息private Items items;//原始生成的商品po进行扩展private ItemsEx itemsEx;//批量商品信息private List<ItemsEx> itemsList;

1.2.3、map绑定

  • 页面参数
<td>姓名:<inputtype="text"name="itemInfo['name']"/>年龄:<inputtype="text"name="itemInfo['price']"/>.. .. ..</td>

  • controller接收参数
public String useradd (Model model,QueryVo queryVo)throws Exception{ }
  • QueryVo 定义
Public class QueryVo {private Map<String, Object> itemInfo = new HashMap<String, Object>();  //get/set方法..}

2、数据回显

pojo数据传入controller方法后,springmvc自动将pojo数据放到request域,key等于pojo类型(首字母小写)
使用@ModelAttribute指定pojo回显到页面在request中的key

使用最简单方法使用model,可以不用@ModelAttribute
model.addAttribute("id", id);


3、文件上传

3.1、配置SpringMVc.xml 


<!-- 文件上传 --><bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="defaultEncoding" value="utf-8"></property>  <property name="maxUploadSize" value="10485760000"></property><!-- 最大上传文件大小 -->  <property name="maxInMemorySize" value="10960"></property></bean>



3.2、jar包

commons-fileupload-1.2.2.jarcommons-io-2.4.jar

3.3、页面代码

<body><form action="${pageContext.request.contextPath }/congxing/ssm/user/upload.action" method="post" enctype="multipart/form-data"> <input type="file" name="pic" /></br><input type="submit" value="上传"></form></body>


3.4、controller

@RequestMapping("upload")public ModelAndView  upload(MultipartFile pic) throws Exception{ String originalFilename = pic.getOriginalFilename();//上传图片if(pic!=null && originalFilename!=null && originalFilename.length()>0){ //存储图片的物理路径String pic_path = "F:\\upload\\";  //新的图片名称String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));//新图片File newFile = new File(pic_path+newFileName); //将内存中的数据写入磁盘pic.transferTo(newFile); }ModelAndView mv = new ModelAndView(); mv.setViewName("upload"); return mv;}

另一种

@RequestMapping("upload")public ModelAndView  upload(@RequestParam("pic") CommonsMultipartFile pic) throws Exception{ String originalFilename = pic.getOriginalFilename();//上传图片if(pic!=null && originalFilename!=null && originalFilename.length()>0){ //存储图片的物理路径String pic_path = "F:\\upload\\";  //新的图片名称String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));//新图片File newFile = new File(pic_path+newFileName); //将内存中的数据写入磁盘pic.transferTo(newFile); }ModelAndView mv = new ModelAndView(); mv.setViewName("upload"); return mv;}


4、json数据交互


4.1、常见用法

1、请求json、输出json,要求请求的是json串,所以在前端页面中需要将请求的内容转成json,不太方便。 

2、请求key/value、输出json。此方法比较常用

4.2、jar包

springmvc中使用jackson的包进行json转换(@requestBody和@responseBody使用jackson进行json转换)

下载地址:http://download.csdn.net/detail/hxskmx/8833313

4.3、配置json转换器

在注解适配器中加入messageConverters

<!--注解适配器 --><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><property name="messageConverters"><list><span style="white-space:pre"></span><bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean></list></property></bean>
如果使用<mvc:annotation-driven /> 则不用定义上边的内容。

4.4、json交互测试

4.4.1、请求json串,返回json串

  • 页面
//请求json,输出是jsonfunction requestJson(){ $.ajax({type:'post',url:'${pageContext.request.contextPath }/requestJson.action',contentType:'application/json;charset=utf-8',//数据格式是json串data:'{"username":"mx","address":"广州"}',success:function(data){//返回json结果alert(data.username);} });  }


  • controller
@RequestMapping("/requestJson")public @ResponseBody User requestJson(@RequestBody User user){System.out.println(user);return user;}


4.4.2、 请求Key/Value数据,返回Json串

  • 页面
//请求key/value,输出是jsonfunction responseJson(){$.ajax({type:'post',url:'${pageContext.request.contextPath }/responseJson.action',//请求是key/value这里不需要指定contentType,因为默认就 是key/value类型//contentType:'application/json;charset=utf-8',//数据格式是json串data:'username=mx&address=广州',success:function(data){//返回json结果alert(data.username);}});}


  • controller

<span style="font-weight: normal;"><span style="font-size:12px;">@RequestMapping("/responseJson")public @ResponseBody User responseJson(User user){System.out.println(user);return user;}</span></span>

4、拦截器

4.1、拦截器定义


<span style="font-weight: normal;">//定义拦截器,实现HandlerInterceptor接口。接口中提供三个方法。public class HandlerInterceptor1 implements HandlerInterceptor {//进入 Handler方法之前执行//用于身份认证、身份授权//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {//return false表示拦截,不向下执行//return true表示放行return false;}//进入Handler方法之后,返回modelAndView之前执行//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图@Overridepublic void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {}//执行Handler完成执行此方法//应用场景:统一异常处理,统一日志处理@Overridepublic void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception {}}</span>

4.2、拦截器配置

4.2.1、针对HandlerMapping配置

springmvc拦截器针对HandlerMapping进行拦截设置,如果在某个HandlerMapping中配置拦截,经过该 HandlerMapping映射成功的handler最终使用该 拦截器。
<beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"><property name="interceptors"><list><ref bean="handlerInterceptor1"/><ref bean="handlerInterceptor2"/></list></property></bean><bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/><bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>



4.2.2、类似全局的拦截器

springmvc配置类似全局的拦截器,springmvc框架将配置的类似全局的拦截器注入到每个HandlerMapping中

<!--拦截器 --><mvc:interceptors><!--多个拦截器,顺序执行 --><!-- 登陆认证拦截器 --><mvc:interceptor><mvc:mapping path="/**"/><bean class="cn.congxing.ssm.interceptor.LoginInterceptor"></bean></mvc:interceptor><mvc:interceptor><!-- /**表示所有url包括子url路径 --><mvc:mapping path="/**"/><bean class="cn.congxing.ssm.interceptor.HandlerInterceptor1"></bean></mvc:interceptor><mvc:interceptor><mvc:mapping path="/**"/><bean class="cn.congxing.ssm.interceptor.HandlerInterceptor2"></bean></mvc:interceptor></mvc:interceptors>

 




0 0