流程图
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--c3p0-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!-- aopalliance -->
<dependency>
<groupId>org.aopalliance</groupId>
<artifactId>com.springsource.org.aopalliance</artifactId>
<version>1.0.0</version>
</dependency>
<!-- dbcp-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<!-- commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!-- commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- commons-pool -->
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--aspectj.weaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>com.springsource.org.aspectj.weaver</artifactId>
<version>1.6.4.RELEASE</version>
</dependency>
<!-- spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!-- spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!-- spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--spring-expression -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!-- spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.3.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.3.RELEASE</version>
<scope>test</scope>
</dependency>
<!--spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!-- spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
</dependencies>
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 配置SpringMVC前端控制器 -->
<servlet>
<servlet-name>mySpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定SpringMVC配置文件 -->
<!-- SpringMVC的配置文件的默认路径是/WEB-INF/${servlet-name}-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--服务器启动加载spring控制器-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mySpringMVC</servlet-name>
<!-- 设置所有以action结尾的请求进入SpringMVC -->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
/**
* @author joker_dj
* @create 2020-04-21日 22:15
*/
@Controller
public class FirstController {
@RequestMapping("/first.action")
public ModelAndView show(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("name","joker_dj");
modelAndView.setViewName("/first.jsp");
return modelAndView;
}
}
<!--注解扫描-->
<context:component-scan base-package="com.dj.controller"/>
<%@ page isELIgnored="false" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
跳转 <a href="${pageContext.request.contextPath}/first.action">点击</a>
controller的数据:${name}
</body>
</html>
运行启动
点击超链接
前端控制器 用户请求到达前端控制器,它就相当于mvc模式中的C dispatcherServlet是整个流程控制的中心由它调用其它组件处理用户的请求 dispatcherServlet的存在降低了组件之间的耦合性
处理器映射器 HandlerMapping负责根据用户请求url找到Handler处理器 springmvc提供了不同的映射器实现不同的映射方式 HandlerMapping会把找到映射返回给前端控制器
后端控制器 在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
通过HandlerAdapter对处理器进行执行 处理器适配器
视图解析器 View Resolver负责将处理结果生成View视图
springmvc框架提供了很多的View视图类型的支持, 包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
配置视图解析器 当一个页面存放目录结构比较多时,就可以配置目录 在springmvc.xmll中添加
转发:
重定向:
Springmvc框架会自动把Request对象传递给方法。
形参的类型与绑定的类型不一致时,可以使用@RequestParam进行匹配
要求对象当中的属性要和表单当中的名称一致
根据业务需求自定义数据显示格式 需求: 修改商品日期
由于日期数据有很多种格式,springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。
分析:
当发送post请求时,带有中文的参数会发生乱码
<!-- 解决post乱码问题 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 设置编码参是UTF8 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
必须设置对应的请求参数和请求值才能访问到对应的内容
发送的请求头必须要与设置的请求相同时,才能够访问到对应的方法
2. *:匹配任意字符
3. **:匹配多重路径
资源定位及资源操作的风格 不是协议,可以遵循,也可以不遵循
http://localhost:8080/get.action?id=10 查询 get http://localhost:8080/add.action 新增 post http://localhost:8080/update.action 修改 post http://localhost:8080/delete.action?id=10 删除 post
http://localhost:8080/goods/1 查询GET http://localhost:8080/goods 新增POST http://localhost:8080/goods 更新PUT http://localhost:8080/goods/1 删除DELETE
使用@PathVariable接收RestFul风格参数
配置过滤器 web.xml
发送请求
服务器接收处理
注意事项
作用:在方法中接收请求头当中的信息
作用:用来接收浏览发送过来的cookes值
方法介绍: 1. Model addAttribute(String attributeName, Object attributeValue);
添加键值属性对
2. Map<String, Object> asMap();
将当前的model转换成Map
3. Model addAllAttributes(Map<String, ?> attributes);
将attributes中的内容复制到当前的model中 如果当前model存在相同内容,会被覆盖
4. Model addAllAttributes(Collection<?> attributeValues);
以集合中数据的类型做为key, 将所提供的Collection中的所有属性复制到这个Map中, 如果有同类型会存在覆盖现象
5. Model mergeAttributes(Map<String, ?> attributes); 将attributes中的内容复制到当前的model中 如果当前model存在相同内容,不会被覆盖
6. boolean containsAttribute(String attributeName);
将模型中的某个属性暂存到 HttpSession 中,以便多个请求之间可以共享这个属性
通过注解
获取session
使用@SessionAttribute来访问预先存在的全局会话属性
作用:
在方法定义上使用 @ModelAttribute 注解,Spring MVC 在调用目标处理方法前, 会先逐个调用在方法级上标注了@ModelAttribute 的方法。
当我们发送一个请求时,如果没有找到对应的mapping 则会对配置文件当中匹配mvc:view-controller
注意点:使用时要添加后面的内容 mvc:annotation-driven/
<mvc:annotation-driven /> 是一种简写形式 会自动注册三个Bean:
并提供了 数据绑定支持, @NumberFormatannotation支持, @DateTimeFormat支持, @Valid支持,读写XML的支持(JAXB), 读写JSON的支持(Jackson)。
简介
在使用SpringMVC的时候我们可以使用Spring封装的一系列表单标签,这些标签都可以访问到ModelMap中的内容
作用
使用场景
使用方式
<%@taglib uri="http://www.springframework.org/tags/form" prefix="fm" %>
处理请求
页面处理
为什么后端要做表单的校验
如果只使用前端校验的话 如果浏览器把JS给禁用掉,就弯度子啦
JSR
JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE 6.0 中 JSR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解 指定校验规则,并通过标准的验证接口对 Bean 进行验证
Hibernate Validator
是 JSR 303 的一个参考实现, 除支持所有标准的校验注解外,它还支持以下的扩展注解
常用校验规则
<mvc:annotation-driven/>
使用form标签 <fm:error path=“username”></fm:error>
概述
在进行Spring MVC的配置时,通常我们会配置一个dispatcher servlet用于处理对应的URL
在设置url-pattern时可以设置三种形式
url-pattern为/时访问静态资源 方式1-
<mvc:default-servlet-handler/>
方式2- 采用spring自带方法
<mvc:resources>
配置
<mvc:annotation-driven />
<mvc:resources location="/img/" mapping="/img/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
描述
location元素表示webapp目录下的static包下的所有文件; mapping元素表示以/static开头的所有请求路径,如/static/a 或者/static/a/b; 该配置的作用是:DispatcherServlet不会拦截以/static开头的所有请求路径,并当作静态资源 交由Servlet处理。
概述
当前端使用Ajax发送请求时,服务器要以JSON的数据格式响应给浏览器
使用方式
@ResponseBody来实现;注解方式
<mvc:annotation-driven/>
序列化方式
<form id="myform">
user:<input type="text" name="username"><br>
age:<input type="text" name="age" ><br>
爱好:<input type="checkbox" name="hobby" value="篮球"> 篮球
<input type="checkbox" name="hobby" value="乒乓球"> 乒乓球
<input type="checkbox" name="hobby" value="足球"> 足球
</form>
<input type="button" id="formbtn" value="发送form">
序列化转Json
(function($){
$.fn.serializeJson=function(){
var serializeObj={};
var array=this.serializeArray();
var str=this.serialize();
$(array).each(function(){
if(serializeObj[this.name]){
if($.isArray(serializeObj[this.name])){
serializeObj[this.name].push(this.value);
}else{
serializeObj[this.name]=[serializeObj[this.name],this.value];
}
}else{
serializeObj[this.name]=this.value;
}
});
return serializeObj;
};
})(jQuery);
作用
使用
发送Json参数
发送二进制流
视图解析器
视图
常见实现类
InternalResourceView 将JSP或其它资源封装成一个视图 是InternalResourceViewResoler默认使用的实现类
概述
多文件上传
WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件
概述
异常处理
处理 Handler 中用 @ExceptionHandler 注解定义的方法。
@ExceptionHandler优先级 根据继承关系 找继承关系比较近的那一个
@ControllerAdvice 如果在当前类中没有找到@ExceptionHanler 则会到@ControllerAdvice 中的@ExceptionHandler 注解方法
概述
默认实现过程
原理 如果没有显式定义本地化解析器 SpringMVC 会使用 AcceptHeaderLocaleResolver:根据 HTTP 请求头的 Accept-Language 参数确定本地化类型
实现
概述
方法介绍 preHandle(): 在业务处理器处理请求之前被调用 postHandle: 在业务处理器处理完请求后 afterCompletion: 在 DispatcherServlet 完全处理完请求后被调用
SpringMVC拦截器使用
配置文件当中添加拦截器