自定义MVC的进阶使用

news2024/11/27 8:37:18

文章目录

  • 前言
  • 一、环境配置
    • 1.1 将框架打包成jar包
    • 1.2 将Jar包导入新项目
    • 1.3 将分页标签相关文件、及相关助手类导入
    • 1.4 配置文件
  • 二、前后台编写
    • 2.1 实体类
    • 2.2 dao
    • 2.3 Servlet
    • 2.4 配置mvc.xml
    • 2.5 JSP
    • 2.6 运行结果

前言

通用增删改查、通用分页、XML解析反射建模,包括自定义MVC工作原理与低阶使用等等前面一系列的的文章,其实都是为了这篇博客所作的准备。在本篇博客,会将前面十几篇博客内容串联起来,做出一个简单却不平凡的微项目。

一、环境配置

1.1 将框架打包成jar包

将前面我们所写的通用Servlet——框架打包成Jar包
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 将Jar包导入新项目

将Jar包导入新项目,并导入相关依赖
在这里插入图片描述

1.3 将分页标签相关文件、及相关助手类导入

tag和util
在这里插入图片描述

1.4 配置文件

web.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" version="3.1">
  <display-name>J2EE_Project</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
   <servlet>
  	<servlet-name>mvc</servlet-name>
  	<servlet-class>com.xqx.framework.DispatherServlet</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>

tld文件:自定义标签

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">
    
  <description>JSTL 1.1 core library</description>
  <display-name>JSTL core</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>x</short-name>
  <uri>http://jsp.xqx.cn</uri>
  <tag>
        <name>page</name>
        <tag-class>com.xqx.tag.PageTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <name>pageBean</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>

二、前后台编写

2.1 实体类

package com.xqx.entity;

/**
 * 
 * @author W许潜行
 *
 */
public class Book {
	private int bid;
	private String bname;
	private float price;


	@Override
	public String toString() {
		return "Book [bid=" + bid + ", bname=" + bname + ", price=" + 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
	}
	

}

2.2 dao

package com.xqx.dao;

import java.util.List;

import com.xqx.entity.Book;
import com.xqx.util.BaseDao;
import com.xqx.util.PageBean;
import com.xqx.util.StringUtils;

/**Book dao方法 继承BaseDao
 * @author W许潜行 
 * 2023年7月4日 上午10:00:32
 */
public class BookDao extends BaseDao<Book> {

	/**新增
	 * @param book
	 * @return
	 * @throws Exception
	 */
	public int add(Book book) throws Exception {
		String sql = "insert into t_mvc_book values(?,?,?)";
		return super.executeUpdate(sql, book, new String[] { "bid", "bname", "price" });
	}

	/**删除
	 * @param book
	 * @return
	 * @throws Exception
	 */
	public int delete(Book book) throws Exception {
		String sql = "delete from t_mvc_book where bid =?";
		return super.executeUpdate(sql, book, new String[] { "bid" });
	}

	/**修改
	 * @param book
	 * @return
	 * @throws Exception
	 */
	public int update(Book book) throws Exception {
		String sql = "update t_mvc_book set bname=?,price=? where bid=?";
		return super.executeUpdate(sql, book, new String[] { "bname", "price", "bid" });
	}

	/**查询
	 * @param book
	 * @param pageBean
	 * @return
	 * @throws Exception
	 */
	public List<Book> list(Book book, PageBean pageBean) throws Exception {
		String sql = "select * from t_mvc_book where 1=1 ";
		int bid = book.getBid();
		String bname = book.getBname();
		if (StringUtils.isNotBlank(bname)) {
			sql += " where bname like '%" + bname + "%'";
		}
		if (bid != 0) {
			sql += " and where bid=" + bid;
		}
		return super.executeQuery(sql, Book.class, pageBean);
	}

}

2.3 Servlet

package com.xqx.web;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xqx.dao.BookDao;
import com.xqx.entity.Book;
import com.xqx.framework.Action;
import com.xqx.framework.ModelDriver;
import com.xqx.util.PageBean;

/**子控制类
 * @author W许潜行
 * 2023年7月4日 上午10:04:25
 */
public class BookAction extends Action implements ModelDriver<Book> {
	private Book book = new Book();
	BookDao bd = new BookDao();

	/**
	 * 查询数据
	 * 
	 * @param req
	 * @param resp
	 * @return
	 * @throws Exception
	 */
	public String list(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		PageBean pageBean = new PageBean();
		// 初始化
		pageBean.setRequest(req);
		List<Book> list = bd.list(book, pageBean);
		req.setAttribute("list", list);
		req.setAttribute("pageBean", pageBean);
		System.out.println("调用了");
		return "list";
	}

	/**
	 * 传入编辑页面的值
	 * 
	 * @param req
	 * @param resp
	 * @return
	 * @throws Exception
	 */
	public String toEdit(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		List<Book> list = bd.list(book, null);
		req.setAttribute("edit", list.get(0));
		return "toEdit";
	}

	/**新增
	 * @param req
	 * @param resp
	 * @return
	 * @throws Exception
	 */
	public String add(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		bd.add(book);
		return "toList";
	}

	/**删除
	 * @param req
	 * @param resp
	 * @return
	 * @throws Exception
	 */
	public String delete(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		bd.delete(book);
		return "toList";
	}

	/**修改
	 * @param req
	 * @param resp
	 * @return
	 * @throws Exception
	 */
	public String update(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		bd.update(book);
		return "toList";
	}

	@Override
	public Book getModel() {
		return book;
	}

}

2.4 配置mvc.xml

conf/mvc.xml

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

所需要操作的类和方法在该文件配置

2.5 JSP

booList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="x" uri="http://jsp.xqx.cn"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
<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;
}
.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="请输入书籍名称">
		</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 ">
		<thead>
			<tr>
				<th scope="col">书籍ID</th>
				<th scope="col">书籍名</th>
				<th scope="col">价格</th>
				<th scope="col">操作</th>
			</tr>
		</thead>
		<tbody><!-- 遍历数据 -->
			<c:forEach items="${list }" var="b">
			<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>
	<!-- 分页导航栏 -->
 	<x:page pageBean="${pageBean }"></x:page>  
</body>
</html>

bookEdit.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://jsp.xqx.cn" prefix="x"%>	
<%@ 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>
</head>
<body>
	<form class="form-inline"
		action="${pageContext.request.contextPath }/book.action?methodName=${empty edit ? 'add' : 'edit'}" method="post">
		书籍ID:<input type="text" name="bid" value="${edit.bid }"><br>
		书籍名称:<input type="text" name="bname" value="${edit.bname }"><br>
		书籍价格:<input type="text" name="price" value="${edit.price }"><br>
		<input type="submit">
	</form>


</body>
</html>

2.6 运行结果

查询

在这里插入图片描述

新增

在这里插入图片描述
在这里插入图片描述


修改
在这里插入图片描述
在这里插入图片描述
好啦,本篇博客就到此为止!希望你看完本篇文章有所收获,祝你变得更强!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/724249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络安全带你练爬虫-100练】第6练:内嵌发包提取数据

目录 一、分析目标&#xff1a; 二、代码实现 目标1&#xff1a;对于捕获的URL内嵌发包 目标2&#xff1a;找到电话和邮箱的位置 目标3&#xff1a;提取电话和邮箱 三、完整代码 四、网络安全小圈子 &#xff08;注&#xff1a;需要带上登录成功后的cookie发包&#xff…

Nginx部署前后端分离项目

dev.env.js解释 //此文件时开发环境配置文件 use strice//使用严格模式 const merge require(webpacl-merge)//合并对象 const prodEnv require(./prod.env)//导出 module.exports merge(prodEnv,{//合并两个配置文件对象并生成一个新的配置文件&#xff0c;如果合并的过程…

使用Postman做接口测试并生成接口测试报告

学习目标 1、录制脚本或使用手写url进行抓包 2、微信api接口&#xff08;可录制可手写&#xff09; 3、添加多 个标签&#xff0c;获取多个标签&#xff0c;编辑多个标签&#xff0c;删除多个标签&#xff01;&#xff01;&#xff01;&#xff08;csv格式&#xff09; 4、通过…

Java JDK 安装及环境配置教程

一、安装 1、安装包 jdk1.8安装包下载路径 2、创建一个英文的文件夹 注意&#xff1a;整个路径不要有中文、建议文件夹直接命名为JDK。 3、在该文件夹下创建两个空文件夹&#xff0c;分别为&#xff1a;jdk1.8 和 jre 其中jdk1.8 是我的JDK版本&#xff0c;这个可以自行改变。…

宝塔 安装/使用Jenkins-图文小白教程

一、Jenkins包下载 大家可以从Jenkins官网&#xff08;https://www.jenkins.io/&#xff09;根据自己的需要下载最新的版本。 但Jenkins官网下载较慢&#xff0c;容易造成下载失败。可以去国内的开源镜像网站下载Jenkins最新版本。目前博主使用的是清华大学的开源镜像网站&…

【spring创建对象方式】 and 【Java创建对象方式】

Spring创建对象方式 通过构造函数创建对象&#xff0c;通过静态工厂方式创建对象&#xff0c;通过实例工厂方式创建对象 1、通过构造函数创建对象 无参构造函数&#xff1a; 最基本的对象创建方式&#xff0c;只需要有一个无参构造函数&#xff08;类中没有写任何的构造函数…

excel 复制出来的数据内容自动带上空格

在excel中批量处理完了公式&#xff0c;想复制到navicat 或者文本编辑框里&#xff0c;发现都会自动带上双引号&#xff0c;但是excel 里是没有&#xff0c;查找了半天。 在excel里的文本如下所示 拷贝出来的结果如下所示&#xff1a; 经过检查发现原文中只要带有回车或者换行…

A40i Linux3.10开发板移植高精度定时器hrtimer驱动

目录 整编内核 修改Makefile文件 编译内核 生成.ko文件 应用层调用 这里使用整个编译内核的方式编译.ko文件。 整编内核 编写一个hrtimer_demo.c的驱动程序源码如下&#xff1a; #include <linux/module.h> #include <linux/kernel.h> #include <linux/i…

相机图片给 Livox 激光雷达点云赋色(python代码 单文件)

需要配置PCD文件路径, 图片路径,相机内参,相机和雷达的外参; 单文件, Windows , liunx 都可以运行。 雷达和相机外参如何标定请看我的另外一篇标定的代码文章。 效果如下图: 附上代码: # coding:utf-8import cv2 import numpy as np import open3d as o3ddef get_U…

记录一次在泛微OA中添加js代码块,限制开始日期时间不能大于等于结束日期时间

目标&#xff1a; 在选择流程后提交时&#xff0c;选择的开始日期、时间不能大于结束日期、时间选择的开始日期、时间不能等于结束日期、时间满足以上条件才可以提交 效果图&#xff1a; 在OA后台添加js代码的步骤&#xff0c;如下&#xff1a; 图一&#xff08;第1-5步参考图…

[NPUCTF2020]你好sao啊

前言 base64的解密算法&#xff0c;开始还以为是什么变种加密手段 分析 可以发现加密区域主要位于RxEncode中&#xff0c;最终结果为s中保存数据 解密算法写的有点怪怪的&#xff0c;知道是4转3但给人1的感觉不像是在解密&#xff0c;更像是在换表之类的操作 strchr的作用为…

小程序前端上传图片直传七牛云不存储服务器

fastadmin文件API接口文件下的common修改默认的upload方法&#xff0c;直接替换即可 /*** 上传文件* ApiMethod (POST)* param File $file 文件流*/public function upload(){$file $this->request->file(file);if (empty($file)) {$this->error(__(No file upload…

IDEA中使用Git拉取项目时设置重新输入用户名和密码

1、选择&#xff1a;file ----> setting ---->passwords 2、选中这个Do not save 3、点击OK 4、重新使用Git拉取代码会提示重新输入用户名和密码

培训报名小程序报名列表页开发

目录 1 创建页面2 组件搭建3 设置URL参数4 设置筛选条件5 首页跳转6 最终的效果总结 这节我们来开发报名列表功能&#xff0c;先看原型 1 创建页面 功能要在页面上呈现&#xff0c;需要先创建页面。打开我们的培训报名小程序&#xff0c;在页面区&#xff0c;点击创建页面的…

Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列

目录 332. 重新安排行程 Reconstruct Itinerary &#x1f31f;&#x1f31f;&#x1f31f; 334. 递增的三元子序列 Increasing Triplet Subsequence &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 P…

【数据挖掘从入门到实战】——专栏导读

目录 1、专栏大纲 &#x1f40b;基础部分 &#x1f40b;实战部分 &#x1f40b;竞赛部分 2、代码附录 数据挖掘专栏&#xff0c;包含基本的数据挖掘算法分析和实战&#xff0c;数据挖掘竞赛干货分享等。数据挖掘是从大规模数据集中发现隐藏模式、关联和知识的过程。它结合…

CE-Net

一、贡献 (1)提出DAC模块和RMP模块&#xff0c;以捕获更多高级特征并保留更多空间信息 (2)将所提出的DAC模块和RMP模块与编码器-解码器结构集成在一起&#xff0c;用于医学图像分割 二、方法 (b)部分是shortcut mechanism 空洞卷积 公式化为&#xff1a; 空洞率r对应于对输…

写一个函数求某个数对应的二进制中1的个数(牛客)

[该题的牛客链接](https://www.nowcoder.com/questionTerminal/8ee967e43c2c4ec193b040ea7fbb10b8? 一、方法一&#xff1a;%/达到二进制位右移的效果1.1用>>操作符实现1.2方法一代码的改进&#xff08;针对负数情况&#xff09; 二、方法二&#xff1a;按位与1&#x…

基于PyQt5的桌面图像调试仿真平台开发(14)色彩增强

系列文章目录 基于PyQt5的桌面图像调试仿真平台开发(1)环境搭建 基于PyQt5的桌面图像调试仿真平台开发(2)UI设计和控件绑定 基于PyQt5的桌面图像调试仿真平台开发(3)黑电平处理 基于PyQt5的桌面图像调试仿真平台开发(4)白平衡处理 基于PyQt5的桌面图像调试仿真平台开发(5)…

VSCode编译github上面的C++项目

1、下载cmake 在这里下载对应的版本 https://cmake.org/download/ 测试下载的是这个 下载完成后安装&#xff0c;安装都比较简单 2、安装CMake工具扩展 3、安装C扩展 4、下载github项目 例如&#xff1a;下载这个项目 https://gitcode.net/mirrors/zrax/pycdc?utm_source…