day14_8-MVC-WEB_CRUD
2020-04-10 本文已影响0人
建国同学
一、 MVC思想
MVC
M:Model:模型对象(封装业务操作,算法,可重复使用,JavaBean).DAO Domain
V:View:视图(界面,JSP,HTML)
C:Controler:控制器(控制界面跳转,Servlet)
以Servlet为中心(所有请求都发送给Servlet):
JSP + Servlet + JavaBean .
servlet/JSP/JavaBean的职责:
JSP: 界面输出.
Servlet:
1:接受请求参数
2:调用业务方法,处理请求
3:控制界面跳转.
JavaBean:
封装业务操作,可重复使用.
目的:
责任分离,把业务代码从视图中剥离出来.
二、 三层架构
含义
分层开发模式(技术层面的"分而治之")
- 三层架构(3-tier architecture) :
三层架构通常意义上的三层架构就是将整个业务应用划分为:表现层、业务逻辑层、数据访问层。
目的:
区分层次的目的即为了“高内聚低耦合”的思想
三、 WEB CRUD
1.目录结构
mybatis crud的基础上添加了以下内容
WEB CRUD目录结构
2.请求分发
在service方法中,想要去区分开到底是哪个请求,可以增加一个参数来区分
- 通过地址栏的参数来进入不同的业务
- EmployeeServlet.java
//引入业务层
private IEmployeeService empService = new EmployeeServiceImpl();
// http://localhost/emp?cmd=list 做查询操作
// http://localhost/emp?cmd=saveOrUpdate 做保存或修改
// http://localhost/emp?cmd=delete 做删除操作
// http://localhost/emp?cmd=edit 跳转到编辑页面
// 请求分发
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
// 获取cmd的值 ,去判断是做什么操作
String cmd = req.getParameter("cmd");
if ("delete".equals(cmd)) {
delete(req,resp);
} else if ("edit".equals(cmd)) {
edit(req,resp);
} else if ("saveOrUpdate".equals(cmd)) {
saveOrUpdate(req,resp);
} else{
list(req,resp);
}
}
protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
....
}
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
....
}
protected void edit(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
....
}
protected void saveOrUpdate(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
....
}
// 请求数据转化为employee对象
private void req2emp(HttpServletRequest req,Employee emp){
String name = req.getParameter("name");
String strAge = req.getParameter("age");
String strSalary = req.getParameter("salary");
emp.setName(name);
// 判断字符串是否为空
if(StringUtil.hasLength(strAge)){
emp.setAge(Integer.valueOf(strAge));
}
if(StringUtil.hasLength(strSalary)){
emp.setSalary(new BigDecimal(strSalary));
}
}
3.查询商品
-
流程:
查询商品
protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.接受请求参数,封装成对象
// 2.调用业务方法处理请求
List<Employee> list = empService.listAll();
// 设置共享参数
req.setAttribute("list", list);
// 3.控制页面的跳转
req.getRequestDispatcher("/WEB-INF/view/employee/list.jsp").forward(req, resp);
}
4.删除请求
-
流程
删除请求
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1接受id的值
String strId = req.getParameter("id");
// 判断id不为空,把字符串的id转化为Long类型
if(StringUtil.hasLength(strId)){
Long id = Long.valueOf(strId);
// 2调用业务方法处理请求
empService.delete(id);
}
// 3.重定向跳转到列表页
resp.sendRedirect("/emp");
}
5.编辑界面
- 流程
编辑界面使用getRequestDispatcher为可以共享参数
protected void edit(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取id的值
String strId = req.getParameter("id");
// 判读id是否有值,来辨别是 添加 or 编辑 操作
if(StringUtil.hasLength(strId)){
Employee employee = empService.get(Long.valueOf(strId));
// 设置共享参数
req.setAttribute("emp", employee);
}
// 页面的跳转,跳转到input.jsp
req.getRequestDispatcher("/WEB-INF/view/employee/input.jsp").forward(req, resp);
}
6.保存添加 或 更新
-
流程:
保存添加 或 更新
protected void saveOrUpdate(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.接受请求参数,封装成对象
// 获取id的值
String strId = req.getParameter("id");
Employee emp = new Employee();
req2emp(req, emp);
// 2.调用业务方法处理请求
if(StringUtil.hasLength(strId)){
emp.setId(Long.valueOf(strId));
empService.update(emp);
}else{
empService.save(emp);
}
// 3.控制跳转
resp.sendRedirect("/emp");
}
// 请求数据转化为employee对象
private void req2emp(HttpServletRequest req,Employee emp){
String name = req.getParameter("name");
String strAge = req.getParameter("age");
String strSalary = req.getParameter("salary");
emp.setName(name);
// 判断字符串是否为空
if(StringUtil.hasLength(strAge)){
emp.setAge(Integer.valueOf(strAge));
}
if(StringUtil.hasLength(strSalary)){
emp.setSalary(new BigDecimal(strSalary));
}
}
四、 WEB CRUD——user表
1.主要注意的地方
UserServlet需要添加请求,来获取user新增的传递参数hiredate,并判断是否为空
- UserServlet
// 请求数据转化为user对象
private void req2user(HttpServletRequest req,User user){
String name = req.getParameter("name");
String strAge = req.getParameter("age");
String strSalary = req.getParameter("salary");
String strHiredate = req.getParameter("hiredate");
user.setName(name);
// 判断字符串是否为空
if(StringUtil.hasLength(strAge)){
user.setAge(Integer.valueOf(strAge));
}
if(StringUtil.hasLength(strSalary)){
user.setSalary(new BigDecimal(strSalary));
}
if(StringUtil.hasLength(strHiredate)){
user.setHiredate(Date.valueOf(strHiredate));
}
}
表现层的jsp也要新增入职时间(hiredate)列,
添加标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
以格式为中国的时间格式渲染到页面
<fmt:formatDate value="${user.hiredate}" pattern="yyyy-MM-dd"/>
- list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>list用户列表</title>
</head>
<body>
<%-- ${list}<br/> --%>
<table border="1" cellpadding="0" cellspacing="0" width="80%" align="center" style="border-color: red;">
<caption style="text-align:left">
<a href="/user?cmd=edit" >添加</a>
</caption>
<tr>
<th>序号</th>
<th>ID</th>
<th>姓名</th>
<th>年龄</th>
<th>工资</th>
<th>入职时间</th>
<th>操作</th>
</tr>
<c:forEach items="${list}" var="user" varStatus="vs">
<tr align="center">
<td style="color: red;">${vs.count}</td>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.age}</td>
<td>${user.salary}</td>
<td>
<fmt:formatDate value="${user.hiredate}" pattern="yyyy-MM-dd"/>
</td>
<td>
<a href="/user?cmd=delete&id=${user.id}">删除 </a>
<a href="/user?cmd=edit&id=${user.id}">编辑</a>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
同样要修改
input.jsp
编辑保存页,格式化为yyyy-MM-dd的中国时间,这样date类型的input才能正确识别显示出用-分开的yyyy-MM-dd 格式时间字符串。
-
input.jsp
input.jsp编辑保存页入职时间
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>input</title>
</head>
<body>
<h3>${empty user ? '添加' : '编辑'}用户信息</h3>
<form action="/user?cmd=saveOrUpdate" method="post">
<input type="hidden" name="id" value="${user.id}">
<p>姓名: <input type="text" name="name" value="${user.name}"> </p>
<p>年龄: <input type="number" name="age" value="${user.age}"> </p>
<p>薪资: <input type="number" step="0.01" name="salary" value="${user.salary}"> </p>
<p>入职时间:
<input style="font-family:sans-serif;" type="date" name="hiredate"
value="<fmt:formatDate value="${user.hiredate}" pattern="yyyy-MM-dd"/>">
</p>
<input type="submit" value="${empty user ? '添加' : '修改'}">
</form>
</body>
</html>