文章目录
Spring MVC
登录功能
首页展示的流程如下
index.do
-> DispatcherServlet
-> HandlerMapping
-> IndexController
-> /WEB-INF/home/index.jsp
登录页展示流程如下
showLogin.do
-> DispatcherServlet
-> HandlerMapping
-> UserController
-> /WEB-INF/user/showLogin.jsp
注册页展示流程如下
showRegister.do
-> DispatcherServlet
-> HandlerMapping
-> UserController
-> /WEB-INF/user/showRegister.jsp
用户中心流程如下
login.do | register.do 成功后
-> DispatcherServlet
-> HandlerMapping
-> UserController
-> /WEB-INF/user/hello.jsp
Controller如何接收请求参数
一般发请求都是Post,Get,Ajax
- 利用HTTPServletRequest做方法参数接收
- 利用key名字做参数可以自动接收,若参数名和表单名不一致可以使用
@RequestParam
标记,一般适用参数较少情况 - 利用bean实体对象做参数接收,参数key与对象的属性名保持一致即可,一般适用参数较多情况
接收中文乱码的解决方案
- 在请求到来之前使用request.setCharacterEncoding(“UTF-8”) / POST请求
- 使用过滤器的request.setCharacterEncoding(“UTF-8”) / POST请求
- 使用Spring内置的过滤器
CharacterEncodingFilter(org.springframework.web.filter.CharacterEncodingFilter)
,在web.xml
配置filter -> init-param -> param-name:encoding
-> param-value:UTF-8
/ POST请求 - 在使用的地方转换一次String XXX= new String(request.getParameter(“XXX”).getBytes(“ISO-8859-1”), “UTF-8”); /GET请求
Controller向jsp传值
- request域传递
- session域传递
- application域传递(view.getModel().put(String,Object))
转发用request
重定向就是新的request了,就不要使用request了
传值的规则:
由小到大,例如:可以使用request就不要使用session了
框架默认走的传值就是转发
转发条件传值(借助request域)
- 利用request对象setAttribute传值
- 利用返回ModelAndView对象传值
- 利用Model或ModelMap参数
重定向模式(借助session域)
- 利用request去getSession再setAttribute
- 可以在方法参数直接添加session
注意
如果使用bean对象作为参数,Spring-MVC会默认在request构建一个对应的bean对象,这就是为什么不在request或者ModelAndView存值也能在jsp拿到对象的原因
Controller返回重定向和转发的处理
在删除案例中,我们会发现删除点击后页面为空了,这是因为我们没有走.do请求,所有没有list.jsp需要的内容,我们可以考虑两种方案,1重新存值进去,2重新请求一次list.do即可
在请求时会出现如果对应控制器的返回值是String类型的值怎么重定向呢?
return "forward:list.od";//转发
return "redirect:list.od";//重定向
而ModelAndView就这样操作:
@RequestMapping("/delete")
public ModelAndView delete(int id){
newsDao.delete(id);
ModelAndView mav = new ModelAndView();
RedirectView view = new RedirectView("list.do");
mav.setView(view);
return mav;
}
两种不同的做法都已提供,就看你想使用哪种了
Spring提供的拦截器组件
拦截器可以在Spring处理流程中追加逻辑处理
原来的请求流程:
请求->DispatcherServlet->HandlerMapping->Controller->ViewResolver->JSP页面->响应
拦截器可追加在流程的位置:
请求->DispatcherServlet->HandlerMapping->拦截点1
->Controller->拦截点2
->ViewResolver->拦截点3
->JSP页面->响应
编写拦截器组件
- 实现HandlerInterceptor,会实现三个方法,分别是
preHandle(Controller之前调用)
,postHandle(ViewResolver之前调用)
,afterCompletion(JSP页面之前调用)
,三个方法按顺序分别对应了拦截点1,2,3 - 设置对应拦截器方法的返回值(true表示通过拦截器,false反之)
比如在preHandle判断用户session,没有session表示未登录我们重定向回去再return false即可
配置拦截器组件
<mvc:interceptors>
-><mvc:interceptor>
-><mvc:mapping path="/delete.do"/>
-><bean class="我们定义的拦截器名">
如果需要拦截多个就多配置几个<mvc:mapping>
,或者/*
设置了/*就可以排除某个页面<mvc:exclude-mapping path="/login.do">
这样就是除了login.do其他的都拦截
后面我们可以对url做手脚
比如需要拦截的url:true/list.do
,true/delete.do
不需要拦截的url:false/login.do
,false/register.do
还有,如果要配置多个拦截器就多加几个<mvc:interceptor>
就行了