SpringMVC(1)学习
SpringMVC
Spring MVC是什么?
Spring MVC是Spring框架的一个模块,是基于Java的轻量级Web框架 实现了MVC(Model-View-Controller)设计模式 用于构建灵活 可扩展的Web应用程序
核心思想
“请求驱动” 围绕前端控制器(DispatcherServlet)设计 将所有请求统一发送到相应的处理器 实现松耦合的组件化开发
主要优点
1 高度可配置和灵活
支持多种视图技术(JSP,Thymeleaf,FreeMarker等)
灵活的数据绑定和验证机制
2 强大的注解支持
@Controller
@RequestMapping("/user")
public class UserController {@GetMapping("/{id}")public String getUser(@PathVariable Long id, Model model) {// 简洁的注解驱动开发}
}
3 Spring生态无缝集成
可轻松整合Spring IOC,AOP 事务管理等
支持依赖注入 便于测试和维护
4 RESTful支持完善
原生支持REST风格的Web服务
方便构建前后端分离架构
5 拦截器和异常处理
提供灵活的拦截器机制
统一的异常处理方案
Springmvc流程详细实现
1 客户端请求
GET /user/1 HTTP/1.1
Host: localhost:8080
2 DispatcherServlet(前端控制器)
// web.xml 配置
<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>
作用:统一接受所有请求,是整个流程的调度中心
3 处理器映射(HandlerMapping)
@Controller
@RequestMapping("/user")
public class UserController {@GetMapping("/{id}") // ← 这里建立URL与方法的映射public String getUser(@PathVariable Long id, Model model) {// ...}
}
实现机制
扫描所有的@Controller注解的类
解析@RequestMapping 注解建立URL – 方法的映射表
根据请求URL找到对应的处理器方法
4 控制器执行(HandleAdapter)
// Spring MVC 内部执行流程
Object[] args = resolveHandlerMethodParameters(method, request, response);
Object result = method.invoke(handler, args); // 反射调用控制器方法
@PathVariable- 路径变量@RequestParam- 请求参数@RequestBody- 请求体Model- 模型数据
5 业务处理
@Service
public class UserService {public User getUserById(Long id) {return userRepository.findById(id);}
}@Controller
public class UserController {@Autowiredprivate UserService userService; // 依赖注入@GetMapping("/{id}")public String getUser(@PathVariable Long id, Model model) {User user = userService.getUserById(id); // 业务逻辑处理model.addAttribute("user", user);return "userDetail";}
}
6 视图解析
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/>
</bean>
工作流程:
- 控制器返回
"userDetail" - ViewResolver 解析为
/WEB-INF/views/userDetail.jsp - 将模型数据填充到视图
<!-- /WEB-INF/views/userDetail.jsp -->
<html>
<body><h1>用户详情:${user.name}</h1><p>邮箱:${user.email}</p>
</body>
</html>
7 响应返回
<!-- /WEB-INF/views/userDetail.jsp -->
<html>
<body><h1>用户详情:${user.name}</h1><p>邮箱:${user.email}</p>
</body>
</html>
Spring MVC vs 传统Servlet 区别
传统Servlet开发
@WebServlet("/user")
public class UserServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 1. 手动解析参数String id = request.getParameter("id");// 2. 手动创建Service(紧耦合)UserService service = new UserService();User user = service.getUserById(Long.valueOf(id));// 3. 手动设置属性request.setAttribute("user", user);// 4. 手动转发RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/views/userDetail.jsp");dispatcher.forward(request, response);}
}
Spring MVC开发
@Controller
@RequestMapping("/user")
public class UserController {@Autowired // 依赖注入(松耦合)private UserService userService;@GetMapping("/{id}")public String getUser(@PathVariable Long id, Model model) {User user = userService.getUserById(id);model.addAttribute("user", user);return "userDetail"; // 逻辑视图名,由框架解析}
}
| 特性 | 传统Servlet | Spring MVC |
|---|---|---|
| 请求映射 | 手动配置web.xml或@WebServlet | 注解驱动@RequestMapping |
| 参数解析 | 手动request.getParameter() | 自动绑定@RequestParam等 |
| 依赖管理 | 手动new对象,紧耦合 | IOC容器依赖注入 |
| 视图解析 | 手动RequestDispatcher转发 | 视图解析器自动处理 |
| 异常处理 | try-catch块处理 | 统一异常处理@ExceptionHandler |
| 数据验证 | 手动验证逻辑 | 注解验证@Valid |
| 测试难度 | 需要Servlet容器 | 纯POJO,易于单元测试 |
| 代码量 | 冗余代码多 | 简洁,关注业务逻辑 |
第一章:三层架构和MVC
三层架构
1 咱们开发服务器端程序 一般基于两种形式 一种C/S架构程序 一种B/S架构程序
2 使用Java语言基本上都是开发B/S架构的程序,B/S架构又分成了三层架构
3 三层架构
1 表现层:WEB层,用来和客户端进行数据交互的。表现层一般会采用MVC的设计模式
2 业务层:处理公司具体的业务逻辑的
3 持久层:用来操作数据库的
MVC模型
MVC全名是Model View Controller模型视图控制器 各个部分各司其职
Model:数据模型 JavaBean的类 用来进行数据封装
View:指JSP,HTML用来展示数据给用户
Controller:用来接收用户的请求,整个流程的控制器。用来进行数据校验等。
第二章:SpringMVC的入门案例
SpringMVC的概述
- 是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级WEB框架。
- Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。
- 使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts2等。
SpringMVC在三层架构中的位置
- 表现层框架
SpringMVC和Struts2框架的对比
SpringMVC的入门程序
创建WEB工程,引入开发的jar包
具体坐标如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xsy.lx</groupId><artifactId>SpringMVC1</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><spring.version>5.3.30</spring.version><junit.version>4.13.2</junit.version><servlet.api.version>3.1.0</servlet.api.version></properties><dependencies><!-- Spring MVC --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!-- Servlet API --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>${servlet.api.version}</version><scope>provided</scope></dependency><!-- JSP API --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version><scope>provided</scope></dependency><!-- JSTL --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- Testing --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency></dependencies><build><finalName>SpringMVC1</finalName><plugins><!-- 编译器插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.13.0</version><configuration><source>8</source><target>8</target><encoding>UTF-8</encoding></configuration></plugin><!-- WAR插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.4.0</version><configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin></plugins></build>
</project>
编写index.jsp
(超链接默认请求是get)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>入门程序</title>
</head>
<body>
<%--超链接--%>
<h3>入门</h3>
<a href="/hello.do" >入门程序</a>
</body>
</html>
编写suc.jsp页面,路径为:/WEB-INF/pages/suc.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>成功</title>
</head>
<body>
<h3>入门成功了2...</h3>
</body>
</html>
编写Controller类和方法
package com.xsy.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/***** 控制器类,处理用户的请求*/
// 把当前类交给IOC容器进行管理
@Controller
public class HelloController {/*** 处理超链接发送出来的请求* @return*/// 配置映射的配置@RequestMapping(path = "/hello.do")public String sayHello(){System.out.println("入门方法执行了2...");// 跳转的JSP页面的路径,默认使用的是请求的转发// return "/WEB-INF/pages/suc.jsp";// 配置了视图解析器后,写法return "suc";}
}
配置核心的控制器(配置DispatherServlet)
在web.xml配置文件中核心控制器DispatcherServlet
<?xml version="1.0" encoding="UTF-8"?>
<web-appversion="4.0"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:javaee="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xml="http://www.w3.org/XML/1998/namespace"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"><display-name>Archetype Created Web Application</display-name><!--配置前端控制器--><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--加载springmvc.xml配置文件,配置的是Spring配置--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!--配置启动加载--><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
</web-app>
编写springmvc.xml的配置文件
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置spring创建容器时要扫描的包 --><context:component-scan base-package="com.xsy.demo"></context:component-scan><!-- 配置视图解析器 --><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"></property><property name="suffix" value=".jsp"></property></bean><!-- 配置spring开启注解mvc的支持<mvc:annotation-driven></mvc:annotation-driven>-->
</beans>
启动tomcat服务器,进行测试
入门案例的执行过程分析
入门案例的执行顺序
1 当启动Tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatcherServlet对象,就会加载Springmvc.xml配置文件
2 开启了注解扫描 那么HelloController对象就会被创建
3 从index.jsp发送请求,请求会先到达DispatcherServlet核心控制器,根据配置@RequestMapping注解找到执行的具体方法
4 根据执行方法的返回值 再根据配置的视图解析器 去指定的目录下查找指定名称的Jsp文件
5 Tomcat服务器渲染页面 做出响应
SpringMVC官方提供图形
入门案例中的组件分析
1 前端控制器(DispatcherServlet)
2 处理器映射器(HandlerMapping)
3 处理器(Handler)
4 处理器适配器(HandleAdapter)
5 视图解析器(View Resolver)
6 视图(View)
RequestMapping注解
RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系
RequestMapping注解可以作用方法和类上
1 作用在类上:第一级的访问目录
2 作用在方法上:第二级的访问目录
3 细节:路径可以不编写/表示应用的根目录开始
@RequestMapping的属性
1 path 指定请求路径的url
2 value value属性和path属性是一样的
3 method 指定该方法的请求方式
4 params 指定限制请求参数的条件
package com.xsy.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/***** 控制器类,处理用户的请求*/
// 把当前类交给IOC容器进行管理
//一级请求路径
@RequestMapping(path = "say")
@Controllerpublic class HelloController {/*** 处理超链接发送出来的请求* @return*/// 配置映射的配置//耳机请求路径@RequestMapping(path = "/hello.do")public String sayHello(){System.out.println("入门方法执行了2...");// 跳转的JSP页面的路径,默认使用的是请求的转发// return "/WEB-INF/pages/suc.jsp";// 配置了视图解析器后,写法return "suc";}
}
405错误
简单理解;
405错误的全称是“Method Not Allowed”,即“方法不被允许”。
它表示客户端(例如你的浏览器)尝试使用了一个不被服务器允许的HTTP方法来访问某个URL地址。
详细描述
为了更好的理解,我们需要明白几个概念:
HTTP 方法: 这是客户端告诉服务器它想执行什么类型的操作。最常见的几种是:
- GET: 请求获取资源(例如:浏览网页、查看图片)。
- POST: 提交数据给服务器(例如:提交登录表单、发表评论)。
- PUT: 更新服务器上的资源。
- DELETE: 删除服务器上的资源。
- PATCH: 对资源进行部分更新。
服务器端设置: 网站的开发者会为每个URL地址(API接口)规定它允许哪些HTTP方法。例如:
- 一个查看文章的页面,通常只允许 GET 方法。
- 一个接收用户登录的接口,通常只允许 POST 方法。
什么时候会发生405错误?
核心原因:你用的“动作”不对。
举个生活化的例子:
想象一扇门,门上写着“仅限推门进入”(只允许POST)。
- 正确做法: 你用手推门(使用POST方法)→ 门开了(请求成功,状态码200)。
- 触发405错误: 你非要去拉门把手(使用GET方法)→ 门锁死了,并亮起红灯“方法不被允许”(服务器返回405错误)。虽然门(URL)存在,但你用的开门方式不对
