1,数据回显

    SpringMvc包含三种数据回显机制

第一种:对于简单数据类型,如:Integer、String、Float等使用Model将传入的参数再放到request域实现显示。

(回顾jsp四大域:ServletContext context域、HttpServletRequet request域、HttpSession session域、PageContext page域)

@RequestMapping(value="/editItems",method={RequestMethod.GET})
public String editItems(Model model,Integer id)throws Exception{
		
	//传入的id重新放到request域
	model.addAttribute("id", id);
}

第二种:对于Pojo类型,SpringMvc 默认支持方法参数中的pojo类型的参数回显。自动将形参中的pojo类放入jsp页面request域中。

request的key为pojo的类名(首字母小写)

@RequestMapping("/editItemSubmit")
public String editItemSubmit(Integer id,ItemsCustom itemsCustom)throws Exception{
   //...
}
springmvc自动将itemsCustom放回request,相当于调用下边的代码:
model.addAttribute("itemsCustom", itemsCustom);

第三种:对于方法返回值 暴露为模型数据传到视图页面

//商品分类
@ModelAttribute("itemtypes")
public Map<String, String> getItemTypes(){
		
	Map<String, String> itemTypes = new HashMap<String,String>();
	itemTypes.put("101", "数码");
	itemTypes.put("102", "母婴");
		
	return itemTypes;
}

2,异常处理

springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。

         系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:

Spring Mvc 6 杂记(二)

第一步:自定义异常类

为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。

public class CustomException extends Exception {

	/** serialVersionUID*/
	private static final long serialVersionUID = -5212079010855161498L;
	
	public CustomException(String message){
		super(message);
		this.message = message;
	}

	//异常信息
	private String message;

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
}

第二步:定义自定义异常处理器

public class CustomExceptionResolver implements HandlerExceptionResolver {

	@Override
	public ModelAndView resolveException(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex) {

		ex.printStackTrace();

		CustomException customException = null;
		
		//如果抛出的是系统自定义异常则直接转换
		if(ex instanceof CustomException){
			customException = (CustomException)ex;
		}else{
			//如果抛出的不是系统自定义异常则重新构造一个未知错误异常。
			customException = new CustomException("未知错误,请与系统管理 员联系!");
		}
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.addObject("message", customException.getMessage());
		modelAndView.setViewName("error");

		return modelAndView;
	}

}

前台页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>错误页面</title>

</head>
<body>
您的操作出现错误如下:<br/>
${message }
</body>

</html>

第三步:异常处理器配置

在springmvc.xml中添加:

<!-- 异常处理器 -->
	<bean id="handlerExceptionResolver" class="com.xiaohui.exceptionResolver.CustomExceptionResolver"/>

3,文件上传

第一步:配置文件上传解析器:

<!-- 文件上传 -->
<bean id="multipartResolver" 
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<!-- 设置上传文件的最大尺寸为5MB -->
	<property name="maxUploadSize">
		<value>5242880</value>
	</property>
</bean>

第二步:导入解析器依赖jar包

CommonsMultipartResolver解析器依赖commons-fileupload和commons-io,加入如下jar包:

Spring Mvc 6 杂记(二)

第三步:编写上传文件Controller方法:

//商品修改提交
@RequestMapping("/editItemSubmit")
public String editItemSubmit(Items items, MultipartFile pictureFile)throws Exception{
		
		//原始文件名称
		String pictureFile_name =  pictureFile.getOriginalFilename();
		//新文件名称
		String newFileName = UUID.randomUUID().toString()+pictureFile_name.substring(pictureFile_name.lastIndexOf("."));
		
		//上传图片
		File uploadPic = new java.io.File("F:/develop/upload/temp/"+newFileName);
		
		if(!uploadPic.exists()){
			uploadPic.mkdirs();
		}
		//向磁盘写文件
		pictureFile.transferTo(uploadPic);

            //.....
}


前台页面:

form添加enctype="multipart/form-data":
<form id="itemForm"
		action="${pageContext.request.contextPath }/item/editItemSubmit.action"
		method="post" enctype="multipart/form-data">
		<input type="hidden" name="pic" value="${item.pic }" />
</from>


file的name与controller形参一致:
<tr>
	<td>商品图片</td>
	<td>
            <c:if test="${item.pic !=null}">
		    <img src="/pic/${item.pic}" width=100 height=100 /><br/>
	    </c:if> 
            <input type="file" name="pictureFile" />
        </td>
</tr>

5,JSON交互

@RequestBody:

@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上。

@ResponseBody

该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端

场景1:请求参数为json,响应结果为json实现

第一步:环境准备

Springmvc默认用MappingJacksonHttpMessageConverter对json数据进行转换,需要加入jackson的包,如下

Spring Mvc 6 杂记(二)

第二步:配置json转换器

在注解适配器中加入messageConverters

<!--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
	<property name="messageConverters">
	    <list>
	        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
	    </list>
	</property>
</bean>

注意:如果使用<mvc:annotation-driven /> 则不用定义上边的内容。

第三步:controller编写

// 商品修改提交json信息,响应json信息
@RequestMapping("/editItemSubmit_RequestJson")
public @ResponseBody Items editItemSubmit_RequestJson(@RequestBody Items items) throws Exception {
	System.out.println(items);
	//itemService.saveItem(items);
	return items;
}

地四步:页面ajax如下:

//请求json响应json
function request_json(){
	$.ajax({
		type:"post",
		url:"${pageContext.request.contextPath }/item/editItemSubmit_RequestJson.action",
		contentType:"application/json;charset=utf-8",
		data:'{"name":"测试商品","price":99.9}',
		success:function(data){
			console.log(data);
		}
	});
}

场景二:请求参数形式为 键值对非json格式

步骤一、二 同上。

步骤三 controller编写

// 商品修改提交,提交普通form表单数据,响应json
@RequestMapping("/editItemSubmit_ResponseJson")
public @ResponseBody Items editItemSubmit_ResponseJson(Items items) throws Exception {

	System.out.println(items);

//	itemService.saveItem(items);
	return items;
}

步骤四:页面js ajax方法编写

function formsubmit(){
	var user = " name=测试商品&price=99.9";
	alert(user);
	  $.ajax(
		{
			type:'post',//这里改为get也可以正常执行
			url:'${pageContext.request.contextPath}/item/ editItemSubmit_RequestJson.action',
//ContentType没指定将默认为:application/x-www-form-urlencoded
			data:user,
			success:function(data){
				alert(data.name);
			}
			
		}	
	)
}

从上边的js代码看出,已去掉ContentType的定义,ContentType默认为:application/x-www-form-urlencoded格式。

6,RESTful

采用的为模板模式映射。

@RequestMapping(value="/ viewItems/{id}"){×××}占位符,请求的URL可以是“/viewItems/1”或“/viewItems/2”,通过在方法中使用@PathVariable获取{×××}中的×××变量。

@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。

@RequestMapping("/viewItems/{id}") 
public @ResponseBody viewItems(@PathVariable("id") String id,Model model) throws Exception{
	//方法中使用@PathVariable获取useried的值,使用model传回页面
	//调用 service查询商品信息
	ItemsCustom itemsCustom = itemsService.findItemsById(id);
	return itemsCustom;
}

如果RequestMapping中表示为"/viewItems/{id}"id和形参名称一致,@PathVariable不用指定名称。

7,拦截器

Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。

拦截器定义:实现HandlerInterceptor接口,如下

Public class HandlerInterceptor1 implements HandlerInterceptor{

	/**
	 * controller执行前调用此方法
	 * 返回true表示继续执行,返回false中止执行
	 * 这里可以加入登录校验、权限拦截等
	 */
	@Override
	Public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		// TODO Auto-generated method stub
		Return false;
	}
	/**
	 * controller执行后但未返回视图前调用此方法
	 * 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示
	 */
	@Override
	Public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		
	}
	/**
	 * controller执行后且视图返回后调用此方法
	 * 这里可得到执行controller时的异常信息
	 * 这里可记录操作日志,资源清理等
	 */
	@Override
	Public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		
	}

}

拦截器配置:

第一种:针对某种mapping配置拦截器

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

第二种:针对所有配置全局拦截器:

<!--拦截器 -->
<mvc:interceptors>
	<!--多个拦截器,顺序执行 -->
	<mvc:interceptor>
		<mvc:mapping path="/**"/>
		<bean class="com.xiaohui.filter.HandlerInterceptor1"></bean>
	</mvc:interceptor>
	<mvc:interceptor>
		<mvc:mapping path="/**"/>
		<bean class="com.xiaohui.filter.HandlerInterceptor2"></bean>
	</mvc:interceptor>
</mvc:interceptors>

测试运行打印结果

HandlerInterceptor1..preHandle..
HandlerInterceptor2..preHandle..

HandlerInterceptor2..postHandle..
HandlerInterceptor1..postHandle..

HandlerInterceptor2..afterCompletion..
HandlerInterceptor1..afterCompletion..

 

相关文章:

  • 2021-10-15
  • 2022-12-23
  • 2022-12-23
  • 2021-05-19
  • 2021-10-29
  • 2022-01-15
  • 2021-10-26
  • 2021-10-18
猜你喜欢
  • 2021-09-08
  • 2021-10-19
  • 2021-12-04
  • 2021-06-30
  • 2021-07-19
  • 2022-01-08
  • 2021-10-05
相关资源
相似解决方案