自定义MVC

本文介绍了自定义MVC的概念和结构,强调各司其职的原则,避免跨层调用。通过一个增删改查的案例,详细阐述了从项目建立、包结构设计到具体代码实现的全过程,包括实体类、DAO层、Web层的编写,并展示了通用分页的效果。最后,作者分享了个人学习自定义MVC的心得,认为它能提升开发效率并使代码更整洁。
摘要由CSDN通过智能技术生成

自定义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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值