3.5-Spring-MVC
- 新建 MVN 项目:[File]-[New]-[Project]-[Maven]
- 新建 Web 模块:[右键项目]-[New]-[Module]-[勾选 Web Application]
- 添加依赖
- 配置,参考章节 2.1。
- 新建 Controller 类,参考章节 3。
2. Spring MVC 的基本概念
- DispatcherServelt(前端控制器):捕获 Http 请求,根据 servlet.xml 中配置调用 HandlerMapping 根据请求 URL 寻找合适的 Handler。
- Controller(Handler):调用业务逻辑产生合适的 Model 数据,将数据传给视图层呈现或调用其他的 Controller 。
- HandlerAdapter:适配器模式,将不同类型的 Hander 适配成 DispatcherServlet 可以使用的 Handler。
- HandlerInterceptor:实现该接口,并重写 afterCompletion()、postHandler(ModelAndView model)或preHandler(HttpServletRequest request,HttpServletResponse response,Object handler,Exeception ex) 方法,并使用 Configuration 注解注册拦截器。
- HandlerMapping:帮助 DispatcherServelt 找到合适的 Handler(Controller),工作完成之后返回给 DispatcherServelt 一个 HandlerAdapter,包括某个具体的 Controller 示例,和 Controller 需要被包裹的 HandlerInterceptor。
- HandlerExecutionChain:依次执行 preHandler()、Controller method、postHandler()、afterCompletion() 方法。
- ModelAndView: Controller 返回值类型为 ModelAndView 或 String(View 的路径)。
- ViewResoler(视图解析器):告诉 DispatcherServelt 需要用哪个视图进行呈现。
组件 | 功能 |
---|---|
Controller | 使用VO,组合ServiceImpl返回的List,组合成Json,返回给前端。 |
ServiveImpl | 调用Reposity,实现Service接口中的方法,返回结构给 controller。 |
Service | 定义有哪些方法。 |
Repository | 继承JpaRepository,返回List。 |
Entity | 属性名和数据表中的属性名映射,实体类中属性名采用驼峰式命名,数据库表中采用采用下划线式。 |
DTO | 数据传输对象。 |
VO | 展示对象。 |
2. Spring 的上下文层级
2.1 web.xml 中需配置内容
- 上下文
- 多个 DispatcherServelt
- web.xml
2.2 应用上下文配置文件
- Spring 上下文处理 Service、Dao。
- applicationContext.xml
2.3 DispatcherServelt 配置文件
- 配置 Controller
- 配置 ViewResoler
3. Controller
```
//本方法将处理 /courses/view?courseId=123 形式的URL @RequestMapping("/view2/{courseId}")
public String viewCourse2(@PathVariable("courseId") Integer courseId,
Map<String, Object> model) { log.debug("In viewCourse2, courseId = {}", courseId); Course course = courseService.getCoursebyId(courseId); model.put("course",course); return "course_overview";
}
//本方法将处理 /courses/view2/123 形式的URL
@RequestMapping("/view2/{courseId}") public String viewCourse2(@PathVariable("courseId") Integer courseId,
Map<String, Object> model) { log.debug("In viewCourse2, courseId = {}", courseId); Course course = courseService.getCoursebyId(courseId); model.put("course",course); return "course_overview";
}
//本方法将处理 /courses/view3?courseId=123 形式的URL @RequestMapping("/view3") public String viewCourse3(HttpServletRequest request) {
Integer courseId = Integer.valueOf(request.getParameter("courseId")); Course course = courseService.getCoursebyId(courseId); request.setAttribute("course",course); return "course_overview";
}
@RequestMapping(value="/{courseId}",method=RequestMethod.GET)
public @ResponseBody Course getCourseInJson(@PathVariable Integer courseId){
return courseService.getCoursebyId(courseId);
}
@RequestMapping(value="/jsontype/{courseId}",method=RequestMethod.GET)
public ResponseEntity<Course> getCourseInJson2(@PathVariable Integer courseId){
Course course = courseService.getCoursebyId(courseId);
return new ResponseEntity<Course>(course, HttpStatus.OK);
## 4. 注解
|注解|功能|
|------|------|
|ResponseBody|将返回值封装成 Json。|
|RequestBody|将请求体中的JSON字符串绑定到同名的入参或入参的成员变量上。|
# 5. 集成持久化层框架
## 5.1 JPA
* 添加依赖。
[jpa-spring-pom.xml](http://127.0.0.1/Jerrydremakergithubio/jpa-spring-pom.xml)
* 添加 db.properties 文件。
[mysql-db.properties](http://127.0.0.1/Jerrydremakergithubio/mysql-db.properties)
* 在 applicationContext.xml 中配置数据源、EntityManagerFactory、JPA 的注解和基于注解的事务操作、加入 SpringData。
[jpa-spring-test-config.xml](http://127.0.0.1/Jerrydremakergithubio/jpa-spring-test-config.xml)
* 添加实体类。
* 创建 XXXRepository 接口, JpaRepository 接口。
* Controller 类中注入调用 Service 类中的方法,Service 类中注入调用 XXXRepository 接口中的方法。
## 5.2 Hibernate
* 添加依赖,同章节 5.1。
* 添加 db.properties 文件,同章节 5.1。
* 在 applicationContext.xml 中配置数据源、session 工厂和事务管理器。
[hibernate-spring-test-config.xml](http://127.0.0.1/Jerrydremakergithubio/hibernate-spring-test-config.xml)
* 添加实体类。
* 创建 Repository 接口。
* Controller 类中注入调用 Service 类中的方法,Service 类中注入调用 Repository 类中的方法。
## 5.3 Mybaties
### 5.3.1 使用步骤
* 添加依赖。
[test-mybatis-spring-pom.xml ](http://127.0.0.1/Jerrydremakergithubio/test-mybatis-spring-pom.xml)
* 添加 db.properties 文件,同 5.1。
* 在 applicationContext.xml 中配置数据源、session 工厂、 mapper 组件。
[test-mybatis-spring-config.xml](http://127.0.0.1/Jerrydremakergithubio/test-mybatis-spring-config.xml)
* 创建实体类。
* 创建 XXXMapper 接口,
* 创建 XXXMapper.xml 文件。
* Controller 类中注入调用 Service 类中的方法,Service 类中注入调用 Dao 类中的方法。
* 在数据库中创建表。
CREATE TABLE IF NOT EXISTS girl( id INT UNSIGNED AUTO_INCREMENT, cupSize VARCHAR(10) NOT NULL, age INT NOT NULL, PRIMARY KEY ( id ) ); 注:列名和属性名保持一致,若不一致,需要在 parameterMap 或 resultMap 中指定。
### 5.3.2 XXXMapper.xml 文件语法
* 支持 insert、delete、update、selete。
* 只有 selete 支持 resultType 或 resultMap。
* 如果 parameterType 是基础类型,引用时使用 #{参数名};如果 parameterType 是引用类型,引用时使用 #{成员变量名称}。
* 如果列名和属性名不一致,则 需要在 resultMap 中指定。
* 关联查询。
# 6. 集成第三方工具
## 6.1 集成 Log4j
### 6.1.1 添加依赖
#### 6.1.1.1 Log4j 方式
log4j log4j 1.2.17 ``` #### 6.1.1.2 slf4j 方式 ``` org.slf4j slf4j-api 1.7.13org.slf4j slf4j-log4j12 1.7.25
### 6.1.2 在 resource 目录下添加 log4j.properties 配置文件
log4j.rootLogger=INFO,stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.target = System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [ ```
6.2 集成 Lombok
6.2.1 安装插件
6.2.2 添加依赖
6.2.3 添加注解
注:日志打印功能在非 Spring Boot 项目中未实现。