二、SpringMvc 进阶

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.jar

commons-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,输出是json
function 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,输出是json
function 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方法之前执行
	//用于身份认证、身份授权
	//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		
		//return false表示拦截,不向下执行
		//return true表示放行
		return false;
	}

	//进入Handler方法之后,返回modelAndView之前执行
	//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		
		
	}

	//执行Handler完成执行此方法
	//应用场景:统一异常处理,统一日志处理
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		
		
	}

}</span>

4.2、拦截器配置

4.2.1、针对HandlerMapping配置

springmvc拦截器针对HandlerMapping进行拦截设置,如果在某个HandlerMapping中配置拦截,经过该 HandlerMapping映射成功的handler最终使用该 拦截器。
<bean
	class="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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值