1.思维导图(利用自定义mvc框架开发项目)
2.解决了配置文件可随意更改问题(补充昨日内容)
2.1配置文件web.xml
里面添加初始化参数<init-param></init-param>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>JavaEE03</display-name>
<!-- this -->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>com.zy.framework.DispatchServlet</servlet-class>
<!-- 初始化参数 -->
<init-param>
<param-name>configurationLocation</param-name>
<param-value>/mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
2.2 在init里面进行更改
this:指的是web.xml文件中<servlet></servlet>
@Override
public void init() throws ServletException {
try {
//configModel = ConfigModelFactory.build();
//配置的文件位置:web.xml
String configurationLocation = this.getInitParameter("configurationLocation");
if(configurationLocation==null||"".equals(configurationLocation)) {
configurationLocation = "/zking.xml";
}
configModel = ConfigModelFactory.build(configurationLocation);
} catch (Exception e) {
e.printStackTrace();
}
}
3.☆利用框架开发项目:
3.1 :导入框架的jar
最后我们就得到了自己写的jar包
创建一个新的项目,把我们刚刚的jar包导入进去,导入我们自己的jar包同时也要把其他的jar包导入进来,mvc1.jar是依赖与其他的jar包,不然会报错
3.2配置框架的相关配置文件 web.xml
1.mvc.xml放到源文件下方
2.web.xml中配置mvc.xml,让中央控制器加载mvc.xml建模
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>JavaEE_mvc_Test</display-name>
<!-- this -->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>com.zy.framework.DispatchServlet</servlet-class>
<!-- 初始化参数 -->
<init-param>
<param-name>configurationLocation</param-name>
<param-value>/mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
3.3.业务开发
1.原来的增删改
2.解决方案 创建一个BaseDao
把公共部分封装起来
package com.zy.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.zy.util.DBAccess;
import com.zy.util.PageBean;
/**
* 公共方法
* @author zjjt
*
* @param <T>
*/
public class BaseDao<T> {
/**
* 回调函数(匿名内部类)
*/
public interface CallBack<T>{
public List<T> foreach(ResultSet rs) throws Exception;
}
/**
* 共用的方法用于执行sql语句实现增删改
* 通用编辑
* @param sql
* @return
*/
public int executeUpdate(String sql) {
int n = 0;
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//连接数据库
con = DBAccess.getConnection();
//定义sql语句
ps = con.prepareStatement(sql);
n = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
DBAccess.close(con, ps, rs);
}
return n;
}
/**
* 1.通用分页两个基本要素
* 1.1 需要知道满足条件的条目数
* 1.2查询满足条件指定页码的结果
* @throws Exception
*/
public List<T> executeQuery(String sql,PageBean pageBean,CallBack<T> callBack) throws Exception{
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
con=DBAccess.getConnection();
// 如果用户需要分页的话将用户传递过来的sql语句进行转换
if(null!=pageBean&&pageBean.isPagination()) {
String countSql = this.countSql(sql);
ps=con.prepareStatement(countSql);
rs=ps.executeQuery();
if(rs.next()) {
pageBean.setTotal(rs.getInt(1));
}
//开始查询结果
String pageSql = this.pageSql(sql, pageBean);
ps=con.prepareStatement(pageSql);
}else {
//用户不需要分页
ps=con.prepareStatement(sql);
}
rs=ps.executeQuery();
} catch (Exception e) {
e.printStackTrace();
}
return callBack.foreach(rs);
}
/**
* 将用户传递过来的sql语句进行添加修改
* 将用户的sql语句转化为分页sql语句
*/
private String pageSql(String sql,PageBean pageBean) {
String pageSql="select * from ("+sql+")a limit "+pageBean.startIndex()+","+pageBean.getRows();
return pageSql;
}
/**
* 将用户sql语句修改为查询满足条件的总条目数sql语句
* @param sql
* @return
*/
private String countSql(String sql) {
String countSql="select count(*) from ("+sql+") a";
return countSql;
}
}
改良后: 现在增删改查
StuDao继承BaseDao
package com.zy.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.zy.dao.BaseDao.CallBack;
import com.zy.util.PageBean;
import com.zy.util.StringUtils;
import com.zy.entity.Student;
import com.zy.util.DBAccess;
public class StuDao extends BaseDao<Student>{
/**
* 增加
* @param stu 学生对象
* @return 影响行数
*/
public int add(Student stu) {
String sql = "insert into t_student(sname,sname_pinyin,age,remark) values('"+stu.getSname()+"','"+stu.getSnamePinyin()+"','"+stu.getAge()+"','"+stu.getRemark()+"')";
return this.executeUpdate(sql);
}
/**
* 修改
* @param stu 学生对象
* @return 影响行数
*/
public int edit(Student stu) {
String sql = "update t_student set sname='"+stu.getSname()+"',sname_pinyin='"+stu.getSnamePinyin()+"',age='"+stu.getAge()+"',remark='"+stu.getRemark()+"' where sid='"+stu.getSid()+"'";
return this.executeUpdate(sql);
}
/**
* 删除
* @param stu 学生对象
* @return 影响行数
*/
public int delete(Student stu) {
String sql = "delete from t_student where sid='"+stu.getSid()+"'";
return this.executeUpdate(sql);
}
/**
* 查询
* @param stu 学生对象
* @param pg 分页
* @return 结果集
* @throws Exception 处理异常
*/
public List<Student> list(Student stu,PageBean pg) throws Exception{
String sql = "select * from t_student where 1=1";
if(StringUtils.isNotBlank(stu.getSname())) {
sql = " and sname like '%"+stu.getSname()+"%'";
}
if(stu.getSid()!=0) {
sql+=" and sid='"+stu.getSid()+"'";
}
return this.executeQuery(sql, pg, new CallBack<Student>() {
@Override
public List<Student> foreach(ResultSet rs) throws Exception {
List<Student> ls = new ArrayList<Student>();
Student s = null;
while(rs.next()) {
s = new Student();
s.setSid(rs.getInt("sid"));
s.setSname(rs.getString("sname"));
s.setAge(rs.getInt("age"));
s.setRemark(rs.getString("remark"));
ls.add(s);
}
return ls;
}
});
}
}
在StuAction里实行
package com.zy.web;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.zy.dao.StuDao;
import com.zy.entity.Student;
import com.zy.framework.ActionSupport;
import com.zy.framework.ModelDriver;
import com.zy.util.PageBean;
public class StuAction extends ActionSupport implements ModelDriver<Student> {
Student stu = new Student();
StuDao sd = new StuDao();
@Override
public Student getModel() {
// TODO Auto-generated method stub
return stu;
}
public String add(HttpServletRequest req, HttpServletResponse resp) {
try {
sd.add(stu);
} catch (Exception e) {
e.printStackTrace();
}
return "toList";
}
public String delete(HttpServletRequest req, HttpServletResponse resp) {
try {
sd.delete(stu);
} catch (Exception e) {
e.printStackTrace();
}
return "toList";
}
public String edit(HttpServletRequest req, HttpServletResponse resp) {
try {
sd.edit(stu);
} catch (Exception e) {
e.printStackTrace();
}
return "toList";
}
public String list(HttpServletRequest req, HttpServletResponse resp) {
PageBean pageBean = new PageBean();
pageBean.setRequest(req);
try {
List<Student> list = sd.list(stu, pageBean);
req.setAttribute("stu", list);
req.setAttribute("pageBean", pageBean);
} catch (Exception e) {
e.printStackTrace();
}
return "list";
}
public String toEdit(HttpServletRequest req, HttpServletResponse resp) {
// 如果跳转的是新增界面无需查询,如果跳转的是修改界面,需要查询当前bid对应的数据,回显到界面
if(stu.getSid()!= 0) {
try {
List<Student> list = sd.list(stu, null);
req.setAttribute("s", list.get(0));
} catch (Exception e) {
e.printStackTrace();
}
}
return "toEdit";
}
}
bookList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/zking" prefix="z" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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">
<link
href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
rel="stylesheet">
<script
src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
<title>Insert title here</title>
<style type="text/css">
.page-item input {
padding: 0;
width: 40px;
height: 100%;
text-align: center;
margin: 0 6px;
}
.page-item input, .page-item b {
line-height: 38px;
float: left;
font-weight: 400;
}
.page-item.go-input {
margin: 0 10px;
}
</style>
</head>
<body>
<center>
<form class="form-inline" action="${pageContext.request.contextPath }/book.action?methodName=list" method="post">
<div class="form-group mb-2">
<input type="text" class="form-control-plaintext" name="bname"
placeholder="请输入学生名字">
<!-- <input name="rows" value="20" type="hidden"> -->
<!-- 不想分页 -->
<input name="pagination" value="false" type="hidden">
</div>
<button type="submit" class="btn btn-primary mb-2">查询</button>
<a class="btn btn-primary mb-2" href="${pageContext.request.contextPath }/book.action?methodName=toEdit">新增</a>
</form>
<table class="table table-striped">
<tr>
<td>学生编号</td>
<td>学生姓名</td>
<td>学生简写</td>
<td>学生年龄</td>
<td>备注</td>
<td>操作</td>
</tr>
<c:forEach items="${stu }" var="s">
<tr>
<td>${s.sid }</td>
<td>${s.sname}</td>
<td>${s.snamePinyin }</td>
<td>${s.age}</td>
<td>${s.remark }</td>
<td>
<a href="${pageContext.request.contextPath }/book.action?methodName=toEdit&sid=${s.sid}">修改</a>
<a href="${pageContext.request.contextPath }/book.action?methodName=delete&sid=${s.sid}">删除</a>
</td>
</tr>
</c:forEach>
</table>
<z:pagination pageBean="${pageBean }"/>
</center>
</body>
</html>
运行结果