一、MVC设计模式
1、软件设计模式
软件设计模式(Design pattern)又成为设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
设计模式是为了可重用代码、让代码更容易被他人理解、保证代码的可靠性、程序的重用性。
2、MVC的概念
MVC(Model View Controller)是模型-视图-控制器的缩写,一种软件设计典范,用一种业务逻辑、数据、展示界面分离的方法组织代码,将业务逻辑聚集到一个部件中,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
- 视图(View):JSP或HTML文件
- 控制器(Controller):Servlet(只写Java代码的JSP文件)
- 模型(Model):JavaBean
3、MVC的发展历程
-
JSP Model1
-
JSP Model2
-
JSP Modle3
4、MVC设计模式的优缺点
优点:
- 多个视图共享一个模型,提高代码可重用性
- MVC三个模块互相独立,松耦合架构
- 控制器提高了应用程序的灵活性和可配置性
- 有利于软件工程化管理
缺点:
- 增加了系统结构和实现的复杂性
- 视图对模型数据的低效率访问
二、使用Model1完成对数据库的CURD
1、项目需求
对mysql数据库中的person表进行页面级别的查询、添加、修改、删除操作。
2、项目实现
- 创建数据库
create database if not exists `jdbcdb`;
- 创建person表
create table if not exists `person`(
`id` int(8) auto_increment comment '主键ID',
`name` varchar(32) comment '用户名',
`sex` varchar(1) comment '性别',
`age` int(3) comment '年龄',
`from` varchar(32) comment '籍贯',
primary key(id)
)engine=InnoDB default charset=utf8;
- 创建Java Web项目
打开eclipse,点击File->New->Other…->Web->Dynamic Web Project,输入项目名,选择动态Web模板版本以及Tomcat版本
- 导入jar包
将jar包导入到WebContent的WEB-INF的lib目录下。
- mysql-connector-java-5.1.6.jar:Java连接数据库的驱动
- druid-1.1.9.jar:druid连接池数据源
- commmons-dbutils-1.6.jar:dbutils工具类
- jstl.jar:jstl标签的核心jar包
- standard.jar:JSP标准标签库
- 编写person实体类,与数据库字段对应
package com.jan.entity;
import java.io.Serializable;
/**
* JavaBean
* 人员信息类
* @author Jan
*
*/
public class Person implements Serializable{
/**
* 序列号
*/
private static final long serialVersionUID = -3154289575732556087L;
private Integer pid;
private String pname;
private String sex;
private Integer age;
private String from;
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
@Override
public String toString() {
return "Person [pid=" + pid + ", pname=" + pname + ", sex=" + sex + ", age=" + age + ", form=" + from + "]";
}
}
- 编写JDBC工具类
package com.jan.utils;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSource;
/**
* JDBC工具类
* @author Jan
*
*/
public class JDBCUtil {
// 定义连接属性
private static final String CONN_DRIVER = "com.mysql.jdbc.Driver";
private static final String CONN_URL = "jdbc:mysql://localhost:3306/jdbcdb?characterEncoding=utf8";
private static final String CONN_USER = "root";
private static final String CONN_PASS = "root";
// 创建Druid连接池对象
private static DruidDataSource dataSource = new DruidDataSource();
// 绑定连接属性
static{
dataSource.setDriverClassName(CONN_DRIVER);
dataSource.setUrl(CONN_URL);
dataSource.setUsername(CONN_USER);
dataSource.setPassword(CONN_PASS);
}
/**
* @return 返回一个数据源
*/
public static DataSource getDataSource(){
return dataSource;
}
}
- 创建系统首页
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>人员信息管理系统v1.0</title>
</head>
<body>
<div>
欢迎使用人员管理信息系统!<hr />
<h1 style="color: red">${msg }</h1>
<fieldset>
<legend>请选用功能:</legend>
<p>
1.<a href="showAllServer.jsp">展示所有信息</a>
</p>
<p>
2.<a href="showAdd.jsp">添加人员信息</a>
</p>
</fieldset>
</div>
</body>
</html>
- 编写添加页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>添加人员信息</title>
</head>
<body>
<fieldset>
<legend>添加人员信息</legend>
<form action="showAddServer.jsp" method="post">
<table border="1">
<tr align="center">
<th>姓名</th>
<td><input type="text" name="pname" required="required" placeholder="请在这里输入姓名...." /></td>
</tr>
<tr align="center">
<th>性别</th>
<td>
<input type="radio" name="sex" required="required" value="男" />男  
<input type="radio" name="sex" required="required" value="女" />女
</td>
</tr>
<tr align="center">
<th>年龄</th>
<td><input type="number" min="10" maxlength="100" step="1" name="age" required="required" placeholder="请在这里输入年龄...." /></td>
</tr>
<tr align="center">
<th>籍贯</th>
<td>
<select name="from" required="required">
<option value=false>--请选择--</option>
<option value="北京市">北京市</option>
<option value="上海市">上海市</option>
<option value="天津市 ">天津市</option>
<option value="重庆市">重庆市</option>
<option value="内蒙古自治区">内蒙古自治区</option>
<option value="新疆维吾尔自治区 ">新疆维吾尔自治区</option>
<option value="宁夏回族自治区 ">宁夏回族自治区</option>
<option value="广西壮族自治区 ">广西壮族自治区</option>
<option value="西藏自治区 ">西藏自治区</option>
<option value="黑龙江省">黑龙江省</option>
<option value="吉林省 ">吉林省</option>
<option value="辽宁省">辽宁省</option>
<option value="河北省 ">河北省</option>
<option value="甘肃省">甘肃省</option>
<option value="青海省 ">青海省</option>
<option value="陕西省">陕西省</option>
<option value="河南省 ">河南省</option>
<option value="山东省">山东省</option>
<option value="山西省 ">山西省</option>
<option value="安徽省 ">安徽省</option>
<option value="湖北省 ">湖北省</option>
<option value="湖南省 ">湖南省</option>
<option value="江苏省">江苏省</option>
<option value="四川省 ">四川省</option>
<option value="贵州省">贵州省</option>
<option value="云南省">云南省</option>
<option value="浙江省 ">浙江省</option>
<option value="江西省 ">江西省</option>
<option value="广东省 ">广东省</option>
<option value="福建省 ">福建省</option>
<option value="台湾省 ">台湾省</option>
<option value="海南省 ">海南省</option>
<option value="香港特别行政区 ">香港特别行政区</option>
<option value="澳门特别行政区">澳门特别行政区</option>
</select>
</td>
</tr>
<tr>
<th colspan="2">
<button type="submit">添加</button>
<button type="reset" onclick="window.history.back();">取消</button>
</th>
</tr>
</table>
</form>
</fieldset>
</body>
</html>
- 编写添加控制器
<%@page import="com.jan.utils.JDBCUtil"%>
<%@page import="org.apache.commons.dbutils.QueryRunner"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 添加
// 设置接收的编码格式
request.setCharacterEncoding("utf-8");
// 接收form表单提交的数据
String pname = request.getParameter("pname");
String sex = request.getParameter("sex");
String age = request.getParameter("age");
String from = request.getParameter("from");
// 编写sql
String sql = "insert into person values(null,?,?,?,?);";
// 占位符赋值
Object[] params = {pname, sex, age, from};
// 创建执行对象
QueryRunner qr = new QueryRunner(JDBCUtil.getDataSource());
// 执行sql
int count = qr.update(sql, params);
if(count > 0){
// 重定向到showAll.jsp
response.sendRedirect("showAllServer.jsp");
}else{
request.setAttribute("msg", "对不起,添加失败!");
request.getRequestDispatcher("index.jsp").forward(request, response);
}
%>
- 编写查询控制器
<%@page import="org.apache.commons.dbutils.handlers.BeanListHandler"%>
<%@page import="com.jan.entity.Person"%>
<%@page import="java.util.List"%>
<%@page import="com.jan.utils.JDBCUtil"%>
<%@page import="org.apache.commons.dbutils.QueryRunner"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 编写sql
String sql = "select id pid, name pname, sex, age, `from` from person;";
// 创建sql执行对象
QueryRunner qr = new QueryRunner(JDBCUtil.getDataSource());
// 执行sql语句
List<Person> list = qr.query(sql, new BeanListHandler<Person>(Person.class));
// 保存数据
request.setAttribute("list", list);
// 转发给展示页面
request.getRequestDispatcher("showAll.jsp").forward(request, response);
%>
11.编写查询页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>展示所有数据</title>
<script type="text/javascript">
function deletePerson(pid){
window.location.href="delelteServer.jsp?pid=" + pid;
}
function updatePerson(pid){
window.location.href = "showUpdateServer.jsp?pid=" + pid;
}
</script>
</head>
<body>
<table border="1">
<tr align="center">
<td colspan="6" onclick="window.location.href='index.jsp'">人员信息表</td>
</tr>
<tr align="center">
<td>编号</td>
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
<td>籍贯</td>
<td>操作</td>
</tr>
<c:forEach var="p" items="${list}">
<tr align="center">
<td>${p.pid}</td>
<td>${p.pname}</td>
<td>${p.sex}</td>
<td>${p.age}</td>
<td>${p.from}</td>
<td>
<button type="button" onclick="updatePerson('${p.pid}');">更新</button>||
<button type="button" onclick="deletePerson('${p.pid}');">删除</button>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
- 编写删除控制器
<%@page import="com.jan.utils.JDBCUtil"%>
<%@page import="org.apache.commons.dbutils.QueryRunner"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 删除
// 接收参数
String pid = request.getParameter("pid");
// 编写sql
String sql = "delete from person where id = ?";
// 占位符赋值
Object[] params = {pid};
// 创建执行对象
QueryRunner qr = new QueryRunner(JDBCUtil.getDataSource());
// 执行sql
int count = qr.update(sql, params);
// 判断
if(count > 0){
response.sendRedirect("showAllServer.jsp");
}else{
request.setAttribute("msg", "对不起,删除失败!");
request.getRequestDispatcher("index.jsp").forward(request, response);
}
%>
- 编写更新回显控制器
<%@page import="org.apache.commons.dbutils.handlers.BeanHandler"%>
<%@page import="com.jan.entity.Person"%>
<%@page import="com.jan.utils.JDBCUtil"%>
<%@page import="org.apache.commons.dbutils.QueryRunner"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 更新回显
// 接收pid
String pid = request.getParameter("pid");
// 编写sql
String sql = "select id pid, name pname, sex, age, `from` from person where id = ?";
// 占位符赋值
Object[] params = {pid};
// 创建执行对象
QueryRunner qr = new QueryRunner(JDBCUtil.getDataSource());
// 执行sql
Person person = qr.query(sql, new BeanHandler<Person>(Person.class), params);
// 保存数据
request.setAttribute("person", person);
// 转发到更新人员页面
request.getRequestDispatcher("showUpdate.jsp").forward(request, response);
%>
- 编写更新页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>更新人员信息</title>
</head>
<body>
<fieldset>
<legend>更新人员信息</legend>
<form action="showUpdateServer2.jsp" method="post">
<input type="hidden" name="pid" value="${person.pid }" />
<table border="1">
<tr align="center">
<th>姓名</th>
<td><input type="text" name="pname" required="required" value="${person.pname }" /></td>
</tr>
<tr align="center">
<th>性别</th>
<td>
<input type="radio" name="sex" value="男" required="required" <c:if test="${person.sex eq '男'}">checked</c:if> />男  
<input type="radio" name="sex" value="女" required="required" <c:if test="${person.sex eq '女'}">checked</c:if> />女
</td>
</tr>
<tr align="center">
<th>年龄</th>
<td><input type="number" min="10" maxlength="100" step="1" name="age" required="required" value="${person.age }" /></td>
</tr>
<tr align="center">
<th>籍贯</th>
<td>
<select name="from" required="required">
<option value=false <c:if test="${person.from == '-'}">selected="selected"</c:if>>--请选择--</option>
<option value="北京市" <c:if test="${person.from == '北京市'}">selected="selected"</c:if>>北京市</option>
<option value="上海市" <c:if test="${person.from == '上海市'}">selected="selected"</c:if>>上海市</option>
<option value="天津市 " <c:if test="${person.from == '天津市'}">selected="selected"</c:if>>天津市</option>
<option value="重庆市" <c:if test="${person.from == '重庆市'}">selected="selected"</c:if>>重庆市</option>
<option value="内蒙古自治区" <c:if test="${person.from == '内蒙古自治区'}">selected="selected"</c:if>>内蒙古自治区</option>
<option value="新疆维吾尔自治区 " <c:if test="${person.from == '新疆维吾尔自治区'}">selected="selected"</c:if>>新疆维吾尔自治区</option>
<option value="宁夏回族自治区 " <c:if test="${person.from == '宁夏回族自治区'}">selected="selected"</c:if>>宁夏回族自治区</option>
<option value="广西壮族自治区 " <c:if test="${person.from == '广西壮族自治区'}">selected="selected"</c:if>>广西壮族自治区</option>
<option value="西藏自治区 " <c:if test="${person.from == '西藏自治区'}">selected="selected"</c:if>>西藏自治区</option>
<option value="黑龙江省" <c:if test="${person.from == '黑龙江省'}">selected="selected"</c:if>>黑龙江省</option>
<option value="吉林省" <c:if test="${person.from == '吉林省'}">selected="selected"</c:if>>吉林省</option>
<option value="辽宁省" <c:if test="${person.from == '辽宁省'}">selected="selected"</c:if>>辽宁省</option>
<option value="河北省" <c:if test="${person.from == '河北省'}">selected="selected"</c:if>>河北省</option>
<option value="甘肃省" <c:if test="${person.from == '甘肃省'}">selected="selected"</c:if>>甘肃省</option>
<option value="青海省" <c:if test="${person.from == '青海省'}">selected="selected"</c:if>>青海省</option>
<option value="陕西省" <c:if test="${person.from == '陕西省'}">selected="selected"</c:if>>陕西省</option>
<option value="河南省" <c:if test="${person.from == '河南省'}">selected="selected"</c:if>>河南省</option>
<option value="山东省" <c:if test="${person.from == '山东省'}">selected="selected"</c:if>>山东省</option>
<option value="山西省" <c:if test="${person.from == '山西省'}">selected="selected"</c:if>>山西省</option>
<option value="安徽省" <c:if test="${person.from == '安徽省'}">selected="selected"</c:if>>安徽省</option>
<option value="湖北省" <c:if test="${person.from == '湖北省'}">selected="selected"</c:if>>湖北省</option>
<option value="湖南省" <c:if test="${person.from == '湖南省'}">selected="selected"</c:if>>湖南省</option>
<option value="江苏省" <c:if test="${person.from == '江苏省'}">selected="selected"</c:if>>江苏省</option>
<option value="四川省" <c:if test="${person.from == '四川省'}">selected="selected"</c:if>>四川省</option>
<option value="贵州省" <c:if test="${person.from == '贵州省'}">selected="selected"</c:if>>贵州省</option>
<option value="云南省" <c:if test="${person.from == '云南省'}">selected="selected"</c:if>>云南省</option>
<option value="浙江省" <c:if test="${person.from == '浙江省'}">selected="selected"</c:if>>浙江省</option>
<option value="江西省" <c:if test="${person.from == '江西省'}">selected="selected"</c:if>>江西省</option>
<option value="广东省" <c:if test="${person.from == '广东省'}">selected="selected"</c:if>>广东省</option>
<option value="福建省" <c:if test="${person.from == '福建省'}">selected="selected"</c:if>>福建省</option>
<option value="台湾省" <c:if test="${person.from == '台湾省'}">selected="selected"</c:if>>台湾省</option>
<option value="海南省" <c:if test="${person.from == '海南省'}">selected="selected"</c:if>>海南省</option>
<option value="香港特别行政区 " <c:if test="${person.from == '香港特别行政区'}">selected="selected"</c:if>>香港特别行政区</option>
<option value="澳门特别行政区" <c:if test="${person.from == '澳门特别行政区'}">selected="selected"</c:if>>澳门特别行政区</option>
</select>
</td>
</tr>
<tr>
<th colspan="2">
<button type="submit">更新</button>
<button type="reset" onclick="window.history.back();">取消</button>
</th>
</tr>
</table>
</form>
</fieldset>
</body>
</html>
- 编写更新控制器
<%@page import="org.apache.commons.dbutils.QueryRunner"%>
<%@page import="com.jan.utils.JDBCUtil"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 更新
// 设置接收到的编码格式
request.setCharacterEncoding("utf8");
// 接收更新页面传过来的数据
String pid = request.getParameter("pid");
String pname = request.getParameter("pname");
String sex = request.getParameter("sex");
String age = request.getParameter("age");
String from = request.getParameter("from");
// 编写sql
String sql = "update person set name=?,sex=?,age=?,`from`=? where id=?";
// 占位符赋值
Object[] params = {pname, sex, age, from, pid};
// 创建执行对象
QueryRunner qr = new QueryRunner(JDBCUtil.getDataSource());
// 执行sql
int count = qr.update(sql, params);
// 判断
if(count > 0){
response.sendRedirect("showAllServer.jsp");
}else{
request.setAttribute("msg", "对不起,修改失败!");
request.getRequestDispatcher("index.jsp").forward(request, response);
}
%>
三、软件分层
前言:JSP页面作为页面来说承载了它不该承载的很多东西,比如数据库操作。
1、软件分层概述
JSP开发分两层弊端:
- 展示逻辑与业务流程混合
- 业务代码与数据访问混合;
- 编码职责不清,修改时互相影响,难以重用和扩展
JSP开发分三层:
软件分层的优点:
- 职责清晰
- 无损替换
- 代码复用
- 降低依赖
2、软件分层原则
- 上层依赖其下层,依赖关系不跨层 : 表示层不能直接访问数据访问层;
- 上层调用下层的结果,取决于下层的实现 : 下一层不能调用上一层,下一层不依赖上一层;
- 上层的改变不会影响下一层, 下层的改变会影响上一层得到的结果
- 在上一层中不能出现下一层的概念 : 分工明确,各司其职
3、软件分层
一般软件分层分为三层:
- 数据层:(DAO)Data Access Object层,专门用来处理数据
- 业务层:(Service)Business层,专门用来处理业务逻辑
- 控制层:(Controller)WEB层,专门负责页面的控制
DAO层和Service层之间使用接口和实现类这种设计原则优点:
- 接口负责设计本层结构
- 实现类帮助实现接口的内容
- 接口减少类与类之间的耦合
4、建包小工具
import java.io.File;
import java.io.IOException;
/**
* javaweb分层
* 自动建包工具类
* @author Jan
*
*/
public class AutoCreatePackage {
private static final String packageL0 = "src";
private static final String packageL1 = "com";
private static final String packageL2 = "gaj";
private static final String packageL3e = "entity";
private static final String packageL3u = "utils";
private static final String packageL3d = "dao";
private static final String packageL3s = "server";
private static final String packageL3c = "controller";
private static final String packageL4 = "implement";
private static final String slashes = System.getProperty("file.separator");
public static void main(String[] args) throws IOException {
// 获取src目录
String srcPath = System.getProperty("user.dir") + slashes + packageL0;
// 获取一级目录
String level1 = srcPath + slashes + packageL1;
File file = new File(level1);
if(!file.exists()){
file.mkdir();
System.out.println(level1 +"创建完毕!");
}else{
System.out.println(level1 + "已存在!");
}
// 获取二级目录
String level2 = level1 + slashes + packageL2;
file = new File(level2);
if(!file.exists()){
file.mkdir();
System.out.println(level2 +"创建完毕!");
}else{
System.out.println(level2 + "已存在!");
}
// 获取三级各目录
// 创建com.gaj.entity包
String level3e = level2 + slashes + packageL3e;
file = new File(level3e);
if(!file.exists()){
file.mkdir();
System.out.println(level3e +"创建完毕!");
}else{
System.out.println(level3e + "已存在!");
}
// 创建com.gaj.utils包
String level3u = level2 + slashes + packageL3u;
file = new File(level3u);
if(!file.exists()){
file.mkdir();
System.out.println(level3u +"创建完毕!");
}else{
System.out.println(level3u + "已存在!");
}
// 创建com.gaj.dao包
String level3d = level2 + slashes + packageL3d;
file = new File(level3d);
if(!file.exists()){
file.mkdir();
System.out.println(level3d +"创建完毕!");
}else{
System.out.println(level3d + "已存在!");
}
// 创建com.gaj.server包
String level3s = level2 + slashes + packageL3s;
file = new File(level3s);
if(!file.exists()){
file.mkdir();
System.out.println(level3s +"创建完毕!");
}else{
System.out.println(level3s + "已存在!");
}
// 创建com.gaj.controller包
String level3c = level2 + slashes + packageL3c;
file = new File(level3c);
if(!file.exists()){
file.mkdir();
System.out.println(level3c +"创建完毕!");
}else{
System.out.println(level3c + "已存在!");
}
/*
// 创建com.gaj.server.impl包
String level4s = level3s + slashes + packageL4;
file = new File(level4s);
if(!file.exists()){
file.mkdir();
System.out.println(level4s +"创建完毕!");
}else{
System.out.println(level4s + "已存在!");
}
// 创建com.gaj.dao.impl包
String level4d = level3d + slashes + packageL4;
file = new File(level4d);
if(!file.exists()){
file.mkdir();
System.out.println(level4d +"创建完毕!");
}else{
System.out.println(level4d + "已存在!");
}
*/
System.out.println("所有包创建完毕,请选中src包按F5键刷新目录!");
}
}
四、对人员信息管理系统V1.0进行优化
1、DAO层需求
DAO主要使用来与数据库的数据进行交互,增删改查都是由DAO层负责
DAO层接口
package com.gaj.dao;
import java.util.List;
import com.gaj.entity.Person;
/**
* 人员表的数据库操作接口
* @author Jan
*
*/
public interface PersonDao {
public int insertPerson(Person person) throws Exception;
public int updatePerson(Person person) throws Exception;
public int deletePerson(Person person) throws Exception;
public Person findPersonById(Integer id) throws Exception;
public List<Person> findAllPersons() throws Exception;
}
DAO层实现类
package com.gaj.dao.implement;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import com.gaj.dao.PersonDao;
import com.gaj.entity.Person;
import com.gaj.utils.JDBCUtil;
public class PersonDaoImpl implements PersonDao {
QueryRunner qr = new QueryRunner(JDBCUtil.getDataSouce());
@Override
public int insertPerson(Person person) throws Exception {
// 编写sql
String sql = "insert into person values(null,?,?,?,?)";
// 占位符赋值
Object[] params = {person.getPname(), person.getSex(), person.getAge(), person.getFrom()};
// 执行sql
int count = qr.update(sql, params);
// 返回影响行数
return count;
}
@Override
public int updatePerson(Person person) throws Exception {
// 编写sql
String sql = "update person set name=?, sex=?, age=?, `from`=? where id=?";
// 占位符赋值
Object[] params = {person.getPname(), person.getSex(), person.getAge(), person.getFrom(), person.getPid()};
// 执行sql
int count = qr.update(sql, params);
// 返回影响行数
return count;
}
@Override
public int deletePerson(Person person) throws Exception {
// 编写sql
String sql = "delete from person where id=?";
// 占位符赋值
Object param = person.getPid();
// 执行sql
int count = qr.update(sql, param);
// 返回影响行数
return count;
}
@Override
public Person findPersonById(Integer id) throws Exception {
// 编写sql
String sql = "select id pid, name pname, sex, age, `from` from person where id = ?";
// 占位符赋值
Object param = id;
// 执行sql
Person person = qr.query(sql, new BeanHandler<Person>(Person.class), param);
// 返回对象
return person;
}
@Override
public List<Person> findAllPersons() throws Exception {
// 编写sql
String sql = "select id pid, name pname, sex, age, `from` from person";
// 执行sql
List<Person> list = qr.query(sql, new BeanListHandler<Person>(Person.class));
// 返回集合
return list;
}
}
2、Service层需求
service主要是承上启下,并且处理业务的层,所以此层基本都是为了承接DAO层向页面传递数据的
Service层接口
package com.gaj.server;
import java.util.List;
import com.gaj.entity.Person;
public interface PersonService {
public int insertPerson(Person person) throws Exception;
public int updatePerson(Person person) throws Exception;
public int deletePerson(Person person) throws Exception;
public Person findPersonById(Integer id) throws Exception;
public List<Person> findAllPersons() throws Exception;
}
Service层实现类
package com.gaj.server.implement;
import java.util.List;
import com.gaj.dao.PersonDao;
import com.gaj.dao.implement.PersonDaoImpl;
import com.gaj.entity.Person;
import com.gaj.server.PersonService;
public class PersonServiceImpl implements PersonService {
private PersonDao personDao = new PersonDaoImpl();
@Override
public int insertPerson(Person person) throws Exception {
return personDao.insertPerson(person);
}
@Override
public int updatePerson(Person person) throws Exception {
return personDao.updatePerson(person);
}
@Override
public int deletePerson(Person person) throws Exception {
return personDao.deletePerson(person);
}
@Override
public Person findPersonById(Integer id) throws Exception {
return personDao.findPersonById(id);
}
@Override
public List<Person> findAllPersons() throws Exception {
return personDao.findAllPersons();
}
}
4、优化页面控制器
- 优化添加控制器
<%@page import="com.gaj.entity.Person"%>
<%@page import="com.gaj.server.PersonService"%>
<%@page import="com.gaj.server.implement.PersonServiceImpl"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 添加
// 接收add表单传过来的数据
// 设置编码
request.setCharacterEncoding("utf-8");
// 接收数据
String pname = request.getParameter("pname");
String sex = request.getParameter("sex");
String age = request.getParameter("age");
String from = request.getParameter("from");
// 封装数据
Person person = new Person();
person.setPname(pname);
person.setSex(sex);
person.setAge(Integer.parseInt(age));
person.setFrom(from);
// 创建service层对象
PersonService service = new PersonServiceImpl();
// 执行添加
int count = service.insertPerson(person);
// 判断
if(count > 0){
response.sendRedirect("showAllServer.jsp");
}else{
// 添加失败 返回添加页面并弹窗提示
String msg = "<script type='text/javascript'>history.back();alert('添加失败!');</script>";
// text/html(服务端给客户端发送的数据类型):浏览器将这段话当做是HTML文本进行解析
response.setContentType("text/html; charset=utf-8");
// 打印
out.print(msg);
}
%>
- 优化查询控制器
<%@page import="com.gaj.entity.Person"%>
<%@page import="java.util.List"%>
<%@page import="com.gaj.server.PersonService"%>
<%@page import="com.gaj.server.implement.PersonServiceImpl"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 创建service对象
PersonService service = new PersonServiceImpl();
// 执行查询 获得一个model
List<Person> list = service.findAllPersons();
// 保存model
request.setAttribute("list", list);
// 转发给showAll.jsp
request.getRequestDispatcher("showAll.jsp").forward(request, response);
%>
- 优化删除控制器
<%@page import="com.gaj.entity.Person"%>
<%@page import="com.gaj.server.PersonService"%>
<%@page import="com.gaj.server.implement.PersonServiceImpl"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 删除
// 接收传过来的id值
String pid = request.getParameter("pid");
// 创建service层对象
PersonService service = new PersonServiceImpl();
// 按id查询
Person person = service.findPersonById(Integer.parseInt(pid));
// 删除该人
int count = service.deletePerson(person);
// 判断
if(count > 0){
response.sendRedirect("showAllServer.jsp");
}else{
// 删除失败 返回查询页面并弹窗提示
String msg = "<script type='text/javascript'>history.back();alert('删除失败!');</script>";
// text/html(服务端给客户端发送的数据类型):浏览器将这段话当做是HTML文本进行解析
response.setContentType("text/html; charset=utf-8");
// 打印
out.print(msg);
}
%>
- 优化更新回显控制器
<%@page import="com.gaj.entity.Person"%>
<%@page import="com.gaj.server.implement.PersonServiceImpl"%>
<%@page import="com.gaj.server.PersonService"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 更新回显
// 接收id
String pid = request.getParameter("pid");
// 创建Service层对象
PersonService service = new PersonServiceImpl();
// 按id查询
Person person = service.findPersonById(Integer.parseInt(pid));
// 保存person对象
request.setAttribute("person", person);
// 转发给showUpdate.jsp
request.getRequestDispatcher("showUpdate.jsp").forward(request,response);
%>
- 优化更新控制器
<%@page import="com.gaj.server.implement.PersonServiceImpl"%>
<%@page import="com.gaj.server.PersonService"%>
<%@page import="com.gaj.entity.Person"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 更新
// 设置编码
request.setCharacterEncoding("utf-8");
// 接收update表单数据
String pid = request.getParameter("pid");
String pname = request.getParameter("pname");
String sex = request.getParameter("sex");
String age = request.getParameter("age");
String from = request.getParameter("from");
// 创建service层对象
PersonService service = new PersonServiceImpl();
// 封装person对象
Person person = new Person();
person.setPid(Integer.parseInt(pid));
person.setPname(pname);
person.setSex(sex);
person.setAge(Integer.parseInt(age));
person.setFrom(from);
// 更新person
int count = service.updatePerson(person);
// 判断
if(count > 0){
response.sendRedirect("showAllServer.jsp");
}else{
// 更新失败 返回更新页面并弹窗提示
String msg = "<script type='text/javascript'>history.back();alert('更新失败!');</script>";
// text/html(服务端给客户端发送的数据类型):浏览器将这段话当做是HTML文本进行解析
response.setContentType("text/html; charset=utf-8");
// 打印
out.print(msg);
}
%>