2021-09-02

本文介绍了如何在项目中导入自定义MVC框架的jar包,并配置web.xml文件,实现Book实体类、DAO操作和BookAction控制器,以进行书籍的增删改查和分页查询。重点展示了如何在jsp界面中使用这些功能,如BookList.jsp和BookEdir.jsp的交互设计。
摘要由CSDN通过智能技术生成

项目结构:本项目有部分取置于以前的代码(需要的可前往主页查看)

一,导入jar包 根据如下操作把上节课我们写的自定义框架导成jar包(自定义框架在我CSDN主页)

 导入自定义MVC框架所使用的相关jar包 

二,做配置  (WEB-INF 下的 web.xml 文件)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>xxx</display-name>
    <servlet>
        <servlet-name>mvc</servlet-name>
        <servlet-class>com.lgs.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>
根目录下 mvc.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<config>
     <action path="/book" type="com.lgs.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>


三,开发

Book实体类

package com.zking.ydz.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;
    }
    
    public Book(int bid, String bname, float price) {
        super();
        this.bid = bid;
        this.bname = bname;
        this.price = price;
    }
 
    public Book() {
        // TODO Auto-generated constructor stub
    }
    
}


dao方法(BookDao继承BaseDao<T>)

package com.zking.ydz.dao;
 
import java.util.List;
 
import com.lgs.entity.Book;
import com.lgs.util.BaseDao;
import com.lgs.util.PageBean;
import com.lgs.util.StringUtils;
 
public class BookDao extends BaseDao<Book>{
    /*
     * 增删改查套路
     * 1,建立连接
     * 2,预定义对象prepareStatement
     * 3,设置占位符
     * 4,pst.executeUpdate();
     */
    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 delete(Book book) throws Exception {
        String sql = "delete from t_mvc_book where bid = ? ";
        super.executeUpdate(sql,book,new String[] {"bid"});
    }
    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 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);
    }
BaseDao<T>(通用父类)

package com.lgs.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.lgs.entity.Book;
import com.lgs.util.DBAccess;
import com.lgs.util.PageBean;
import com.lgs.util.StringUtils;
 
/**
     解决方法:
    1,抽取变化部分作为参数(sql,class对象)
    2,抽取公共的父类,把重复代码剥离出来
 */
public class BaseDao<T> {
    
//    通用的增删改方法
    public void executeUpdate(String sql,T t,String[] attrs) throws Exception {
//        String[] attrs = new String[] {"bid","bname","price"};
        Connection con = DBAccess.getConnection();
        PreparedStatement pst = con.prepareStatement(sql);
//        思路:1,从传进来的t中读取属性值  2,往预定义对象中设置值(用反射)
//        pst.setObject(1, book.getBid());  pst.setObject(2, book.getBname());  pst.setObject(3, book.getPrice());
        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();
    }
    
//    通用分页查询
    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 = getPagesSQL(sql);
            pst = con.prepareStatement(countSQL);//符合条件的某一页数据
            rs = pst.executeQuery();
            if(rs.next()) {
                pageBean.setTotal(String.valueOf(rs.getObject(1)));
            }
            
            String pageSQL = getPagesSQL(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
     */
    private String getPagesSQL(String sql) {
        return "select count(1) from ("+sql+") t";
    }
 
    /*
     * 将原生SQL转换成pageSQL
     */
    private String getPagesSQL(String sql,PageBean pageBean) {
        return sql +" limit "+ pageBean.getStartIndex()+","+pageBean.getRows();
    }
    
}


子控制层(BookAction)

目标:利用郑江做的自定义mvc框架完成增删改查  通用的分页查询  通用的增删改

步骤:
1,导入框架的jar包
2,做好框架的使用配置
3,一切照旧(jsp,servlet/BookAction,Dao层,entity)

注意:

增删改最终都要跳回查询界面
分析:增删改查一共有多少结果集的配置
查询:BookList.jsp  返回值:list
增删改(点击取消):Book.action?methodName=list  返回值:toList
增加修改跳转对应界面:BookEdir.jsp  返回值:toEdit 



  子控制器
 *目标:利用郑江做的自定义mvc框架完成增删改查  通用的分页查询  通用的增删改
  步骤:
 *  1,导入框架的jar包
 *  2,做好框架的使用配置
 *  3,一切照旧(jsp,servlet/BookAction,Dao层,entity)
 *  
 */
 增删改最终都要跳回查询界面
    分析:增删改查一共有多少结果集的配置
    查询:BookList.jsp  返回值:list
    增删改(点击取消):Book.action?methodName=list  返回值:toList
    增加修改跳转对应界面:BookEdir.jsp  返回值:toEdit

jsp界面(bookList首页)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://jsp/jstl/core" 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>书籍列表</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>
    <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 bg-success">
        <thead>
            <tr>
                <th scope="col">书籍ID</th>
                <th scope="col">书籍名</th>
                <th scope="col">价格</th>
                <th scope="col">操作</th>
            </tr>
        </thead>
        <tbody>
            <c:forEach var="b" items="${books }">
                <tr>
                    <td>${b.bid }</td>
                    <td>${b.bname }</td>
                    <td>${b.price }</td>
                    <td>
                    <a href="${pageContext.request.contextPath }/book.action?methodName=toEdit&bid=${b.bid}">修改</a>
                    <a href="${pageContext.request.contextPath }/book.action?methodName=delete&bid=${b.bid}">删除</a>
                    </td>
                </tr>
            </c:forEach>
        </tbody>
    </table>
    
    <z:page pageBean="${pageBean }"></z:page>
 
</body>
</html>

使用python中的pymsql完成如下:表结构与数据创建 1. 建立 `users` 表和 `orders` 表。 `users` 表有用户ID、用户名、年龄字段,(id,name,age) `orders` 表有订单ID、订单日期、订单金额,用户id字段。(id,order_date,amount,user_id) 2 两表的id作为主键,`orders` 表用户id为users的外键 3 插入数据 `users` (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28); `orders` (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4); 查询语句 1. 查询订单总金额 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 3. 查询订单总数最多的用户的姓名和订单总数。 4. 查询所有不重复的年龄。 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 8. 查询订单总金额最大的用户的姓名和订单总金额。 9. 查询订单总金额最小的用户的姓名和订单总金额。 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。
06-03
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值