spring 之 springMVC 学习2

spring 处理ajax请求
spring使用了jackson类库,帮助我们在java对象和json、xml数据之间的互相转换。他可以将控制器返回的对象直接转换成json数据,供客户端使用。客户端也可以传送json数据到服务器进行直接转换。使用步骤如下:
 
1.  项目中需要引入如下两个jar包:
jackson-core-asl-1.7.2jar
jackson-mapper-asl-1.7.2jar
2.  spring配置文件中修改:

	<!-- 有关ajax的配置             完成请求和注解POJO的映射 -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
        <property name="cacheSeconds" value="0" />  
        <property name="messageConverters">  
            <list>  
                <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>  
            </list>  
        </property>
    </bean>  
	

发出的请求必须加上此头 req.setRequestHeader("accept","application/json"); spring才知道发出的是ajax请求

客户端代码如下:

<script>
		function createAjaxObj(){
			var req;
			if(window.XMLHttpRequest){
				req = new XMLHttpRequest();
			}else{
				req = new ActiveXObject("Msxml2.XMLHTTP");  //ie
			}
			return req;
		}
		
		function sendAjaxReq(){
			var req = createAjaxObj();
			req.open("get","ajax.do?method=test1&uname=张三");
			req.setRequestHeader("accept","application/json"); //必须加上此头,spring才知道发出的是ajax请求
			req.onreadystatechange  = function(){
				eval("var result="+req.responseText); //eval函数
				document.getElementById("div1").innerHTML=result[0].uname;
			}
			req.send(null);
		}
	</script>

  服务器端代码如下:

@Controller
@RequestMapping("ajax.do")
public class AjaxController {
	@RequestMapping(params="method=test1",method=RequestMethod.GET)
	public @ResponseBody List<User> test1(String uname) throws Exception//@ResponseBody此注解用于处理ajax请求 返回值可以是任何值,spring会自动转换为json对象
	{ 
		String uname2 = new String(uname.getBytes("iso8859-1"),"utf-8");
		System.out.println(uname2); 
		System.out.println("AjaxController.test1()");
		List<User> list = new ArrayList<User>();
		list.add(new User("大家","123"));
		list.add(new User("斯柯达","456"));
		
		return list;//注意返回此时值可以不再是一般的String
	}

}
Spring中的拦截器
定义spring拦截器两种基本方式
1. 实现接口:org.springframework.web.servlet.HandlerInterceptor。
接口中有如下方法需要重写:
注意:参数中的Object handler是下一个拦截器。
a) public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception
该方法在action执行前执行,可以实现对数据的预处理,比如:编码、安全控制等。
如果方法返回true,则继续执行action。
b) public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
该方法在action执行后,生成视图前执行。在这里,我们有机会修改视图层数据。
c) public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) throws Exception
最后执行,通常用于释放资源,处理异常。我们可以根据ex是否为空,来进行相关的异常处理。因为我们在平时处理异常时,都是从底层向上抛出异常,最后到了spring框架从而到了这个方法中。
2.继承适配器:org.springframework.web.servlet.handler.HandlerInterceptorAdapter
这个适配器实现了HandlerInterceptor接口。提供了这个接口中所有方法的空实现。
public class Interceptor1 implements HandlerInterceptor {
	@Override
	public void afterCompletion(HttpServletRequest request,	HttpServletResponse response, Object handler, Exception ex)	throws Exception {
		System.out.println("最后执行!!!一般用于释放资源!!");
		
	}
	@Override
	public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,	ModelAndView modelAndView) throws Exception {
		System.out.println("Action执行之后,生成视图之前执行!!");
	}
	@Override
	public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
		System.out.println("action之前执行!!!");
		return true;  //继续执行action
	}
}

/*XML中如何配置。如下为示例代码:
<mvc:interceptors>
	<bean class="com.sxt.interceptor.MyInterceptor"></bean> <!-- 拦截所有springmvc的url! -->
	<mvc:interceptor>
		<mvc:mapping path="/user.do" />
		<!--<mvc:mapping path="/test/*" />-->
		<bean class="com.sxt.interceptor.MyInterceptor2"></bean>
	</mvc:interceptor>
</mvc:interceptors>
*/
public class Interceptor2 extends HandlerInterceptorAdapter {

	@Override
	public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
		System.out.println("MyInterceptor2.preHandle()");
		return true;  //继续执行action
	}
//下面的根据需要而定
//	@Override
//	public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception {
//		super.afterCompletion(request, response, handler, ex);
//	}
//
//	@Override
//	public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {
//		super.postHandle(request, response, handler, modelAndView);
//	}
}




你可能感兴趣的:(spring,exception,object,Interceptor,XMLhttpREquest,action)