Spring MVC
- 一、SpringMVC介绍
- 1. 三层架构
- 2. MVC设计模型
- 3. SpringMVC概述
- 二、 环境搭建
- Step 1. 创建项目
- Step 2. 补全Maven文件夹
- Step 3. 添加依赖
- Step 4. 配置前端控制器
- Step 5. 配置SpringMVC的配置文件
- Step 6. 配置Tomcat服务器
- 三、 SpringMVC的处理请求流程
- 1. SpringMVC框架基于组件方式执行流程
- 2. RequestMapping注解
- 四、请求参数的绑定
- 五、常用注解
一、SpringMVC介绍
1. 三层架构
B/S架构和C/S架构。服务器端分成三层框架。
表现层 | 业务层 | 持久层 |
---|---|---|
SpringMVC | Spring | MyBatis |
web层,接收浏览器传来的请求,并响应结果 | 处理公司具体的业务逻辑 | 用来操作数据库 |
2. MVC设计模型
Model:JavaBean的对象,封装数据 View:前端技术 Controller:Servlet等,请求首先进入部分
3. SpringMVC概述
定义:一种基于Java实现的MVC设计模型的请求驱动类型的轻量级Web框架。 优势:清晰的角色划分,多个模块/组件;强大的JSP标签库。 SpringMVC与Struts2: 共同点:表现层框架,基于MVC模型,基层都是ServletAPI(request,response),处理请求的机制都是一个核心控制器。 区别:SpringMVC入口是Servlet,基于方法设计的,效率高简洁,JSTL表达式执行效率高; Struts2入口是Filter,基于类设计的,每次执行都会创建一个动作类,OGNL表达式开发效率高。
二、 环境搭建
Step 1. 创建项目
Intellij构建Maven webapp项目,为了创建快速可以添加一条属性:archetypeCatalog:internal
Step 2. 补全Maven文件夹
创建java、resources文件夹,并Mark Directory As相应的目录。
Step 3. 添加依赖
在pom.xml中
代码语言:javascript复制<?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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ustc</groupId>
<artifactId>springmvc_test</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>springmvc_test Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.0.2.RELEASE</spring.version>
<javax.servlet.version>2.5</javax.servlet.version>
<javax.servlet.jsp.version>2.0</javax.servlet.jsp.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${javax.servlet.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>${javax.servlet.jsp.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>springmvc_test</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
Step 4. 配置前端控制器
在web.xml中
代码语言:javascript复制<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--配置前端控制器-->
<servlet>
<servlet-name>dispatcherServlet</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>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Step 5. 配置SpringMVC的配置文件
在resources文件夹下新建一个springmvc.xml的XML Configuration File - Spring Config。
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.2.xsd">
<!-- 使用注解开发,不用配置controller,需要配置一个组件扫描器 -->
<context:component-scan base-package="com.ustc.controller"/>
<!-- 视图解析器 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置从项目根目录到指定目录一端路径 ,建议指定浅一点的目录-->
<property name="prefix" value="/WEB-INF/pages/"></property>
<!-- 文件的后缀名 -->
<property name="suffix" value=".jsp"></property>
</bean>
<!--开启SpringMVC框架注解的支持-->
<mvc:annotation-driven/>
</beans>
Step 6. 配置Tomcat服务器
Deployment添加相应的项目和路径名。
注意:其中xml的格式和配置项信息在代码中均给出,创建文件时有出入的地方可以以该文中代码内容为主。
- 总结
三、 SpringMVC的处理请求流程
1. SpringMVC框架基于组件方式执行流程
DispatcherServlet
是整个流程控制的中心,由它调用其他组件处理用户的请求,其存在降低了组件之间的耦合性。
HandlerMapping
负责根据用户请求找到Handler处理器(业务控制器),返回一个执行链(某个类中的某个方法),通过配置文件、实现结构、注解等方式来实现映射。
HandlerAdapter
处理器适配器才是根据执行链找到具体的Handler来处理请求,返回一个jsp。
ViewResolver
视图解析器负责将处理结果生成View视图。
三大组件配置:<mvc:annotation-driven>
会自动加载处理映射器和处理适配器,视图解析器则需要自己配置。
2. RequestMapping注解
- 作用 用于建立请求URL和处理请求方法之间的对应关系。
- 属性 path/value均指路径映射,有多个值时不可省略 method指可以接收的请求方式(超链接一般为Get方法) params指定限制请求参数的条件(必须要有这个String要求的属性) headers指定限制消息头的条件(必须有这个String名的请求头)
四、请求参数的绑定
- 绑定机制 表单提交的数据都是k-v格式的,SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制其中方法的参数进行绑定的,要求提交表单的name和参数名称是相同的。
- 支持的数据类型 基本数据类型和字符串类型;实体类型JavaBean;集合数据类型。
2.1 JavaBean中包含引用类型 name命名为“引用类型名.属性名” 解决POST中文乱码问题:过滤器 在web.xml中
代码语言:javascript复制<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</filter>
2.2 集合数据类型 name命名为“集合名[位置].属性名”
2.3 自定义类型转换器 SpringMVC中自动进行数据类型转换,进入Web默认都是String。需要Converter注册类型转换器(组件)。 例如:Data数据类型
代码语言:javascript复制
2.4 Servlet原生API 在Controller方法中直接添加HttpServletRequest等的参数。
五、常用注解
- RequestParam 参数:name、required
- RequestBody 作用:用于获取请求体内容,直接使用得到的是key=value … 结构的数据,不适用于get请求。常用于异步处理。
- PathVaribale 用于绑定url中的占位符,例如/delete/{id}中的{id}。传递url的方式是/test/10,并不是/test/{id} 参数:name
- restful编程风格 请求地址都一样,根据不同的请求方式来区分不同的方法。
- 基于HiddentHttpMethodFilter的示例 由于浏览器的form表单只支持GET和POST请求,而DELETE、PUT等method并不支持,该过滤器用于模拟这些方法。需要配置。 此外,可以通过WebClient使用静态方法发送请求,模拟各种请求方式;或通过浏览器插件,如火狐的RESTer。
- RequestHeader 用于获得请求消息头。参数:value、required
- CookieValue 用于把指定的cookie名称的值传入控制器方法参数。 浏览器每次请求访问服务器,都会创建一个session空间,并以cookie的形式返回一个JESSIONID。
- ModelAttribute 修饰方法:表示当前方法会再控制器的方法执行之前先执行,修饰的方法可以有也可以没有返回值。(场景:使用原来数据库中的某一个属性值,其他值传递) 修饰参数:获取指定的数据给参数赋值。 参数:value用于获取数据的key,key可以是POJO的属性名称,也可以是map结构的key。
- SessionAttribute 用于多次执行控制器方法间的参数共享。 参数:value指定存入的属性名称,type指定存入的数据类型。
可以是用${…}EL表达式,sessionScope。可以直接使用Model/ModelMap类。
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
代码语言:javascript复制@Controller
@RequestMapping("/test")
@SessionAttributes(value = "msg")
public class TestController {
@RequestMapping("/setSessionAttributes")
public String testSetSession(ModelMap modelMap) {
modelMap.addAttribute("msg", "CAN YOU SEE ME?");
return "success";
}
@RequestMapping("/getSessionAttributes")
public String testGetSession(ModelMap modelMap) {
String msg = (String) modelMap.get("msg");
System.out.println(msg);
return "success";
}
@RequestMapping("/delSessionAttributes")
public String testDelSession(SessionStatus sessionStatus) {
sessionStatus.setComplete();
return "success";
}
}