Spring MVC

第一章:三层架构与MVC设计模式

1.1 架构演进:从C/S到B/S

  • C/S架构:客户端-服务器模式,需安装客户端(如QQ)。
  • B/S架构 :浏览器-服务器模式,Java主要开发场景,天然分为三层:
    • 表现层(WEB层)​:基于MVC模型,处理用户交互。
    • 业务层:实现核心业务逻辑(如订单计算)。
    • 持久层:操作数据库(如MyBatis、Hibernate)。

1.2 MVC模型详解

  • Model:数据模型(如JavaBean),封装业务数据。
  • View:JSP/HTML页面,负责数据展示。
  • Controller:接收请求、校验参数、调度业务逻辑。

第二章:Spring MVC快速入门

2.1 Spring MVC核心优势

  • 轻量级、模块化,无缝整合Spring生态。
  • 对比Struts2:更简洁的配置、更强的注解支持。

2.2 10分钟搭建第一个应用
步骤1:Maven依赖

XML 复制代码
<properties>
    <spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
    <!-- Spring核心 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- Servlet支持 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

步骤2:Controller类

java 复制代码
@Controller
public class HelloController {
    @RequestMapping("/hello.do")
    public String sayHello() {
        System.out.println("请求已处理!");
        return "suc"; // 视图解析器自动补全路径
    }
}

步骤3:视图解析器配置

XML 复制代码
<!-- springmvc.xml -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>

步骤4:配置DispatcherServlet

XML 复制代码
<!-- web.xml -->
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <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>dispatcher</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

第三章:请求参数绑定技巧

3.1 自动绑定规则

  • 基本类型 :表单name与参数名一致即可自动绑定。
  • JavaBean对象 :属性名匹配自动填充(如User{username, age})。
  • 嵌套对象 :使用对象.属性格式(如address.city)。

示例:绑定复杂对象

html 复制代码
<form action="/user/save.do" method="post">
    <input type="text" name="list[0].city" placeholder="城市1">
    <input type="text" name="list[1].city" placeholder="城市2">
</form>

3.2 中文乱码解决

XML 复制代码
<!-- web.xml -->
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

第四章:常用注解深度解析

4.1 参数处理三剑客

  • **@RequestParam**:映射请求参数到方法参数。

    java 复制代码
    @GetMapping("/search")
    public String search(@RequestParam(value = "kw", defaultValue = "") String keyword) {
        // 若未传参数,默认为空字符串
    }
  • **@PathVariable**:RESTful风格URL参数绑定。

    java 复制代码
    @GetMapping("/user/{id}")
    public String getUser(@PathVariable Long id) {
        // 访问 /user/1001 获取ID=1001的用户
    }
  • **@RequestBody**:接收JSON请求体(需配合@RestController)。

    java 复制代码
    @PostMapping("/api/user")
    public ResponseEntity<User> createUser(@RequestBody User user) {
        // 前端发送JSON数据,自动转为User对象
    }

4.2 请求头与Cookie操作

java 复制代码
@GetMapping("/header")
public String showHeader(@RequestHeader("User-Agent") String userAgent) {
    System.out.println("浏览器标识:" + userAgent);
    return "info";
}

@GetMapping("/cookie")
public String readCookie(@CookieValue("JSESSIONID") String sessionId) {
    System.out.println("Session ID:" + sessionId);
    return "info";
}

第五章:RESTful风格实战

5.1 设计原则

  • 资源化URL(如/articles代替/queryArticles.do)。
  • HTTP方法语义化:
    • GET:查询
    • POST:新增
    • PUT:更新
    • DELETE:删除

5.2 实现示例

java 复制代码
@RestController
@RequestMapping("/api/employees")
public class EmployeeController {

    @GetMapping("/{id}")
    public Employee getEmployee(@PathVariable Long id) {
        return employeeService.findById(id);
    }

    @PostMapping
    public ResponseEntity<Void> addEmployee(@RequestBody Employee emp) {
        employeeService.save(emp);
        return ResponseEntity.created(URI.create("/employees/" + emp.getId())).build();
    }
}

测试工具:使用Postman或curl测试API:

bash 复制代码
curl -X POST -H "Content-Type: application/json" -d '{"name":"张三"}' http://localhost:8080/api/employees

最佳实践与常见问题
  • 静态资源处理

    XML 复制代码
    <mvc:resources mapping="/static/**" location="/static/"/>
    <mvc:default-servlet-handler/>
  • 统一异常处理 :使用@ControllerAdvice全局捕获异常。

  • 性能优化 :启用缓存、合理使用@SessionAttributes

相关推荐
m0_740154673 分钟前
SpringMVC 请求和响应
java·服务器·前端
橘猫云计算机设计17 分钟前
基于Java的班级事务管理系统(源码+lw+部署文档+讲解),源码可白嫖!
java·开发语言·数据库·spring boot·微信小程序·小程序·毕业设计
多多*22 分钟前
JavaEE企业级开发 延迟双删+版本号机制(乐观锁) 事务保证redis和mysql的数据一致性 示例
java·运维·数据库·redis·mysql·java-ee·wpf
计算机-秋大田26 分钟前
基于Spring Boot的个性化商铺系统的设计与实现(LW+源码+讲解)
java·vue.js·spring boot·后端·课程设计
士别三日&&当刮目相看38 分钟前
JAVA学习*String类
java·开发语言·学习
烂蜻蜓1 小时前
深度解读 C 语言运算符:编程运算的核心工具
java·c语言·前端
王嘉俊9251 小时前
ReentranLock手写
java·开发语言·javase
my_realmy1 小时前
JAVA 单调栈习题解析
java·开发语言
高飞的Leo1 小时前
工厂方法模式
java·开发语言·工厂方法模式
5967851542 小时前
C#重写treeView控件
java·c#