• SpringMVC基础:配置视图解析器和控制器


    Controller控制器

    有了SpringMVC之后,我们不必再像之前那样一个请求地址创建一个Servlet了,它使用DispatcherServlet替代Tomcat为我们提供的默认的静态资源Servlet,也就是说,现在所有的请求(除了jsp,因为Tomcat还提供了一个jsp的Servlet)都会经过DispatcherServlet进行处理。

    那么DispatcherServlet会帮助我们做什么呢?

    根据图片我们可以了解,我们的请求到达Tomcat服务器之后,会交给当前的Web应用程序进行处理,而SpringMVC使用DispatcherServlet来处理所有的请求,也就是说它被作为一个统一的访问点,所有的请求全部由它来进行调度。

    当一个请求经过DispatcherServlet之后,会先走HandlerMapping,它会将请求映射为HandlerExecutionChain,依次经过HandlerInterceptor有点类似于之前我们所学的过滤器,不过在SpringMVC中我们使用的是拦截器,然后再交给HandlerAdapter,根据请求的路径选择合适的控制器进行处理,控制器处理完成之后,会返回一个ModelAndView对象,包括数据模型和视图,通俗的讲就是页面中数据和页面本身(只包含视图名称即可)。

    返回ModelAndView之后,会交给ViewResolver(视图解析器)进行处理,视图解析器会对整个视图页面进行解析,SpringMVC自带了一些视图解析器,但是只适用于JSP页面,我们也可以像之前一样使用Thymeleaf作为视图解析器,这样我们就可以根据给定的视图名称,直接读取HTML编写的页面,解析为一个真正的View。

    解析完成后,就需要将页面中的数据全部渲染到View中,最后返回给DispatcherServlet一个包含所有数据的成形页面,再响应给浏览器,完成整个过程。

    因此,实际上整个过程我们只需要编写对应请求路径的的Controller以及配置好我们需要的ViewResolver即可,之后还可以继续补充添加拦截器,而其他的流程已经由SpringMVC帮助我们完成了。

    配置视图解析器和控制器

    首先我们需要实现最基本的页面解析并返回,第一步就是配置视图解析器,这里我们使用Thymeleaf为我们提供的视图解析器,导入需要的依赖:

    1. <dependency>
    2. <groupId>org.thymeleafgroupId>
    3. <artifactId>thymeleaf-spring5artifactId>
    4. <version>3.0.12.RELEASEversion>
    5. dependency>

    配置视图解析器非常简单,我们只需要将对应的ViewResolver注册为Bean即可,这里我们直接在配置类中编写:

    1. @ComponentScan("com.example.controller")
    2. @Configuration
    3. @EnableWebMvc
    4. public class WebConfiguration {
    5. //我们需要使用ThymeleafViewResolver作为视图解析器,并解析我们的HTML页面
    6. @Bean
    7. public ThymeleafViewResolver thymeleafViewResolver(@Autowired SpringTemplateEngine springTemplateEngine){
    8. ThymeleafViewResolver resolver = new ThymeleafViewResolver();
    9. resolver.setOrder(1); //可以存在多个视图解析器,并且可以为他们设定解析顺序
    10. resolver.setCharacterEncoding("UTF-8"); //编码格式是重中之重
    11. resolver.setTemplateEngine(springTemplateEngine); //和之前JavaWeb阶段一样,需要使用模板引擎进行解析,所以这里也需要设定一下模板引擎
    12. return resolver;
    13. }
    14. //配置模板解析器
    15. @Bean
    16. public SpringResourceTemplateResolver templateResolver(){
    17. SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
    18. resolver.setSuffix(".html"); //需要解析的后缀名称
    19. resolver.setPrefix("/"); //需要解析的HTML页面文件存放的位置
    20. return resolver;
    21. }
    22. //配置模板引擎Bean
    23. @Bean
    24. public SpringTemplateEngine springTemplateEngine(@Autowired ITemplateResolver resolver){
    25. SpringTemplateEngine engine = new SpringTemplateEngine();
    26. engine.setTemplateResolver(resolver); //模板解析器,默认即可
    27. return engine;
    28. }
    29. }

    别忘了在Initializer中添加此类作为配置:

    1. @Override
    2. protected Class[] getServletConfigClasses() {
    3. return new Class[]{MvcConfiguration.class};
    4. }

    现在我们就完成了视图解析器的配置,我们接着来创建一个Controller,创建Controller也非常简单,只需在一个类上添加一个@Controller注解即可,它会被Spring扫描并自动注册为Controller类型的Bean,然后我们只需要在类中编写方法用于处理对应地址的请求即可:

     

    1. @Controller //直接添加注解即可
    2. public class MainController {
    3. @RequestMapping("/index") //直接填写访问路径
    4. public ModelAndView index(){
    5. return new ModelAndView("index"); //返回ModelAndView对象,这里填入了视图的名称
    6. //返回后会经过视图解析器进行处理
    7. }
    8. }

    我们会发现,打开浏览器之后就可以直接访问我们的HTML页面了。

    而页面中的数据我们可以直接向Model进行提供:

    1. @RequestMapping(value = "/index")
    2. public ModelAndView index(){
    3. ModelAndView modelAndView = new ModelAndView("index");
    4. modelAndView.getModel().put("name", "啊这");
    5. return modelAndView;
    6. }

    这样Thymeleaf就能收到我们传递的数据进行解析:

    1. html>
    2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script src="static/test.js">script>
    7. head>
    8. <body>
    9. HelloWorld!
    10. <div th:text="${name}">div>
    11. body>
    12. html>

    当然,如果仅仅是传递一个页面不需要任何的附加属性,我们可以直接返回View名称,SpringMVC会将其自动包装为ModelAndView对象:

    1. @RequestMapping(value = "/index")
    2. public String index(){
    3. return "index";
    4. }

    还可以单独添加一个Model作为形参进行设置,SpringMVC会自动帮助我们传递实例对象:

    1. @RequestMapping(value = "/index")
    2. public String index(Model model){ //这里不仅仅可以是Model,还可以是Map、ModelMap
    3. model.addAttribute("name", "yyds");
    4. return "index";
    5. }

    这么方便的写法,你就说你爱不爱吧,你爱不爱。

    注意,一定要保证视图名称下面出现横线并且按住Ctrl可以跳转,配置才是正确的(最新版IDEA)

    我们的页面中可能还会包含一些静态资源,比如js、css,因此这里我们还需要配置一下,让静态资源通过Tomcat提供的默认Servlet进行解析,我们需要让配置类实现一下WebMvcConfigurer接口,这样在Web应用程序启动时,会根据我们重写方法里面的内容进行进一步的配置:

     

    1. @Override
    2. public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    3. configurer.enable(); //开启默认的Servlet
    4. }
    5. @Override
    6. public void addResourceHandlers(ResourceHandlerRegistry registry) {
    7. registry.addResourceHandler("/static/**").addResourceLocations("/WEB-INF/static/");
    8. //配置静态资源的访问路径
    9. }

    我们编写一下前端内容:

    1. html>
    2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script th:src="@{/static/test.js}">script>
    7. head>
    8. <body>
    9. HelloWorld!
    10. body>
    11. html>

    创建test.js并编写如下内容:

     

    window.alert("欢迎来到GayHub全球最大同性交友网站")

    最后访问页面,页面在加载时就会显示一个弹窗,这样我们就完成了最基本的页面配置。相比之前的方式,这样就简单很多了,直接避免了编写大量的Servlet来处理请求。

  • 相关阅读:
    C语言:高级并发操作(线程)
    Java后端工程师有福啦,CSDN里找到宝藏
    Android Studio 创建项目不自动生成BuildConfig文件
    Rockchip Android平台常用调试命令汇总
    【OS基础】符合AUTOSAR标准的RTAOS-Alarms详解
    从零开始的Docker Desktop使用,Docker快速上手 ( ̄︶ ̄)↗ Docker介绍和基础使用
    redis的原理和源码-源码阅读指南
    Final和接口
    .NET 7 SDK 开始 支持构建容器化应用程序
    深入了解快速排序和归并排序
  • 原文地址:https://blog.csdn.net/Leon_Jinhai_Sun/article/details/126553766