自定义MVC架构【下】(一)

简介: 自定义MVC架构【下】

一、前言

在上篇中,我们已经优化了子控制器初始化、跳转页面的代码冗余以及请求参数进行实体封装的三大问题,目前我们的自定义MVC已经可以满足绝大部分需求了,下面我来带领大家使用我们的自定义MVC架包以及CRUD操作的优化。

(以下的所有代码我都会上传CSDN欢迎下载或者翻阅前两篇博客也可以)

二、导出自定义MVC架包

首先,使用之前,我们必须先将我们所写的自定义MVC导出jar文件才行。

第一步:找到有关自定义MVC的包

我们的framework与model包

第二步:右击Export导出

第三步:选择JAR file文件

第四步:选择自己需要存放的位置进行保存一键Finish即可

这样我们所写的自定义MVC架包就做好啦!!

三、使用自定义MVC架包

①建立一个web项目,将所需要的架包导入(特别是我们自己所写的架包)

②建立工具包(utils)将所需的文件导入

注意:这里最好测试一下我们的数据库帮助类(DBAccess),是否连接数据库成功

③导入我们的mvc.xml子控制配置文件

最好新建一个Source Folder资源包进行保存

<?xml version="1.0" encoding="UTF-8"?>
<config>
  <action path="/book" type="com.zking.web.BookAction">
    <forward name="list" path="/bookList.jsp" redirect="false" />
    <forward name="toList" path="/book.action?methodName=list"
      redirect="true" />
    <forward name="toEdit" path="/bookEdit.jsp" redirect="false" />
  </action>
</config>

这里的xml配置文件与自定义MVC架构【中】的有所不同,因为增删改查操作需要有三种情况,第一种查询界面、第二种修改初始化数据界面、第三种增删改操作执行过后调用list方法先同步数据再进行回显。

④web.xml文件手动配置中央控制器(DispatchServlet)

<?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>xmymvc_crud</display-name>
  <servlet>
    <servlet-name>mvc</servlet-name>
    <servlet-class>com.zking.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>

温馨提示:

因为以前我们是在中央控制器(DispatchServlet)进行注解的方式进行拦截servlet请求的操作并完成初始化配置,但是现在中央控制器(DispatchServlet)是架包里面的东西了所以需要手动配置需要解析的xml文件(/mvc.xml)。

四、优化增删改查Dao层及Servlet

1.优化增删改查Dao层

创建数据库实体以及dao包

实体类

package com.zking.entity;
public class Book {
  private int bid;
  private String bname;
  private float price;
  public int getBid() {
    return bid;
  }
  public void setBid(int bid) {
    this.bid = bid;
  }
  public String getBname() {
    return bname;
  }
  public void setBname(String bname) {
    this.bname = bname;
  }
  public float getPrice() {
    return price;
  }
  public void setPrice(float price) {
    this.price = price;
  }
  @Override
  public String toString() {
    return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + "]";
  }
}

这里我们就可以优化我们的Dao层代码了,将增删改融为一个代码。

       增删改查的通用套路
       1.建立链接
       2.预定义对象PreparedStatement
       3.设置占位符的?的值
       4.pst.executeUpdate();

所以我们可以将重复的代码和思维进行优化

BaseDao(通用的增删改查)

package com.zking.util;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.zking.entity.Book;
import com.zking.util.DBAccess;
import com.zking.util.PageBean;
import com.zking.util.StringUtils;
/**
 * 所有Dao层的父类
 *  BookDao
 *  UserDao
 *  OrderDao
 *  ...
 * @author Administrator
 *
 * @param <T>
 */
public class BaseDao<T> {
  /**
   * 通用的增删改方法
   * @param book
   * @throws Exception
   */
  public void executeUpdate(String sql, T t, String[] attrs) throws Exception {
    Connection con = DBAccess.getConnection();
    PreparedStatement pst = con.prepareStatement(sql);
    /*
     * 思路:
     *  1.从传进来的t中读取属性值
     *  2.往预定义对象中设置了值
     */
    for (int i = 0; i < attrs.length; i++) {
      Field f = t.getClass().getDeclaredField(attrs[i]);
      f.setAccessible(true);
      pst.setObject(i+1, f.get(t));
    }
    pst.executeUpdate();
  }
  /**
   * 通用分页查询
   * @param sql
   * @param clz
   * @return
   * @throws Exception
   */
  public List<T> executeQuery(String sql,Class<T> clz,PageBean pageBean) throws Exception{
    List<T> list = new ArrayList<T>();
    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(String.valueOf(rs.getObject(1)));
      }
      String pageSQL = getPageSQL(sql,pageBean);
      pst = con.prepareStatement(pageSQL);
      rs = pst.executeQuery();
    }else {
      pst = con.prepareStatement(sql);
      rs = pst.executeQuery();
    }
    while (rs.next()) {
      T t = clz.newInstance();
      Field[] fields = clz.getDeclaredFields();
      for (Field f : fields) {
        f.setAccessible(true);
        f.set(t, rs.getObject(f.getName()));
      }
      list.add(t);
    }
    return list;
  }
  /**
   * 将原生SQL转换成符合条件的总记录数countSQL
   * @param sql
   * @return
   */
  private String getCountSQL(String sql) {
    return "select count(1) from ("+sql+") t";
  }
  /**
   * 将原生SQL转换成pageSQL
   * @param sql
   * @param pageBean
   * @return
   */
  private String getPageSQL(String sql,PageBean pageBean) {
    return sql + " limit "+ pageBean.getStartIndex() +","+pageBean.getRows();
  }
}

BookDao继承BaseDao

package com.zking.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import com.zking.entity.Book;
import com.zking.util.BaseDao;
import com.zking.util.DBAccess;
import com.zking.util.PageBean;
import com.zking.util.StringUtils;
public class BookDao extends BaseDao<Book>{
  public void add(Book book) throws Exception {
    String sql = "insert into t_mvc_book values(?,?,?)";
    super.executeUpdate(sql, book, new String[] {"bid","bname","price"});
  }
  public void edit(Book book) throws Exception {
    String sql = "update t_mvc_book set bname = ?, price = ? where bid = ?";
    super.executeUpdate(sql, book, new String[] {"bname","price","bid"});
  }
  public void delete(Book book) throws Exception {
    String sql = "delete from t_mvc_book where bid = ?";
    super.executeUpdate(sql, book, new String[] {"bid"});
  }
  public List<Book> list(Book book,PageBean pageBean) throws Exception {
    String sql = "select * from t_mvc_book where 1=1 ";
    String bname = book.getBname();
    if(StringUtils.isNotBlank(bname)) {
      sql += " and bname like '%"+bname+"%'";
    }
    return super.executeQuery(sql, Book.class, pageBean);
  }
}


相关文章
|
4月前
|
设计模式 前端开发 数据库
从MVC到MVVC:软件架构的演变和迭代(二)
从MVC到MVVC:软件架构的演变和迭代
|
3月前
|
前端开发 Java fastjson
且谈软件架构(二) 模块化与MVC
且谈软件架构(二) 模块化与MVC
|
8天前
|
前端开发 Java PHP
信息系统架构模型(1) MVC
信息系统架构模型(1) MVC
13 0
|
17天前
|
XML 前端开发 测试技术
安卓架构模式:MVC、MVP、MVVM及更多
【4月更文挑战第13天】本文探讨了安卓应用开发中的常见架构模式,包括MVC、MVP和MVVM,以及VIPER和Clean Architecture。MVC分离关注点,易于理解,但安卓不直接支持。MVP通过呈现器实现更清晰的分层和便于单元测试。MVVM利用数据绑定简化UI逻辑,适合声明式编程。开发者应根据项目需求、团队技能和维护周期选择合适架构,随着工具和框架的进步,未来将提供更多模块化、可测试性和敏捷性的解决方案。
|
2月前
|
设计模式 前端开发 数据处理
MVC架构中,控制器和模型之间是如何交互的
MVC架构中,控制器和模型之间是如何交互的
12 0
|
2月前
|
存储 设计模式 前端开发
请解释 Web 应用程序的 MVC(模型-视图-控制器)架构。
【2月更文挑战第26天】【2月更文挑战第89篇】请解释 Web 应用程序的 MVC(模型-视图-控制器)架构。
|
4月前
|
设计模式 监控 前端开发
从MVC到MVVC:软件架构的演变和迭代(一)
从MVC到MVVC:软件架构的演变和迭代
|
4月前
|
设计模式 存储 前端开发
【各种问题处理】MVC、MVP、MVVM 、MVI、VIPER 架构(设计模式)
【1月更文挑战第13天】【各种问题处理】MVC、MVP、MVVM 、MVI、VIPER 架构(设计模式)
|
4月前
|
前端开发 Java 数据库
MVC模式和三层架构
MVC模式和三层架构
21 0
|
4月前
|
设计模式 前端开发 数据库
IOS开发基础知识:什么是 MVC 架构?它在 iOS 中的应用是什么样的?
IOS开发基础知识:什么是 MVC 架构?它在 iOS 中的应用是什么样的?
25 1