过了下SpringMVC,简单总结一下。
B站学习视频:https://www.bilibili.com/video/BV1mE411X7yp
Spring整合MyBatis:https://www.cnblogs.com/best/p/5648740.html#_label5
1.1 三层架构
MVC是表现层的常用设计模型,SpringMVC是MVC模型的一个具体的实现框架
1.2 MVC
MVC:Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种用于设计创建web应用程序表现层的模式。
1.3 SpringMVC
SpringMVC是MVC模式中的一种框架(模式底下有各种框架适用于不同应用场景),适用于Spring框架,支持RESTful编程风格,运行效率快适用于现在大型的电商项目等对业务处理速度要求较高的场景。
SpringMVC是三层架构中的表现层的一个常用框架,负责接受浏览器传过来的请求参数,返回从业务层接收的响应结果给浏览器。包括数据封装对象(domain/entity及vo),视图(前端)和控制层(controller)。与业务层通过service交互,业务层通过dao和持久层交互。
1.4 SpringMVC的优势
1.5 SpringMVC与Struts2的区别
ONGL:Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,让你通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方法,遍历整个对象的结构图,实现字段类型转换等功能。
JSTL:Java server pages standarded tag library,即JSP标准标签库。是由JCP(Java community Proces)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签库,并由Apache的Jakarta小组来维护。开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
简单的给一个场景,完成SpringMVC框架的作用:将浏览器通过前端传来的请求发送给后台,并将后台传来的响应通过前端传到浏览器上。
2.1 使用IDEA创建一个maven项目,选择原型webapp
2.2 配置pom.xml
UTF-8
1.7
1.7
5.0.2.RELEASE
org.springframework
spring-context
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-webmvc
${spring.version}
javax.servlet
servlet-api
2.5
provided
javax.servlet.jsp
jsp-api
2.0
provided
2.3 在web.xml中配置前端控制器dispatcherServlet
2.4 在resources目录下配置springmvc.xml
2.5 部署tomcat服务器
2.6 编写起始页面index.jsp
2.7 编写controller层
2.8 配置springmvc.xml
2.9 配置web.xml,加载springmvc.xml
Archetype Created Web Application
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
1
dispatcherServlet
/
2.10 编写响应页面success.jsp
2.11 测试,在index.jsp页面中点击超链接,进入success.jsp页面。即点击页面将访问success.jsp的请求通过springmvc框架(dispatcherServlet控制中心)传递到controller层,controller根据链接调用方法(视图解析器对象),跳转success.jsp页面(发送响应给浏览器)
2.12 使用到组件介绍
注:可使用springmvc注解替代处理器适配器和处理器映射器的配置
3.1 @RequestMapping
作用:用于建立请求URL和处理请求方法之间的对应关系(前端发送请求到controller,根据映射关系调用相关的方法)
从@Target原注解上可以看出@RequestMapping可以加到类上表示一级路径,也可放在方法上表示二级路径。便于URL模块化管理
优势:模块驱动开发
属性:
如果@RequestMapping指定params的值,前端必须匹配否则400
3.2 绑定请求参数
注意:请求参数中如果有中文,会出现乱码问题。
解决方法:后端controller中设定编码格式为UTF-8
但是每个controller中都进行request设置冗余代码过多,SpringMVC中支持使用过滤器解决中文乱码(通过配置即可实现)
4.1 @RequestParam
属性中value和name含义相同。默认为value/name
@RequestMapping中的value/name值要和前端中的参数name保持一致(这样即使controller中的方法参数名和前端的不一致,请求参数中的值依旧可以正常传给后端)。
注意有时候controller层的方法参数也不加@RequestParam,不加的话就是普通的参数并且不是必须传的参数(即前端传过来可以为null);如果加@RequestParam,说明这个参数是必须要有的,默认required=true,当然也可以设置required=false设置为非必传。
使用的时候一般可以不加,当需要默认值或者限制必须传递参数的时候可以加@RequestParam注解在方法的参数前。
注意到swagger-ui上的参数description同参数名
4.2 @RequestBody
实际中可以对应项目中的vo(实体对象都是转为json进行前后端交互的),并根据需要加@RequestBody
实际中vo实体可以用@RequestBody,前后端交互使用json;也可以使用@RequestParam,前后端交互使用form
4.3 @ModelAttribute
4.4 @PathVariable
不同的@XXXMapping无需占位符,相同的@XXXMapping路径需要使用占位符区分以便方法的调用
4.5 @RequestHeader
4.6 @CooikeValue
4.7 @SessionAttribute
注意只能加在类上
相当于HttpServletRequest中的setAttribute方法(不推荐使用这种方式的原因是过分依赖ServletAPI,代码的耦合性变高)
4.8 @Validated
当一个实体类中的属性使用validate.annotation中的验证注解之后,在使用该实体作为controller层的参数时添加@Validated表示开启对该实体类属性的验证。如果传入参数不符合验证则提示101及相应错误。
5.1 响应类型为String
5.2 响应类型为void
5.3 响应类型为@ResponseBody
5.4 过滤静态资源
SpringMVC中使用MultipartFile对象来封装前端传过来的文件对象
6.1 文件上传的前提
6.2 SpringMVC实现文件上传
6.2.1 springmvc.xml中配置文件解析器
6.2.2 编写controller层
package com.practice;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/fileUpload")
public String fileUpload(HttpServletRequest request,MultipartFile upload/*必须和前端文件上传input标签中的name相同*/) throws IOException {
System.out.println("upload...");
//使用fileupload组件完成文件上传
//上传的位置(部署在tomcat服务器中,服务器路径为tomcat的安装路径)
String path = request.getSession().getServletContext().getRealPath("/upload/");
System.out.println(path);
//判断路径是否存在,如果不存在手动创建
File file = new File(path);
if(!file.exists()){
//创建文件夹
file.mkdirs();
}
//获取上传文件的名称
String fileName = upload.getOriginalFilename();
//将文件名设置为唯一值,使用UUID
fileName = UUID.randomUUID().toString().replace("-","") + "_" + fileName;
//完成文件上传
upload.transferTo(new File(path,fileName));
return "success";
}
}
6.2.3 编写index.jsp
<%--
Created by IntelliJ IDEA.
User: cici
Date: 2020/8/9
Time: 18:16
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
文件上传
6.2.4 web.xml pom.xml success.jsp 同2.1-2.11
7.1 异常处理
7.1.1 自定义异常类
7.1.2 自定义异常处理器 implements HandlerExceptionResolver
注意error为/WEB-INF/page/error.jsp表示异常展示页面
7.1.3 配置异常处理器
7.1.4 捕获异常处理异常
实际项目中对于异常处理除了会定义一些自定义的异常,另外还会编写高复用的ResponseResult类(一般包含code/message/data属性),用来封装业务处理的返回值(code为常见的响应code,传给前端,前端好调用相关的展示页面)
7.2 拦截器
7.2.1 拦截器的概念
拦截器只对controller层有效,过滤器对规定的路径下所有请求都有效
7.2.2 拦截器入门
1. 自定义拦截器
package com.practice.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//自定义拦截器
public class MyInterceptor implements HandlerInterceptor {
/**
* 预处理:controller方法执行前(一般用于登录合理性判断,是否可登录)
* return true:表示放行,执行下一个拦截器/controller方法
* return false:不放行
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("myInterceptor...");
// request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
return true;
}
/**
* 后处理:在controller执行后,controller的return前执行(例如success.jsp页面跳转前)
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("after");
}
/**
* success.jsp执行后,执行(一般用于释放资源)
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("completion");
}
}
2. springmvc.xml配置拦截器
3. pom.xml web.xml controller index.jsp success.jsp 同上
8.1 搭建基础环境
基础思想:由spring整合springmvc和mybatis
8.1.1 创建maven项目,选择archetype原型为webapp
8.1.2 编写pom.xml
UTF-8
1.8
1.8
5.0.2.RELEASE
1.6.6
1.2.12
5.1.37
3.4.5
org.aspectj
aspectjweaver
1.6.8
org.springframework
spring-aop
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-test
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-jdbc
${spring.version}
mysql
mysql-connector-java
${mysql.version}
javax.servlet
servlet-api
2.5
provided
javax.servlet.jsp
jsp-api
2.0
provided
jstl
jstl
1.2
log4j
log4j
${log4j.version}
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
1.3.0
c3p0
c3p0
0.9.1.2
jar
compile
junit
junit
4.11
compile
8.1.3 建立项目基本架构
8.1.4 部署tomcat服务器
至此,基本的环境搭建完毕
8.2 搭建spring框架
8.2.1 配置Spring配置文件applicationContext.xml
8.2.2 Service层添加注解将service交给spring容器管理
@Service("accountService") //将这个servicec对象交给spring容器管理
public class AccountServiceImpl implements AccountService {
@Override
public List findAllAccount() {
System.out.println("find all account...");
return null;
}
@Override
public void saveAccount(Account account) {
System.out.println("save account...");
}
}
8.2.3 测试
public class AccountTest {
@Test
public void run(){
//加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
//获取对象
AccountService service = (AccountService)context.getBean("accountService");
service.findAllAccount();
}
}
8.3 搭建springmvc框架
8.3.1 配置web.xml 创建前端控制器、初始化springmvc.xml 配置解决中文乱码的过滤器
Archetype Created Web Application
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
1
dispatcherServlet
/
characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
characterEncodingFilter
/*
8.3.2 配置springmvc.xml 配置视图解析器 过滤静态资源
8.3.3 编写controller层以及jsp页面
8.4 搭建mybatis框架
8.4.1 配置映射配置文件sqlMapConfig.xml
8.4.2 使用注解编写dao层
8.5 整合spring和springmvc
8.5.1 web.xml中开启监听器
Archetype Created Web Application
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:applicationContext.xml
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
1
dispatcherServlet
/
characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
characterEncodingFilter
/*
8.5.2 controller层通过@Autowired注入service依赖
8.6 整合spring和mybatis(添加事务管理)
8.6.1 配置applicationContext.xml添加dataSource sqlSessionFactory等的bean对象(将这些对象加入spirng容器进行管理) sqlMapConfig.xml可删除
8.6.2 dao层加@Repository注解,将dao对象加入spring容器管理
8.6.3 对于对数据库的写操作(insert、update、delete)都需要使用到事务,在applicationContext.xml中添加事务管理器的配置
upupup