• 第1章SpringMVC概述-注册中央调度区,定义页面,修改视图解析器


    1 SpringMVC 概述

    1.1 SpringMVC 简介

    SpringMVC 也叫 Spring web mvc。是 Spring 框架的一部分,是在 Spring3.0 后发布的。

    1.2 SpringMVC 优点

    1. 基于 MVC 架构

    基于 MVC 架构,功能分工明确。解耦合,

    2. 容易理解,上手快;使用简单。

    就可以开发一个注解的 SpringMVC 项目,SpringMVC 也是轻量级的,jar 很小。不依赖的

    特定的接口和类。

    3. 作 为 Spring 框 架 一 部 分 , 能 够 使 用 Spring IoC Aop 。 方 便 整 合 Strtus,MyBatis,Hiberate,JPA 等其他框架。

    4.SpringMVC 强化注解的使用,在控制器, Service Dao 都可以使用注解。方便灵活。

    使用@Controller 创建处理器对象,@Service 创建业务对象,@Autowired 或者@Resource在控制器类中注入 Service, Service 类中注入 Dao。

    1.3新建 maven web 项目

    项目结构

    1添加pom.xml
    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>com.bjpowernodegroupId>
    6. <artifactId>ch01-hello-springmvcartifactId>
    7. <version>1.0-SNAPSHOTversion>
    8. <packaging>warpackaging>
    9. <properties>
    10. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    11. <maven.compiler.source>1.8maven.compiler.source>
    12. <maven.compiler.target>1.8maven.compiler.target>
    13. properties>
    14. <dependencies>
    15. <dependency>
    16. <groupId>junitgroupId>
    17. <artifactId>junitartifactId>
    18. <version>4.11version>
    19. <scope>testscope>
    20. dependency>
    21. <dependency>
    22. <groupId>jakarta.servletgroupId>
    23. <artifactId>jakarta.servlet-apiartifactId>
    24. <version>4.0.4version>
    25. <scope>providedscope>
    26. dependency>
    27. <dependency>
    28. <groupId>org.apache.tomcat.embedgroupId>
    29. <artifactId>tomcat-embed-websocketartifactId>
    30. <version>9.0.44version>
    31. dependency>
    32. <dependency>
    33. <groupId>org.springframeworkgroupId>
    34. <artifactId>spring-webmvcartifactId>
    35. <version>5.2.5.RELEASEversion>
    36. dependency>
    37. dependencies>
    38. <build>
    39. <plugins>
    40. <plugin>
    41. <artifactId>maven-compiler-pluginartifactId>
    42. <version>3.1version>
    43. <configuration>
    44. <source>1.8source>
    45. <target>1.8target>
    46. configuration>
    47. plugin>
    48. plugins>
    49. build>
    50. project>
    2. 注册中央调度器
    1. (1) 全限定性类名
    2. 该中央调度器为一个 Servlet,名称为 DispatcherServlet。中央调度器的全限定性类名在
    3. 导入的 Jar 文件 spring-webmvc-5.2.5.RELEASE.jar 的第一个包 org.springframework.web.servlet
    4. 下可找到。
    5. (2) <load-on-startup/>
    6. <servlet/>中添加<load-on-startup/>的作用是,标记是否在Web服务器(这里是Tomcat)
    7. 启动时会创建这个 Servlet 实例,即是否在 Web 服务器启动时调用执行该 Servlet 的 init()方
    8. 法,而不是在真正访问时才创建。
    9. 它的值必须是一个整数。
    10. ➢ 当值大于等于 0 时,表示容器在启动时就加载并初始化这个 servlet,数值越小,该 Servlet
    11. 的优先级就越高,其被创建的也就越早;
    12. ➢ 当值小于 0 或者没有指定时,则表示该 Servlet 在真正被使用时才会去创建。
    13. ➢ 当值相同时,容器会自己选择创建顺序。
    14. (3) <url-pattern/>
    15. 对于<url-pattern/>,可以写为 / ,建议写为*.do 的形式。
    16. (4) 配置文件位置与名称
    17. 注册完毕后,可直接在服务器上发布运行。此时,访问浏览器页面,控制台均会抛出
    18. FileNotFoundException 异常。即默认要从项目根下的 WEB-INF 目录下找名称为 Servlet 名称
    19. -servlet.xml 的配置文件。这里的“Servlet 名称”指的是注册中央调度器<servlet-name/>标签
    20. 中指定的 Servlet 的 name 值。本例配置文件名为 springmvc-servlet.xml。
    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <servlet>
    7. <servlet-name>mywebservlet-name>
    8. <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    9. <init-param>
    10. <param-name>contextConfigLocationparam-name>
    11. <param-value>classpath:springmvc.xmlparam-value>
    12. init-param>
    13. <load-on-startup>1load-on-startup>
    14. servlet>
    15. <servlet-mapping>
    16. <servlet-name>mywebservlet-name>
    17. <url-pattern>*.dourl-pattern>
    18. servlet-mapping>
    19. web-app>
    3.创建 SpringMVC 配置文件
    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    6. <context:component-scan base-package="com.bjpowernode.controller" />
    7. beans>

    4. 创建处理器

    在类上与方法上添加相应注解即可。

    @Controller:表示当前类为处理器

    @RequestMapping:表示当前方法为处理器方法。该方法要对 value 属性所指定的 URI

    进行处理与响应。被注解的方法的方法名可以随意。

    1. package com.bjpowernode.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import org.springframework.web.servlet.ModelAndView;
    5. /**
    6. * @Controller:创建处理器对象,对象放在springmvc容器中。
    7. * 位置:在类的上面
    8. * 和Spring中讲的@Service ,@Component
    9. *
    10. * 能处理请求的都是控制器(处理器): MyController能处理请求,
    11. * 叫做后端控制器(back controller)
    12. *
    13. * 没有注解之前,需要实现各种不同的接口才能做控制器使用
    14. */
    15. @Controller
    16. public class MyController {
    17. /*
    18. 处理用户提交的请求,springmvc中是使用方法来处理的。
    19. 方法是自定义的, 可以有多种返回值, 多种参数,方法名称自定义
    20. */
    21. /**
    22. * 准备使用doSome方法处理some.do请求。
    23. * @RequestMapping: 请求映射,作用是把一个请求地址和一个方法绑定在一起。
    24. * 一个请求指定一个方法处理。
    25. * 属性: 1. value 是一个String,表示请求的uri地址的(some.do)。
    26. * value的值必须是唯一的, 不能重复。 在使用时,推荐地址以“/”
    27. * 位置:1.在方法的上面,常用的。
    28. * 2.在类的上面
    29. * 说明: 使用RequestMapping修饰的方法叫做处理器方法或者控制器方法。
    30. * 使用@RequestMapping修饰的方法可以处理请求的,类似Servlet中的doGet, doPost
    31. *
    32. * 返回值:ModelAndView 表示本次请求的处理结果
    33. * Model: 数据,请求处理完成后,要显示给用户的数据
    34. * View: 视图, 比如jsp等等。
    35. */
    36. @RequestMapping(value = {"/some.do","/first.do"})
    37. public ModelAndView doSome(){ // doGet()--service请求处理
    38. //处理some.do请求了。 相当于service调用处理完成了。
    39. ModelAndView mv = new ModelAndView();
    40. //添加数据, 框架在请求的最后把数据放入到request作用域。
    41. //request.setAttribute("msg","欢迎使用springmvc做web开发");
    42. mv.addObject("msg","欢迎使用springmvc做web开发");
    43. mv.addObject("fun","执行的是doSome方法");
    44. //指定视图, 指定视图的完整路径
    45. //框架对视图执行的forward操作, request.getRequestDispather("/show.jsp).forward(...)
    46. mv.setViewName("/show.jsp");
    47. //mv.setViewName("/WEB-INF/view/show.jsp");
    48. //mv.setViewName("/WEB-INF/view/other.jsp");
    49. //当配置了视图解析器后,可以使用逻辑名称(文件名),指定视图
    50. //框架会使用视图解析器的前缀 + 逻辑名称 + 后缀 组成完成路径, 这里就是字符连接操作
    51. ///WEB-INF/view/ + show + .jsp
    52. //mv.setViewName("/WEB-INF/show.jsp");
    53. //mv.setView( new RedirectView("/a.jsp"));
    54. //返回mv
    55. return mv;
    56. }
    57. @RequestMapping(value = {"/other.do","/second.do"})
    58. public ModelAndView doOther(){
    59. ModelAndView mv = new ModelAndView();
    60. mv.addObject("msg","====欢迎使用springmvc做web开发====");
    61. mv.addObject("fun","执行的是doOther方法");
    62. mv.setViewName("/WEB-INF/other.jsp");
    63. return mv;
    64. }
    65. }

    若有多个请求路径均可匹配该处理器方法的执行,则@RequestMapping 的 value 属性中

    可以写上一个数组。

    ModelAndView 类中的 addObject()方法用于向其 Model 中添加数据。Model 的底层为一

    个 HashMap。

    Model中的数据存储在 request 作用域中,SringMVC 默认采用转发的方式跳转到视图,本次请求结束,模型中的数据被销毁。

    5.定义目标页面

    webapp 目录下新建一个子目录 jsp,在其中新建一个 jsp 页面 show.jsp。

    6.测试一下:

    这里记录一下:我用的是tomcat10,用的是jakarta.servlet-api,导致我一直报错:大致意思是javax的servlet不能转换成jakrta的servlet。然后我换成9版本的,就可以跑通了。tomcat的配置如下:

    7. 修改视图解析器的注册刚上面也做了说明

    SpringMVC 框架为了避免对于请求资源路径与扩展名上的冗余,在视图解析器

    InternalResouceViewResolver 中引入了请求的前辍与后辍。而 ModelAndView 中只需给出要跳

    转页面的文件名即可,对于具体的文件路径与文件扩展名,视图解析器会自动完成拼接。

    1. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    2. <property name="prefix" value="/WEB-INF/view/" />
    3. <property name="suffix" value=".jsp" />
    4. bean>

    把 show.jsp 文件放到 /WEB-INF/view/路径中

    然后修改处理器

  • 相关阅读:
    操作指南|如何通过Polkassembly参与Moonbeam治理 (2022年8月31日更新)
    android 系统驱动调试
    未来世界:16项改变人类社会的新技术
    【Vue】避免Vue组件中常见的props默认值陷阱
    全网最全音视频媒体流
    vue组件
    CRM客户管理系统究竟是什么?如何实施?
    智慧图书馆中的自助借还系统
    MySQL索引,事务及存储引擎
    我深刻反思了一下自己。
  • 原文地址:https://blog.csdn.net/weixin_48370579/article/details/127840123