Spring框架学习第五天

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与对象的属性名保持一致即可,一般适用参数较多情况

接收中文乱码的解决方案

  1. 在请求到来之前使用request.setCharacterEncoding(“UTF-8”) / POST请求
  2. 使用过滤器的request.setCharacterEncoding(“UTF-8”) / POST请求
  3. 使用Spring内置的过滤器CharacterEncodingFilter(org.springframework.web.filter.CharacterEncodingFilter),在web.xml配置filter -> init-param -> param-name:encoding -> param-value:UTF-8 / POST请求
  4. 在使用的地方转换一次String XXX= new String(request.getParameter(“XXX”).getBytes(“ISO-8859-1”), “UTF-8”); /GET请求

Controller向jsp传值

  1. request域传递
  2. session域传递
  3. 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页面->响应

编写拦截器组件

  1. 实现HandlerInterceptor,会实现三个方法,分别是preHandle(Controller之前调用),postHandle(ViewResolver之前调用),afterCompletion(JSP页面之前调用),三个方法按顺序分别对应了拦截点1,2,3
  2. 设置对应拦截器方法的返回值(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>就行了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值