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配置文件中修改:
定义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接口。提供了这个接口中所有方法的空实现。
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);
// }
}