自定义MVC
自定义mvc概念、结构
1、MVC概念
MVC全名是Model View Controller,是模型(model)、视图(view)-控制器(controller)的缩写,它是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组代码!
核心思想:各司其职
2、MVC结构
V
jsp/ios/android
C
servlet/action
M
实体域模型(名词)
过程域模型(动词)
注意:
因为自定义MVC的核心思想是各司其职,所以不能跨层调用,不能从下往上调用,只能出现由上而下的调用!
为什么学习自定义mvc
通常来说,我们做增删改查的话,如果同样是处理书籍的业务,创建的类过多了,因为基本上是应该jsp页面对应一个servlet,就像这样:
案例
我这里以我自己之前做的增删改查的t_solr_job表为例,然后今天也是做增删改查和通用分页,只是在之前那个基础上进行了优化!
第一步:建项目,导包
这是要导入的包:
记得加上工具类:
第二步:(分析实现思路)
按照层层递进的关系来:
entity 实体类
dao
web层 我这里以我写的action包为例
jsp页面
第三步:
Job代码:
这个里面记得放一个无参数的构造方法!
package com.wangqiuping.entity;
import java.io.Serializable;
import java.sql.Date;
/**
*
* @author 小汪同学 2020年6月8日 上午11:21:46
*
*/
public class Job{
private String id;
private String job;
private String company;
private String address;
private String salary;
private String url;
private String limit;
private String time;
private String desc;
private String jobhandle;
private String addresshandle;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getSalary() {
return salary;
}
public void setSalary(String salary) {
this.salary = salary;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getLimit() {
return limit;
}
public void setLimit(String limit) {
this.limit = limit;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public Job() {
super();
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getJobhandle() {
return jobhandle;
}
public void setJobhandle(String jobhandle) {
this.jobhandle = jobhandle;
}
public String getAddresshandle() {
return addresshandle;
}
public void setAddresshandle(String addresshandle) {
this.addresshandle = addresshandle;
}
public Job(String job, String company, String address, String salary, String url, String limit, String time,
String desc, String jobhandle, String addresshandle) {
super();
this.job = job;
this.company = company;
this.address = address;
this.salary = salary;
this.url = url;
this.limit = limit;
this.time = time;
this.desc = desc;
this.jobhandle = jobhandle;
this.addresshandle = addresshandle;
}
public Job(String id, String job, String company, String address, String salary, String url, String limit, String time,
String desc, String jobhandle, String addresshandle) {
super();
this.id = id;
this.job = job;
this.company = company;
this.address = address;
this.salary = salary;
this.url = url;
this.limit = limit;
this.time = time;
this.desc = desc;
this.jobhandle = jobhandle;
this.addresshandle = addresshandle;
}
@Override
public String toString() {
return "Job [id=" + id + ", job=" + job + ", company=" + company + ", address=" + address + ", salary=" + salary
+ ", url=" + url + ", limit=" + limit + ", time=" + time + "]";
}
}
BaseDao代码:
是一个通用的类,里面有一些executeupdate以及executequery的一些方法,
其中增删改用executeupdate方法,查询用executequery方法!
package com.wangqiuping.util;
import java.lang.reflect.Field;
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.wangqiuping.entity.Job;
public class BaseDao<T> {
public List<T> executeQuery(String sql, Class clz, PageBean pageBean) throws SQLException, InstantiationException, IllegalAccessException{
List<T> list = new ArrayList<>();
Connection con = DBAccess.getConnection();
PreparedStatement pst = null;
ResultSet rs = null;
if(pageBean != null && pageBean.isPagination()) {
String countSql = getCountSql(sql);
pst = con.prepareStatement(countSql);
rs = pst.executeQuery();
if(rs.next()) {
pageBean.setTotal(rs.getObject(1).toString());//85
}
String pageSql = getPageSql(sql,pageBean);
pst = con.prepareStatement(pageSql);
rs = pst.executeQuery();
}
else {
pst = con.prepareStatement(sql);
rs = pst.executeQuery();
}
while(rs.next()) {
// list.add(new Book(rs.getInt("bid"), rs.getString("bname"), rs.getFloat("price")));
/*
* Book b = new Book();
* b.setBid(rs.getInt("bid"));
* b.setBname(rs.getString("bname"))
* b.setPrice(rs.getFloat("price"))
* list.add(b);
*
*/
T t = (T) clz.newInstance();
for (Field f : clz.getDeclaredFields()) {
f.setAccessible(true);
f.set(t, rs.getObject(f.getName()));
}
list.add(t);
}
DBAccess.close(con, pst, rs);
return list;
}
//查询符合分页总记录数的sql
private String getPageSql(String sql, PageBean pageBean) {
return sql + " limit "+pageBean.getStartIndex()+","+pageBean.getRows();
}
//查询总记录数的sql
private String getCountSql(String sql) {
return "select count(1) from ("+sql+") t";
}
//增删改用这个方法
public int executeUpdate(String sql, T t, String[] attrs) throws SQLException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
Connection con = DBAccess.getConnection();
PreparedStatement pst = con.prepareStatement(sql);
int loop = 1;
Field f = null;
// attrs = {
"字段名,"字段名","字段名".......}
for (String attr : attrs) {
f = t.getClass().getDeclaredField(attr);
f.setAccessible