当前位置: 首页 > news >正文

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";  // 逻辑视图名,由框架解析}
}
特性传统ServletSpring 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的概述

  1. 是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级WEB框架。
  2. Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。
  3. 使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts2等。

SpringMVC在三层架构中的位置

  1. 表现层框架

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)存在,但你用的开门方式不对
http://www.dtcms.com/a/605081.html

相关文章:

  • 高频Linux 面试题
  • 芜湖效能建设网站重庆发布公众号
  • Spring Boot 多环境配置详解:Maven Profile vs 启动参数注入
  • 《Chart.js 饼图:高效与灵活的数据可视化工具详解》
  • 力扣每日刷题251113
  • erp网站开发网站后台管理系统源码下载
  • Spring IOC核心原理与实战技巧
  • 计算中央子午线(Excel版)
  • HarmonyOS Menu组件深度自定义:突破系统默认样式的创新实践
  • 【Rust】从0到1开发和运行Web相关功能,并简单实现数据库连接和查询
  • AI与SEO策略结合下的关键词优化新发现
  • git仓库中的.git目录 , .gitattributes、.gitignore、.gitmodules、.modules文件作用与讲解
  • Win键失效解决方法
  • 酷秒神马 9.0:轻量架构 + 安全防护
  • 编译器用什么语言开发 | 深入分析编译器开发语言及其选择
  • 二手书网站建设报告网站建设的目的与意义
  • 宁波建网站报价客户制作网站时的问题
  • 【杂记】Microchip 的通用集成开发环境工具对照表(MPLAB X IDE)和芯片家族对标表(Microchip VS ST)
  • 使用C#代码在 Word 文档中查找并替换文本
  • Mac C语言编译器 | 如何选择适合的工具来提升开发效率
  • 【JAVA 进阶】Spring Boot 自动配置原理与自定义 Starter 实战
  • LeetCode 1658 | 将 x 减到 0 的最小操作数(C语言滑动窗口解法)
  • 《Effective Java》解读第12条:始终要覆盖toString
  • Linux C语言编译器 | C语言开发的最佳实践与工具选择
  • 网站备案电话没接产品设计分析案例
  • 112、23种设计模式之命令模式(20/23)
  • 第6章:空间查询与地理处理
  • 使用 Docker Compose 一键更新:深入理解 docker-compose pull 的适用场景
  • 一次在VS2022中使用sqlite数据库故障排查过程
  • Mailjet Setup Pitfall Guide: SPF, DKIM, DMARC Deliverability