南宁网站定制团队,网站建设在线建站,线上推广策划方案,自建网站费用学习视频#xff1a;孙哥说SpringMVC#xff1a;结合Thymeleaf#xff0c;重塑你的MVC世界#xff01;#xff5c;前所未有的Web开发探索之旅 衔接上文Spring MVC学习随笔-控制器(Controller)开发详解#xff1a;控制器跳转与作用域#xff08;一#xff09; SpingMVC中… 学习视频孙哥说SpringMVC结合Thymeleaf重塑你的MVC世界前所未有的Web开发探索之旅 衔接上文Spring MVC学习随笔-控制器(Controller)开发详解控制器跳转与作用域一 SpingMVC中request作用域的处理 代码 # 基于Model的方式
RequestMapping(view2)
public String view2(Model model) {// 等同于 request.addAttribute();model.addAttribute(name, suns);return result1;
}
# 基于ModelMap的方式 同上
RequestMapping(view3)
public String view3(ModelMap modelMap) {modelMap.addAttribute(name, suns2);return result1;
}Model、ModelMap相关细节分析 通过Model、ModelMap进行作用域处理可以解决视图模板技术耦合的问题 因为SpringMVC通过视图解析器区别JSP、FreeMaker再将Model、ModelMap的数据放到request或root里面运行。 SpringMVC中提供Model和ModelMap两种方式处理request作用域他们的区别是什么 虽然两者表现形式以及声明的形参类型都不同但是在运行时SpringMVC会动态提供对应的实现类型名字是BindingAwareModelMap。所以本质上两者相同。 为什么不直接使用BindingAwareModelMap 在源码中Model接口会根据开发者使用SpringMVC或Spring WebFlux进行自动适配使用MVC开发时会使用BindingAwareModelMap而WebFlux开发时使用的是ConcurrentModel。 SpringMVC为什么会提供两种开发方式Model、ModelMap这两种开发方式更推荐哪种使用 推荐使用ModelModelMap是老系统使用的为了兼容老系统所以留着。Model可以兼容传统MVC也可以在WebFlux中使用更有利于项目维护。 如果redirect跳转数据如何跳转 SpringMVC会自动把Model或ModelMap中的数据通过的形式在url上进行拼接从而传递数据 SpringMVC中Session作用域的处理 基本使用方式及其存在的问题 session.setAttribute(name,value);RequestMapping(view)
public String view1(HttpSession session){session.setAttribute(name,value);return result;
}
存在问题与ServletAPI耦合在SpringMVC中不建议使用。SessionAttributes注解 存储数据 Controller
RequestMapping(view3)
**SessionAttributes(value name) // 声明name存在session作用域**
public class View3Controller {RequestMapping(view1)public String view1(Model model) {model.addAttribute(name, xiaojr);model.addAttribute(age, 10);return result1;}
}
// jsp中取值
html
bodyh1session attribute is ${sessionScope.name}/h1h1request attribute is ${requestScope.age}/h1
/body
/html注意 Model、ModelMap把name的数据通过SessionAttributes存储在Session作用域中的同时在Request作用域中也会存储。此时Request作用域、Session作用域存储的是一个对象的引用。 删除Session作用域中的数据 SpringMVC中application作用域的处理 为什么SpringMVC没有提供application作用域 因为application这个作用域是全局唯一在开发中多用于存储全局唯一的对象被框架底层封装在开发时程序员基本不会使用其用于业务操作。 ModelAttribute注解 SpringMVC通过ModelAttribute注解接受请求参数的同时把数据存储到request作用域中。 RequestMapping(view1)
public String view1(ModelAttribute(name) String name) {System.out.println(View4Controller.view1);return result2;
}使用场景 传递页码时可以使用。 注意细节 细节一 如果传递的是简单变量参数则value属性必须与超级链接或表单的key名称保持一致。 如果传递的是POJO类型的请求参数则没有上述要求但是value属性会作为request作用域的名称。 细节二 ModelAttribute中value的值不能与SessionAttributes中value的值一致如果一致则会产生异常如果要把请求参数的数据也存在session作用域中需要将request作用域存储改为使用传统做法model.addAttribute(”name”,name); 什么是ModelAndView【了解】 什么是ModelAndView ModelAndView这个类型实际上是一个复合类型起到了2个方面的作用。 注意ModelAndView里面只能使用ModelMap这也是它的劣势之一。 Model 代表作用域的操作就是前面的ModelMap。View 代表跳转路径页面对应前面的四种跳转。 最终这两方面的工作统一被ModelAndView进行封装做为控制器方法的返回值使用。 总结目前控制器方法返回值 1. public String controller();
2. public ModelAndView controller();
注意SpringMVC处理跳转页面和作用域时把相应的内容都会封装到ModelAndView中
所以ModelAndView返回值的这种处理更加底层而返回值String的处理仅是简化开发。5.5 视图控制器
5.5.1 什么是视图控制器 视图控制器可以通过配置的方式访问受保护的视图模板简化开发。 什么是视图模板 JSP Thymeleaf FreeMarker Velocity 为什么需要保护视图模板 目前的开发方式都没有对视图模板进行保护有可能导致程序在被用户访问时产生非预期效果Bug 如何保护视图模板 将所有视图模板放置在WEB-INF下这样用户就无法通过地址直接访问视图模板了。
5.5.1 受保护的视图模板如何访问 所有的视图模板只能通过控制器forward访问:return result; return forward:/WEB-INF/jsp/result.jsp; 记得同时修改viewResolver bean idviewResolver classorg.springframework.web.servlet.view.InternalResourceViewResolverproperty nameprefix **value/WEB-INF/jsp//**property namesuffix value.jsp/
/bean5.5.2 视图控制器
虽然可以通过控制器forward访问视图模板但是直接访问页面也需要控制器因此会变得繁琐所以有了视图控制器的存在通过在配置文件(dispatcher.xml)可以直接访问
mvc:view-controller path/result3 view-nameresult3/
注意path不能和RequestMapping的路径冲突5.5.3 视图控制器的Redirect跳转
RequestMapping(view1)
public String view1() {System.out.println(View6Controller.view1);return redirect:/result4;
}mvc:view-controller path/result4 view-nameresult4/5.6 静态资源处理
5.5.1 什么是静态资源
所谓静态资源指的是项目中非java代码部分的内容如 图片、js文件、css文件。 目前SpringMVC的开发中按照现有的配置内容是无法访问静态资源的。 g)
在SpringMVC底层资源请求访问DispatcherServlet后会将其请求当成控制器并调用对应的控制器方法创建对象但是在静态资源访问第一步就走不通了所以就报错404。
5.5.3 解决方式 方式一【DefaultServlet】 Tomcat提供了能够访问静态资源的DefaultServletweb.xml) 在web.xml添加DefaultServlet后的代码 方式二【default-servlet-handler】推荐 第一种开发方式的问题 default-servlet-handler开发方式 在SpringMVC的配置文件(dispatcher.xml)中配置mvc:default-servlet-handler/即可 实现原理 mvc:default-servlet-handler/标签的底层也是调用了defaultServlet进行的静态资源处理。 mvc:default-servlet-handler/标签他是如何调用defaultServlet进行静态资源处理的 他的底层是通过DefaultServletHttpRequestHandler以forward的形式调用的DefaultServlet。 mvc:default-servlet-handler/完整运行流程用户如果发起控制器的请求首先会到DispatcherServlet然后DispatcherServlet会通过RequestMappingHandlerMapiping查找控制器上RequestMapping注解并进行相应的匹配进而查找如果查找到则会通过HandlerAdapter进行处理。对于静态资源的操作也就是使用了mvc:default-servlet-handler/的处理它的请求也一样会访问DispatcherServlet没查找到则会通过SimpleUrlHandlerMapping调用DefaultServletHttpRequestHandler进而调用DefaultServlet进行静态资源的处理。 下一章Spring MVC学习随笔-文件下载和上传配置文件上传解析器multipartResolver