- 一、Spring MVC概述
- Spring MVC优势
- Spring MVC本质工作
- 三、Spring MVC框架部署
- 3.1 基于maven创建一个web工程
- 3.2 添加SpringMVC依赖
- 3.3 创建MVC配置文件
- 3.4 在web.xml中配置SpringMVC的前端控制器
- 三、SpringMVC框架使用
- 3.1 创建控制器
- 3.1.1 创建控制器类
- 3.1.2 在控制器类中定义处理请求的方法
- 3.1.3 访问
- 3.2 静态资源配置
- 3.2.1
public class MyDateConverter implements Converter
{ SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); public Date convert(String s) { Date date = null; try { date = sdf.parse(s); } catch (ParseException e) { e.printStackTrace(); } return date; } } 5.2.1 配置自定义日期转换器 放在转换器工厂,再配置给SpringMVC
六、文件上传 6.1 SpringMVC框架部署回顾-
基于maven创建web工程
-
添加依赖
- Springcontext aspects jdbc web webmvc jackson
-
创建 SpringMVC配置文件
-
在web.xml中配置SpringMVC的前端控制器
-
在web.xml中配置SpringMVC的编码过滤器
pom中添加war
src-main下创建webapp
webapp下创建WEB-INF
WEB-INF下创建web.xml
Project Structure中设置
按模板创建 spring-servlet-xml 并配置好
按模板创建werb.xml 并配置好 -
配置springMVC静态资源处理策略
6.2 文件上传案例说明:添加图书,同时提交图书的封面图片。
6.2.1 前端提交文件- 表单提交方式必须为post
- 表单enctype=“multipart/form-data”
6.2.2 在控制器接收数据和文件SpringMVC处理上传文件需要借助于CommonsMultipartResolver文件解析器。
- 需要添加文依赖 commons-io,commons-fileupload
commons-io commons-io 2.4 commons-fileupload commons-fileupload 1.4 - 在Spring-servlet.xml 中配置文件解析器
- 控制器接收文件
– 在处理文件上传的方法中定义一个MultiPartFile的对象
- list.jsp
<%-- Created by IntelliJ IDEA. User: zhanghc Date: 2021/10/30 Time: 20:39 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %>图片列表 文件列表
- BookController
@RequestMapping("/list") @ResponseBody public String[] listImgs(HttpServletRequest request){ // 1.从imgs目录下获取所有图片信息 String dir = request.getServletContext().getRealPath("imgs"); File imgDir = new File(dir); String[] fileNames = imgDir.list(); return fileNames; }6.3.2 文件下载- list.jsp
var htmlStr = ""
- BookController
@RequestMapping("/download") public void downloading(String fname, HttpServletRequest request, HttpServletResponse response) throws Exception { // 从imgs目录中找到当前文件 String dir = request.getServletContext().getRealPath("imgs"); String filePath = dir+"/"+fname; FileInputStream fileInputStream = new FileInputStream(filePath); response.setContentType("application/exe"); response.addHeader("Content-Disposition","attachment;filename="+fname); IOUtils.copy(fileInputStream,response.getOutputStream()); }七、统一异常处理在我们的应用系统运行的过程中,可能由于运行环境,用户操作,资源不足等 各方面的原因导致系统出现异常(HTTP状态、Excepton);如果系统出现了异常,这些异常将会呈现给用户,而这种异常的显示没有必要,因此我们可以在服务器进行特定的处理–当系统出现异常之后,能够呈现给用户统一的、可读的异常提示页面。
7.1 HTTP异常状态统一处理HTTP Status 404
- 创建一个用户于进行异常处理的页面:404.jsp
- 在web.xml中进行配置
7.2 JAVA代码异常的统一处理 7.2.1 基于servlet-api处理404 /404.jsp - 创建异常提示页面:err.jsp
- 在web.xml中进行配置
7.2.2 基于SpringMVC处理java.lang.NumberFormatException /err.jsp - 添加异常处理类 在包utils下创建MyExceptionHandler异常处理类,类中添加注解@ControllerAdvice,类中方法添加@ExceptionHandler
@ControllerAdvice public class MyExceptionHandler { @ExceptionHandler(NullPointerException.class) public String nullHandler(){ return "/err.jsp"; } @ExceptionHandler(NumberFormatException.class) public String numberHandler(){ return "/err.jsp"; } }八、拦截器 8.1 什么是拦截器SpringMVC提供的拦截器类似于Servlet-api中的过滤器,可以对控制器的请求进行拦截,实现相关的预处理和后处理。
- 过滤器
– 是servlet规范的一部分,所有的web项目都可以使用
– 过滤器在web.xml配置(可以使用注解),能够拦截所有web请求 - 拦截器
– 是SpringMVC框架的实现,只有在SpringMVC框架中才能使用。
– 拦截器springMVC配置文件中进行配置,不会拦截springMVC放行的资源(jsp/html/css…)
– 拦截器不能替代过滤器,只能用于特定的场景。
- 创建拦截器类,在utils下创建
public class MyInterceptor1 implements HandlerInterceptor { //预处理方法 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("-------------------预处理"); Enumerationkeys = request.getParameterNames(); while(keys.hasMoreElements()){ String key = keys.nextElement(); if("bookId".equals(key)) { return true; } } response.setStatus(400); return false; } // 后处理方法 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { modelAndView.addObject("tips","这是通过拦截器的后处理添加的数据"); System.out.println("-------------------后处理"); } } - 配置拦截器,在SpringMVC中配置拦截路径,拦截器类
表示拦截student下所有控制器,但排查add下的控制器
8.3 拦截器链将多个拦截器按一定的顺序构成一个执行链
对应的执行链顺序如下。
九、SSM整合 9.1 创建web项目
基于maven完成
- 创建maven web项目
- pom文件中packing
war - 完善maven工程的web项目结构
- pom中添加web项目依赖
javax.servlet jsp-api 2.0 provided javax.servlet javax.servlet-api 3.1.0 provided - 配置服务器运行环境
- 添加Mybatis依赖
mysql mysql-connector-java 8.0.22 org.mybatis mybatis 3.4.6 org.projectlombok lombok 1.18.20 provided - 创建Mybatis配置文件mybatis-config.xml
context,aptects,jdbc,test,web,webmvc,jackson
9.3.2 创建spring配置文件,多配置文件分开配置的方式。3.8.2 3.8.2 5.2.12.RELEASE org.springframework spring-context ${spring-version} org.springframework spring-aspects ${spring-version} org.springframework spring-jdbc ${spring-version} org.springframework spring-test ${spring-version} org.springframework spring-web ${spring-version} org.springframework spring-webmvc ${spring-version} com.fasterxml.jackson.core jackson-databind 2.12.4 – spring-context.xml 只配置注解声明,以及类的配置
– spring-mvc.xml 进行mvc相关的配置,静态资源,拦截器
– spring-mybatis.xml 进行spring与mybaits整合相关的配置
9.3.3 配置springmvc前端控制器- web.xml中配置
9.4 整合配置 9.4.1 导入mybatis-spring依赖SpringMVC org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath*:spring-*.xml 1 SpringMVC /
9.4.2 配置druid连接池org.mybatis mybatis-spring 2.0.6 - 添加druid依赖
com.alibaba druid 1.1.10 - 创建druid.properties属性文件,并配置
druid.driver=com.mysql.jdbc.Driver druid.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=utf-8 druid.username=root druid.password=root ## 连接池参数 druid.pool.initSize=1 druid.pool.minIdle=3 druid.pool.maxActive=20 druid.pool.timeout=30000
注意:因The server time zone value****报错,加了“?serverTimezone=UTC&”
- 在spring-mybatis.xml配置数据源
9.4.3 配置SqlSessionFactory- 在spring-mybatis.xml配置SqlSessionFactory
9.4.4 配置MapperScannerConfigurer- 在spring-mybatis.xml配置MapperScannerConfigurer
9.5 整合配置AOP使用spring 提供的事务管理完成DAO操作的事务管理
一般采用基于注解的方式- 将spring提供的事务管理切面类配置到spring容器spring-mybaits.xml中配置
tx:annotation-driven需要在文件中加入命名空间引用
xmlns:tx="http://www.springframework.org/schema/tx" http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">9.6 整合测试 9.6.1 完成User的查询操作- 创建实体类bean/User.java创建
@Data @NoArgsConstructor @AllArgsConstructor @ToString public class User { private int id; private String name; private String pwd; }- 创建接口 dao/UserDAO
public interface UserDAO { public User queryUserByName(String name); }- 在mappers/UserMapper.xml
9.6.2 对DAO进行单元测试select id,name,pwd from user where name=#{name} - 导入junit,spring-test依赖
junit junit 4.12 test - 创建测试类
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"classpath:spring-context.xml","classpath:spring-mvc.xml","classpath:spring-mybatis.xml"}) public class UserDAOTest { @Resource private UserDAO userDAO; @org.junit.Test public void queryUserByName() { User user = userDAO.queryUserByName("张恒超"); System.out.println(user); } } -
- 3.2.1
public class MyDateConverter implements Converter



