文章目录
可变参数在设计方法时,使用
数据类型...
来声明参数类型,例如:public static void function(int... numbers)
在实现方法体时,可变参数是作为数组来处理
public class Test {
public static void main(String[] args) {
System.out.println(Test.sum(1,2,3));
System.out.println(Test.sum(1,2,3,4,54));
}
public static int sum(int... numbers){
int sum=0;
for(int i=0;i<numbers.length;i++){
sum+=numbers[i];
}
return sum;
}
}
注意: 每个方法中,最多只允许存在1个可变参数,并且,如果存在可变参数,那么必须是最后一个参数
转发
,转发的值是view
组件的名称,比如return "login"
,实质上会根据视图解析器(ViewResolver
)得到最终负责显示的页面,而通过return redirect:路径
这样的语法表示重定向,在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 login
,那么这个会经过视图解析器进行解析,跳转到指定的视图。但是如果添加了forward
,那么就不经过视图解析器,而是直接进行跳转,我们一般都是转发到controller
中的方法,比如return forward:../user/showLogin.do
redirect:
return "redirect:login.do"
@RequestMapping(value="/handle_reg.do", method=RequestMethod.POST)
public String handleReg(User user,ModelMap map) {
try {
userService.reg(user);
System.out.println("注册成功!");
return "redirect:login.do"; //重定向到login.do这个控制方法,login.do对应的就是转发到login.jsp
} catch (UsernameConflictException e) {
System.out.println(e.getMessage());
map.put("errorMessage", e.getMessage());
return "error";
}
}
@RequestMapping(value="login.do")
public String handleLogin() {
return "login";
}
interceptor
)是springmvc中的一个组件
,是运行在DispatcherServlet
之后,运行在Controller
之前的拦截
或者放行
,所以,通常用于对一些具有相同运行条件的功能进行约束DemoInterceptor
),实现HandlerInterceptor
接口public class DemoInterceptor implements HandlerInterceptor {
/**
* 处理器执行之前调用
* @param request HttpServletRequest对象,可以获取请求参数等等
* @param response HttpServletResponse对象
* @param Handler 拦截器的Controller对象
* @return 如果返回false,就会中断处理流程,不会处理后续的拦截器和Controller。如果返回true,则会执行后续的拦截器和处理器
*/
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("DemoInterceptor的PreHandler执行");
return true;
}
/**
* 处理器执行之后调用,跳转到指定视图之前调用
* @param request HttpServletRequest对象
* @param response HttpServletResponse对象
* @param Handler 拦截器的Controller对象
* @param modelAndView ModelAndView对象,其中存放的是处理结果和视图的信息
*/
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
/**
* 1. 可以自己设计逻辑,例如某些情况下返回false,返回true
* 2. 返回true表示执行后续的处理器和拦截器,返回false会中断处理流程
*/
System.out.println("handler:"+handler);
System.out.println("DemoInterceptor的PostHandler执行");
//设置视图的名称,那么执行完成之后就会条跳转到index.jsp页面
//modelAndView.setViewName("index");
}
/**
* 请求处理完成之后调用
*/
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("DemoInterceptor的afterCompletion执行");
}
}
<mvc:mapping path=""/>
可以使用通配符*
比如:/**
匹配所有的路径,/user/*
只能匹配/user
的子路径<mvc:exclude-mapping path=""/>
可以配置多个
bean
) : <bean class="">
<!-- 配置拦截器,其中可以配置多个拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置拦截器的拦截路径,拦截/user下的全部处理器方法映射
比如:http://localhost:8080/Springmvc/user/login.do这个请求就会被拦截
-->
<mvc:mapping path="/user/*"/>
<!-- 配置不被该拦截器拦截器的controller方法,这个是可选配置
比如:http://localhost:8080/Springmvc/user/index.do将不会被拦截器
-->
<mvc:exclude-mapping path="/user/index.do"/>
<mvc:exclude-mapping path="/user/login.do"/>
<!-- 配置拦截器的bean,指定的是全类名 -->
<bean class="cn.tedu.spring.interceptor.DemoInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler)
controller
处理请求之前执行false
,则会中断处理流程,不会执行后续的拦截器和处理器,返回true
会执行后续的拦截器和处理器false
或者true
public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView)
ModelAndView
对数据和视图进行处理prehandler
方法返回true
才会执行public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)
prehandler
方法返回true
才会执行login.jsp
中添加登录按钮,登录完成之后,需要自己定义一个标记存储在session
中,比如用户的id
或者用户的对象
id
作为标记验证是否已经的登录,如果用户登录成功,会在session
中添加一个uid
的属性session.invalidate();
清除session
,并且重定向到登录界面
prehandler
方法中写的很清楚public class LoginInterceptor implements HandlerInterceptor{
/*
* 在处理器执行之前调用(non-Javadoc)
* 1. 获取session
* 2. 读取session中的uid的值
* 如果为null,表示没有登录,那么直接重定向到登录界面,同时返回false,不需要执行后面的流程了
* 如果不为null,表示已经登录了,那么直接返回true,继续执行后面的拦截器或者处理器
*/
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
HttpSession session=request.getSession(); //获取session
Object uid=session.getAttribute("uid"); //读取session中的对象
//如果uid存在,那么即可登录完成
if (uid!=null) {
return true; //返回true,登录成功就需要执行后续的流程
}
response.sendRedirect(request.getContextPath()+"/user/login.do"); //重定向到登录界面
return false; //返回false,后面的流程也不用执行了,直接中断
}
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
user_center.do
<!-- 配置拦截器,其中可以配置多个拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/user_center.do"/>
<bean class="cn.tedu.spring.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
springmvc
配置文件中配置的顺序执行,即是在<mvc:interceptors>
下配置的拦截器的顺序,如果对同一个路径进行了拦截器,那么先配置的先拦截springmvc
才可以使用拦截器,过滤器是Java EE
体系中的,无论使用哪种框架都可以使用过滤器DispatcherServlet
之后,在处理器之前执行,过滤器在DispatcherServlet
之前执行servlet
之前执行(所有的请求都会执行),而拦截器会在springmvc中DispatcherServlet
之后执行,所以过滤器在项目中可以过滤任何请求(只要是配置了对应的路径),而拦截器只会在DispatcherServlet
处理的请求的基础之上进行拦截springmvc
的配置文件中配置<mvc:interceptors>
可以有如果若干个<mvc:interceptor>
,即是配置若干个拦截器,配置的多个拦截器将会形成拦截器链,如果配置多个拦截器对同一个路径都会拦截,那么会按照配置的节点顺序执行。