Springmvc中的转发重定向和拦截器的示例
本文介绍了Springmvc中的转发重定向和拦截器的示例,分享给大家,具体如下:
可变参数在设计方法时,使用数据类型...来声明参数类型,例如:publicstaticvoidfunction(int...numbers)
在实现方法体时,可变参数是作为数组来处理
publicclassTest{
publicstaticvoidmain(String[]args){
System.out.println(Test.sum(1,2,3));
System.out.println(Test.sum(1,2,3,4,54));
}
publicstaticintsum(int...numbers){
intsum=0;
for(inti=0;i
注意:每个方法中,最多只允许存在1个可变参数,并且,如果存在可变参数,那么必须是最后一个参数
转发和重定向
在控制器内部处理请求的方法中,默认返回字符串时的处理方式是转发,转发的值是view组件的名称,比如return"login",实质上会根据视图解析器(ViewResolver)得到最终负责显示的页面,而通过returnredirect:路径这样的语法表示重定向,在redirect:右侧的内容是路径,这个路径通常使用相对的路径,是以当前客户端的地址栏中的路径为标准进行参考,例如当前的地址为:http://localhost:8080/Project/user/reg.do,然后return"redirect:login.do",则会重定向到http://localhost:8080/Project/user/login.do,如果return"redirect:/main/index.do"或者return"redirect:../main/index.do",则会重定向到http://localhost:8080/Project/main/index.do
forward:
默认的方式,但是也是可以使用return"forward:login"
返回的一定是一个view,经过视图解析器之后会转发到指定的视图
redirect:
重定向:return"redirect:login.do"
返回的是一个Controller方法的路径,而不是一个view,这个不会经过视图解析器,而是直接跳转
实例
@RequestMapping(value="/handle_reg.do",method=RequestMethod.POST)
publicStringhandleReg(Useruser,ModelMapmap){
try{
userService.reg(user);
System.out.println("注册成功!");
return"redirect:login.do";//重定向到login.do这个控制方法,login.do对应的就是转发到login.jsp
}catch(UsernameConflictExceptione){
System.out.println(e.getMessage());
map.put("errorMessage",e.getMessage());
return"error";
}
}
@RequestMapping(value="login.do")
publicStringhandleLogin(){
return"login";
}
拦截器
基本概念
- 拦截器(interceptor)是springmvc中的一个组件,是运行在DispatcherServlet之后,运行在Controller之前的
- 拦截器可以决定对某些符合条件的进行拦截或者放行,所以,通常用于对一些具有相同运行条件的功能进行约束
使用拦截器
自定义拦截器类
创建一个拦截类(DemoInterceptor),实现HandlerInterceptor接口
publicclassDemoInterceptorimplementsHandlerInterceptor{
/**
*处理器执行之前调用
*@paramrequestHttpServletRequest对象,可以获取请求参数等等
*@paramresponseHttpServletResponse对象
*@paramHandler拦截器的Controller对象
*@return如果返回false,就会中断处理流程,不会处理后续的拦截器和Controller。如果返回true,则会执行后续的拦截器和处理器
*/
publicbooleanpreHandle(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler)throwsException{
System.out.println("DemoInterceptor的PreHandler执行");
returntrue;
}
/**
*处理器执行之后调用,跳转到指定视图之前调用
*@paramrequestHttpServletRequest对象
*@paramresponseHttpServletResponse对象
*@paramHandler拦截器的Controller对象
*@parammodelAndViewModelAndView对象,其中存放的是处理结果和视图的信息
*/
publicvoidpostHandle(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler,
ModelAndViewmodelAndView)throwsException{
/**
*1.可以自己设计逻辑,例如某些情况下返回false,返回true
*2.返回true表示执行后续的处理器和拦截器,返回false会中断处理流程
*/
System.out.println("handler:"+handler);
System.out.println("DemoInterceptor的PostHandler执行");
//设置视图的名称,那么执行完成之后就会条跳转到index.jsp页面
//modelAndView.setViewName("index");
}
/**
*请求处理完成之后调用
*/
publicvoidafterCompletion(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler,Exceptionex)
throwsException{
System.out.println("DemoInterceptor的afterCompletion执行");
}
}
在springmvc的配置文件中配置
- 配置拦截的路径:
可以使用通配符*比如:/**匹配所有的路径,/user/*只能匹配/user的子路径
- 配置不拦截的路径:
可以配置多个
- 配置拦截器类(bean):
配置
必须按照上面的顺序配置,否则将会报错
其中实现的方法
publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)
- 该方法在controller处理请求之前执行
- 如果返回的false,则会中断处理流程,不会执行后续的拦截器和处理器,返回true会执行后续的拦截器和处理器
- 可以自行设计逻辑返回false或者true
publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)
- 处理器执行之后,视图处理之前调用,此时可以通过对ModelAndView对数据和视图进行处理
- 当然需要prehandler方法返回true才会执行
publicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)
- 所有的请求处理完毕之后调用,比如性能监控中,我们可以在此记录结束时间和消耗时间,还可以进行一些资源处理
- 当然需要prehandler方法返回true才会执行
演示登录检查
- 登录检查:当涉及到用户信息的修改,查看什么的,必须要验证是否登录,因此需要设计拦截器验证登录
- 先设定登录数据,即:在login.jsp中添加登录按钮,登录完成之后,需要自己定义一个标记存储在session中,比如用户的id或者用户的对象
- 我们使用用户的id作为标记验证是否已经的登录,如果用户登录成功,会在session中添加一个uid的属性
- 用户退出登录使用session.invalidate();清除session,并且重定向到登录界面
自定义拦截器(LoginInterceptor)
具体流程在prehandler方法中写的很清楚
publicclassLoginInterceptorimplementsHandlerInterceptor{
/*
*在处理器执行之前调用(non-Javadoc)
*1.获取session
*2.读取session中的uid的值
*如果为null,表示没有登录,那么直接重定向到登录界面,同时返回false,不需要执行后面的流程了
*如果不为null,表示已经登录了,那么直接返回true,继续执行后面的拦截器或者处理器
*/
publicbooleanpreHandle(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler)throwsException{
HttpSessionsession=request.getSession();//获取session
Objectuid=session.getAttribute("uid");//读取session中的对象
//如果uid存在,那么即可登录完成
if(uid!=null){
returntrue;//返回true,登录成功就需要执行后续的流程
}
response.sendRedirect(request.getContextPath()+"/user/login.do");//重定向到登录界面
returnfalse;//返回false,后面的流程也不用执行了,直接中断
}
publicvoidpostHandle(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler,
ModelAndViewmodelAndView)throwsException{
}
publicvoidafterCompletion(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler,Exceptionex)
throwsException{
}
}
springmvc中配置拦截器
由于这里只是跳转到用户中心需要验证登录,那么只是匹配了user_center.do
多个拦截器的执行顺序
根据在springmvc配置文件中配置的顺序执行,即是在下配置的拦截器的顺序,如果对同一个路径进行了拦截器,那么先配置的先拦截
拦截器和过滤器的区别(主要的区别)
- 拦截器是springmvc中,仅仅当使用springmvc才可以使用拦截器,过滤器是JavaEE体系中的,无论使用哪种框架都可以使用过滤器
- 拦截器在DispatcherServlet之后,在处理器之前执行,过滤器在DispatcherServlet之前执行
- 过滤器会在所有的servlet之前执行(所有的请求都会执行),而拦截器会在springmvc中DispatcherServlet之后执行,所以过滤器在项目中可以过滤任何请求(只要是配置了对应的路径),而拦截器只会在DispatcherServlet处理的请求的基础之上进行拦截
总结
当多种请求都需要做相同或者极为相似的任务时,可以使用拦截器
开发好拦截器,那么需要在springmvc的配置文件中配置
在可以有如果若干个,即是配置若干个拦截器,配置的多个拦截器将会形成拦截器链,如果配置多个拦截器对同一个路径都会拦截,那么会按照配置的节点顺序执行。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。