MVC三层模式
转自https://www.cnblogs.com/zdxster/p/5305187.html
在Web MVC模式下,模型无法主动推数据给视图,如果用户想要视图更新,需要再发送一次请求(即请求-响应模型)。
M:(Model) 模型 : 应用程序的核心功能,管理这个模块中用的数据和值;
V(View )视图: 视图提供模型的展示,管理模型如何显示给用户,它是应用程序的外观;
C(Controller)控制器: 对用户的输入做出反应,管理用户和视图的交互,是连接模型和视图的枢纽。
MVC用于将web(UI)层进行职责解耦
Controller-Service-DAO-Mapper.xml
逐级调用关系。dao数据包命名方式不同,也可写为mapper数据包。
Controller类前面加@RestController
Service类前面加@Service
Could not find result map com.snow.helloworld.model.entity.OrderRecord
问题原因:mapper.xml文件里错误写成
<select id="selectAll" resultMap="com.snow.helloworld.model.entity.OrderRecord">
select <include refid="Base_Column_List"></include>
from order_record
</select>
正确写法
<select id="selectAll" resultMap="BaseResultMap">
select <include refid="Base_Column_List"></include>
from order_record
</select>
Spring+MyBatis向数据库插中文字符,乱码
解决方法:
步骤一:application.properties中数据库配置如下:
datasource.url=jdbc:mysql://localhost:3306/db_springboot_teach_02?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
步骤二:在类前面加上consumes代码
@RequestMapping(value = "/save",method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_VALUE)
Spring整合Mybatis的步骤
步骤一:加载依赖jar包,Druid、Mysql、Springboot-Mybatis起步依赖、PageHelper分页插件。
步骤二:配置数据库源和数据库连接池,添加在application.properties或application.yml。
步骤三:加入entity,mapper,mappers资源文件,放置model模块中,参见MVC三层的代码,并在启动类中配置MapperScan,明确启动类扫描mapper所在包。
启动类无法扫描到mapper所在包
解决方法:
在application.properties添加如下配置
mybatis.mapper-locations = classpath:mappers/*.xml
mybatis.type-aliases-package=com.snow.helloworld.model.entity
增加前端显示页面View
步骤一:在application.properties添加如下配置
#视图解析器
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
步骤二:
在main目录下创建webapp/WEB-INF/views文件夹,使用File-New-Project-Java-Java EE-Web Application创建。
在该文件夹下创建一个jsp文件,填写内容,参照模板
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<c:set var="ctx" value="${pageContext.request.contextPath}" ></c:set>
<script type="text/javascript">
</script>
<title>Insert title here</title>
</head>
<body>
这是个jsp页面<br/>
id: ${record.id} <br/>
orderNo: ${record.orderNo} <br/>
orderType: ${record.orderType}
</body>
</html>
步骤三:在controller中编写代码,向前端填内容
@RequestMapping(value = prefix+"/index/v2",method = RequestMethod.GET)
public String indexV2(Integer id, ModelMap modelMap){
OrderRecord record=orderRecordMapper.selectByPrimaryKey(id);
modelMap.addAttribute("record",record);
return "orderRecord";
}
modelMap.addAttribute(“record”,record);
这句是关键,将sql查的结果,赋给record上,前端可以调用。其中,modelMap在函数参数里声明的。
整合前端页面
步骤一:在src/main下创建webapp文件夹,并在File->Project Structure中设置Web Resource Directory
步骤二:在webapp文件夹下创建WEB-INF/views文件夹,并新建一个index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<c:set var="ctx" value="${pageContext.request.contextPath}" ></c:set>
<script type="text/javascript">
</script>
<title>Insert title here</title>
</head>
<body>
这是个jsp页面<br/>
Time: ${time}
<br>
Message: ${message}
id: ${record.id} <br/>
orderNo: ${record.orderNo} <br/>
orderType: ${record.orderType}
</body>
</html>
步骤三:pom.xml中添加依赖
<!-- jsp 支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--<scope>provided</scope>-->
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<!-- <scope>provided</scope>-->
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
步骤四:application.properties中配置
#视图解析器
spring.mvc.view.prefix=/WEB-INF/views
spring.mvc.view.suffix=.jsp
步骤五:Controller控制器中代码
@RestController
public class OrderRecordController {
private static final Logger log = LoggerFactory.getLogger(HelloWorldController.class);
@Autowired
private OrderRecordMapper orderRecordMapper;
@RequestMapping(value = "/index")
public String index(){
return "index1";
}
@RequestMapping(value = "/index/{id}")
public String indexV2(@PathVariable Integer id, ModelMap modelMap){
try {
OrderRecord orderRecord = orderRecordMapper.selectByPrimaryKey(id);
modelMap.addAttribute("record",orderRecord);
log.info("查询结果:{}",orderRecord);
}catch (Exception e){
log.error("显示错误:",e.fillInStackTrace());
}
return "indexV2";
}
@RequestMapping(value = {"/","/index3"})
public String indexV3(Map<String, Object> model){
// 直接返回字符串,框架默认会去 spring.view.prefix 目录下的 (index拼接spring.view.suffix)页面
// 本例为 /WEB-INF/jsp/index.jsp
model.put("time", new Date());
model.put("message", "Hello Jsp");
return "index";
}
}
注意:
一是Controller中如果写@Controller,那么@RequestMapping不要写method=RequestMethod.GET;如果写@RestController,那么就无所谓。
二是pom.xml中的jsp依赖,
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<!-- <scope>provided</scope>-->
</dependency>
provided要注释掉。