springmvc

it2026-10-07  3

一.什么是springmvc: spring封装的一套实现mvc设计模式的轻量级web框架,和struts strusts2类似,但是更加轻量级,现在strusts2 已经在国内弃用 ,通俗讲就是springmvc 封装了serlvlet,实现的功能和BaseServlet类似,所有的路径分发都是经过DispatcherServlet 二.springmvc特点: 是spring框架的一部分,可以方便的利用spring所提供的其他功能 灵活性强,易于其他框架集成 提供了一个前端控制器DispatcherServlet,使开发人员无需额外开发控制器对象 可自动绑定用户输入,并能正确的转换数据类型 内置了常见的校验器,可以校验用户输入,如果校验不能通过,那么就会重定向到输入表单 支持国际化,可以根据用户区域显示多国语言 支持多种视图技术,它支持JSP,Velocity和FreeMarker等视图技术 使用基于XML的配置文件,在编辑后,不需要重新编译应用程序 三.创建springmvc javaweb工程 1.创建mevan-web工程并引入依赖

<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <spirng.version>5.0.16.RELEASE</spirng.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- 添加 servlet 依赖 <scope>provided</scope> 编译时需要,运行时不需要 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spirng.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spirng.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.6.12</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.12</version> </dependency> <!-- 引入spring mvc jar--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spirng.version}</version> </dependency> </dependencies>

2.配置web.xml

<web-app> <display-name>Archetype Created Web Application</display-name> <!-- 声明 前端控制器 tomcat启动时 加载DispatcherServlet --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 为前端控制器 配置文件(spring)--> <init-param> <param-name>contextConfigLocation</param-name> <!-- 配置文件名可以为 servlet-name + ‘-’+servlet.xml 名字 此时使规范的名字,可以不用明确声明 初始化配置文件 可以不写出事参数contextConfigLocation 如果不规范 必须写明 要求大家 规范 + 明写 --> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- localhost:8080/工程名/User/findUserById?id=1 / 就是tomcat会根据 前端请求的路径 去访问相应的servlet 或者 资源文件 如果找到就访问,找不到就访问当前的 springmvc 对应的servlet 找不到对应的路径的 servlet 时才匹配 现在 / springmvc的servlet --> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>

3.创建配置文件springmvc-servlet.xml

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 声明 HelloController 为当前的HelloController 控制类配置 路径 --> <bean name="/HelloController" class="com.qfedu.controller.HelloController"></bean> <!-- 以下三个 bean 我们 不明写入容器 则容器将以下类型的bean自动加入到容器中--> <!-- 声明再容器种加入 处理器映射 --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> <!-- 处理器适配器--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean> <!-- 视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean> </beans>

4.创建控制类,用接口实现

/** * 创建一个类 实现 Controller 中的方法 handleRequest */ public class HelloController implements Controller { @Override // 处理器 处理前端请求的数据 public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { // ModelAndView 封装了 数据 和 视图(jsp 的路径) ModelAndView modelAndView = new ModelAndView(); // 设置视图路径 jsp 路径 modelAndView.setViewName("/jsp/hello.jsp"); //等价于 向 request 中写入属性 modelAndView.addObject("msg","马上放学"); return modelAndView; // 返回数据 和 视图 的一个封装 } }

5.在web目录下创建/jsp/hello.jsp

<%-- 在springmvc 要明确支持el isELIgnored="false" --%> <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> <h1>Hello</h1> <%-- 可以从 pagescope reqeusscop sessionscope applicationscope 获取 --%> <h3>msg:${msg}</h3> </body> </html>

四.DispatcherServlet DispatcherServlet称为前端控制器,作用就是分发url找到对应的控制器,去处理对应的请求,当前页面访问的路劲找不到对应的Servlet找不到路径时,就去DispatcherServlet配置的路径下去找 配置代码:

<!-- 声明 前端控制器 tomcat启动时 加载DispatcherServlet --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 为前端控制器 配置文件(spring)--> <init-param> <param-name>contextConfigLocation</param-name> <!-- 配置文件名可以为 servlet-name + ‘-’+servlet.xml 名字 此时使规范的名字,可以不用明确声明 初始化配置文件 可以不写出事参数contextConfigLocation 如果不规范 必须写明 要求大家 规范 + 明写 --> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- localhost:8080/工程名/User/findUserById?id=1 / 就是tomcat会根据 前端请求的路径 去访问相应的servlet 或者 资源文件 如果找到就访问,找不到就访问当前的 springmvc 对应的servlet 找不到对应的路径的 servlet 时才匹配 现在 / springmvc的servlet http://localhost:8080/ --> <url-pattern>/</url-pattern> </servlet-mapping> SpringMvc执行流程 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201024190818418.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L05ld19fRHJlYW0=,size_16,color_FFFFFF,t_70#pic_center) Bean配置 <!-- 开启包扫描器--> <cotext:component-scan base-package="com.qfedu.controller"></cotext:component-scan> <!-- 开启 注解的控制器@Controller --> <mvc:annotation-driven></mvc:annotation-driven> <!-- 声明 HelloController 为当前的HelloController 控制类配置 路径 控制器 控制界面的跳转 返回前端数据 等同于servlet name 1.是在容器种 bean 的标识 name 还是一个url 路径 /HelloController --> <bean name="/HelloController" class="com.qfedu.controller.HelloController"></bean> <!-- 以下三个 bean 我们不明写入容器 则容器将以下类型的bean自动加入到容器中--> <!-- 声明在容器种加入 处理器映射器: DispatcherServlet可以根据url 找到对应的处理 就是一个map key 就是url value 就是处理器 /HelloController HelloController.handleRequest 处理器 "/HiController//hi public ModelAndView hi() 处理器 url 组成是由 控制器路径 + 处理器路径 --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> <!-- 处理器适配器 充手机的插排 就是适配器 解决的是 充电接口不匹配 ControllerHandlerAdapter 根据不同类型的处理器 选择调用处理器 插排 可以驱动 手机两插口 也可以驱动 电脑三插口 --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean> <!-- 视图解析器 将处理器返回的 ModelAndView 进行解析 渲染视图 转换为html网页 找到对应 jsp ,并将数据给到 jsp --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>

五.核心注解 1.@Controller:将当前对象加入容器,标记当前类是一个控制器 2.@RequestMapping:可以标记在方法上,标记在方法上时将当前方法作为未处理以key:value形式放置到处理器映射其中,也可以标记在类上,用做标记控制器路径,要和Controller一起使用,标记以后当前端页面请求时需要加上标记的路径

@Controller // 标记当前类是一个控制 @RequestMapping("/HiController") public class HiController { @RequestMapping("/hi")// 将当前的 url 和 处理器 ModelAndView hi() 作为一个映射 放入到 处理器映射器 // key: 控制器路径 + 处理器路径 :/HiController//hi // value: 当前处理器 方法 public ModelAndView hi(){ // ModelAndView 封装了 数据 和 视图(jsp 的路径) ModelAndView modelAndView = new ModelAndView(); // 设置视图路径 jsp 路径 modelAndView.setViewName("/jsp/hello.jsp"); //等价于 向 request 中写入属性 modelAndView.addObject("msg","马上放学"); return modelAndView; // 返回数据 和 视图 的一个封装 } }

3.@RequestMapping其他参数

// path 等价与 value //path = {"/hi2","/hi2_back"} 一个处理器可以配置多个路径 //method = RequestMethod.POST 标记当前处理器 只处理 post 请求 // HTTP Status 405 – Method Not Allowed 如果用 浏览器访问则报错 Request method 'GET' not supported 405 @RequestMapping(path = {"/hi2","/hi2_back"},method = RequestMethod.POST) public ModelAndView hi2(){ // ModelAndView 封装了 数据 和 视图(jsp 的路径) ModelAndView modelAndView = new ModelAndView(); // 设置视图路径 jsp 路径 modelAndView.setViewName("/jsp/hello.jsp"); //等价于 向 request 中写入属性 modelAndView.addObject("msg","hi2"); return modelAndView; // 返回数据 和 视图 的一个封装 }

六.合注解 @GetMapping标记前端页面请求该方法时只能以Get请求进行请求,后面括号内可以进行路径的标注 @PostMapping标记前端页面请求该方法时只能以Post请求进行请求,后面括号内可以进行路径的标注

最新回复(0)