Javaee技术目的总结

news2024/12/26 11:32:12

                                        一.前节回顾

在前一节中,我们了解了:

1.将中央控制器中的Action容器,变成可控制!

2.针对于反射调用业务代码,最终页面跳转 

3.jsp页面参数传递后台的代码优化字段太多有影响!

 


                                   二.项目部署前期准备工作

1.项目运行环境配置

1.1.首先新建一个web项目,完成xml构建

 然后命名,点击next点到底直到这个出现

 将其勾选,next!

1.2加载jar

将我们的jar放在web项目的安全目录下

 然后在进行 add  buth将我们的jar加入项目

1.3准备工作结束

新建一个utils包,将我们的数据连接驱动,以及过滤器,连接保护文件,分页代码,以及通用的方法basedao加入进utils包中

 

                                     三.正式启动项目

1.创建实体包

 定义需要的属性,提供get,set方法;tostring,,有参,无参数方法

 2.建立通用查询方法

2.1.继承BaseDao<Book>实现通用查询

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

3.老版本增删改,和新增删改

3.1老版本增删改

// 增加
	 public int add(Book book) throws Exception {
	 String sql = "insert into t_mvc_book values(?,?,?)";
	 Connection conn = DBAccess.getConnection();
	 PreparedStatement ps = conn.prepareStatement(sql);
	 ps.setObject(1, book.getBid());
	 ps.setObject(2, book.getBname());
	 ps.setObject(3, book.getPrice());
	
	 return ps.executeUpdate();
	 }

 //删除
	 public int del(Book book) throws Exception {
	 String sql = "delete from t_mvc_book where bid=? ";
	 Connection conn = DBAccess.getConnection();
	 PreparedStatement ps = conn.prepareStatement(sql);
	 ps.setObject(1, book.getBid());
	 return ps.executeUpdate();
	 }

 public int edit(Book book) throws Exception {
	 String sql = " update t_mvc_book set bname=?,price=? where bid=?";
	 Connection conn = DBAccess.getConnection();
	 PreparedStatement ps = conn.prepareStatement(sql);
	 ps.setObject(1, book.getBname());
	 ps.setObject(2, book.getPrice());
	 ps.setObject(3, book.getBid());
	 return ps.executeUpdate();
	 }

缺点:

 重复代码:

Connection conn = DBAccess.getConnection();

PreparedStatement ps =conn.prepareStatement(sql);

 重复流程:

ps.setObject(1, book.getBid());
ps.setObject(2, book.getBname());

ps.setObject(3, book.getPrice());

3.2新版本增删改

3.2.1在basedao对于重复代码进行封装

通过一个对象集合来存储实体的属性,然后再通过一个for循环其下标其目的是:根据操作来遍历出来所需要的属性,然后通过反射来操作,最后加入设置值

 * 通用的增删改方法
	 * @param book
	 * @throws Exception
	 * sql:sql语句
	 * T:实体
	 * attrs:实体属性
	 */
	public int executeUpdate(String sql, T t, String[] attrs) throws Exception {
		Connection con = DBAccess.getConnection();
		PreparedStatement pst = con.prepareStatement(sql);
		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));
		}
		 return pst.executeUpdate();
	}

3.2.2新版本

只需要调用那个方法,根据需求编写sql语句,然后在通过return返回,sql语句,实体,集中中的元素


	/**
	 * 通用增删改
	 */
	//增加
	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"});
	}
	//删除
	public int del(Book book) throws Exception {
		String sql = "delete from t_mvc_book where bid=?  ";
		return super.executeUpdate(sql, book, new  String[] {"bid"});
	}
	//修改
	public int edit(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"});
	}

4.juin测试

选择类目,crtl+n 建立一个类Juint  test case给代码进行测试

 

 4.1方法测试

实现思路:

1.首先在最外层:调用私有化的dao方法

2.在方法内部实例化实体

3.然后在通过dao.方法名

4.当然具体情况具体分析

package com.lz.dao;

import static org.junit.Assert.*;

import java.util.List;

import org.junit.Test;

import com.lz.entity.Book;
import com.lz.utils.PageBean;

public class BookDaoTest {
	private  BookDao  bk=new  BookDao();

	@Test
	public void testList() throws Exception {
		 Book  book=new Book();
		 book.setBname("圣墟");
		PageBean  pageBean=new PageBean();
		//pageBean.setPage(3);
		pageBean.setPagination(false);
	        List<Book> list = bk.list(book, pageBean);
	        for (Book b : list) {
				System.out.println(b);
			}
	}

	@Test
	public void testAdd() throws Exception {
		 Book  book=new Book(16,"圣墟嘿嘿嘿",12f);
		 bk.add(book);
	}

	@Test
	public void testDel() throws Exception {
		 Book  book=new Book();
		 book.setBid(16);
		 bk.del(book);
	}

	@Test
	public void testEdit() throws Exception {
		Book  book=new Book(16,"圣墟嘿嘿嘿",12f);
		 bk.edit(book);
	}

}

4.2方法调用

选择方法

 当出现绿色时就代表方法没有问题


5.配置xml文件,通过反射来实现一些方法

5.1.配置mvc.xml

 name属性为:我们在Bookaction中  return方法的返回值

path为:跳转路径

5.2配置tid文件

 tag-class属性为:我们配置的分页代码路径

6.实现web界面

6.1数据显示界面

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	<%@taglib  prefix="z"   uri="http://jsp.veryedu.cn" %>
	<%@ taglib  prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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="请输入书籍名称">
				<a  href="${pageContext.request.contextPath }/book.action?methodName=toEdit&bid=${b.bid }">增加</a>
		</div>
		<button type="submit" class="btn btn-primary mb-2">查询</button>
	</form>

	<table class="table table-striped  ">
		<thead>
			<tr>
				<th scope="col">书籍ID</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=tdel&bid=${b.bid }">删除</a>
				</td>
			</tr>
			</c:forEach>
		</tbody>
	</table>
	<z:page pageBean="${pageBean }"></z:page>
</body>
</html>

6.1.2效果图

 6.2增加,修改

6.2.1代码

由于增加,修改共用一个jsp界面,当我们传参数时要对于参数进行一个判断,使用三元运算符,如果b为就是增加操作,不然就是修改操作

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

6.2.2效果图

 

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

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

相关文章

c语言 va_start/va_end函数

c语言 va_satrt和va_end函数介绍 头文件&#xff1a;#include <stdarg.h> 函数原型&#xff1a;void va_start(va_list ap, last) 和 void va_end(va_list ap); 可以被参数数量和类型可变的函数调用。 可变参数用…&#xff08;3个省略号表示可变参数列表&#xff09; …

深入理解 http 反向代理

要理解什么是 反向代理(reverse proxy) , 自然你得先知道什么是 正向代理(forward proxy). 另外需要说的是, 一般提到反向代理, 通常是指 http 反向代理, 但反向代理的范围可以更大, 比如 tcp 反向代理, 在这里, 不打算讨论 tcp 之类的反向代理, 当文中说到反向代理时, 指的就是…

C++day5

2、 #include <iostream> using namespace std; static int blood 10000; class hero { protected:string name;int hp;int attack; public:hero(){}//无参构造hero(string name,int hp,int attack):name(name),hp(hp),attack(attack){}//有参构造virtual void Atk(){b…

使用supervisor管理进程

写目录 一、supervisor简介二 、supervisor安装2.1下载supervisor2.2配置文件详解2.3把squid服务加入到supervisor管理当中 一、supervisor简介 supervisor是Python开发的c/s服务&#xff0c;是Linux系统下的进程管理工具。可以监听、启动、停止、重启一个或多个进程用supervi…

卡尔曼滤波原理和使用

随着传感技术&#xff0c;机器人&#xff0c;自动驾驶等不断发展&#xff0c;对控制系统的精度以及稳定性要求越来越高。卡尔曼滤波作为一种状态最优估计方法&#xff0c;应用也越来越普遍、 对于Kalman Filter的理解&#xff0c;用过都知道“黄金五条”公式&#xff0c;且通过…

pytorch实战13:基于pytorch实现YOLOv1(长长文)

基于pytorch实现YOLOv1&#xff08;长长文&#xff09; 前言 ​ 本篇文章的目的是记录自己实现yolo v1的过程&#xff0c;在此过程中&#xff0c;参考了许多开源的代码和博客&#xff0c;赞美大佬们。 参考文献和代码 YOLO v1代码参考&#xff1a;&#xff08;读书人的事情&…

华为OD机试真题 Python 实现【猜字谜】【2023Q1 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述补充说明:四、解题思路五、Python算法源码六、效果展示1、输入2、输出3、说明一、题目描述 小王设计了一人简单的清字谈游戏,游戏的迷面是一人错误的单词,比如nesw,玩家需要猜出谈底库中正确的单词。猜中的要求如 对于某个谜面和…

武汉抖音seo,抖音关键词排名

抖音seo怎么做 抖音作为一款热门的社交娱乐应用&#xff0c;其SEO关键词排名对于提升内容曝光和用户流量非常重要。 1. 关键词研究&#xff1a;在进行SEO关键词排名时&#xff0c;首先需要进行关键词研究&#xff0c;了解用户在抖音上搜索的热门关键词。可以通过使用相关的关…

如何使用ArcGIS自定义图框样式

GIS制图过后&#xff0c;一般都会涉及到出图&#xff0c;大家肯定都希望自己的出图成果越美观越好&#xff0c;除了图本身之外&#xff0c;还可以从周边的一些修饰入手&#xff0c;比如图框&#xff0c;那么今天就给大家讲解一下如何自定义ArcGIS图框风格&#xff0c;希望能对大…

Docker-Dockerfile-DockerCompose的那些事

文章目录 一、Docker背景1.1 环境不一致1.2 隔离性1.3 弹性伸缩1.4 学习成本 二、Docker介绍2.1 Docker的由来2.2 Docker的思想 三、Docker的安装3.1 下载Docker依赖的环境3.2 指定Docker镜像源3.3 安装Docker3.4 Docker服务启停3.5 Docker容器运行解析3.6 Docker运行流程解析3…

暑期学JavaScript【第五天】

BOM Browser Object Model&#xff0c; 浏览器对象模型 DOM是BOM的一部分 1.navigator 用于判断当前的用户端。 用navigator.userAgent获取 2. location location.href www.baidu.com&#xff0c; 赋值后&#xff0c;执行直接跳转到百度location.search; 获取地址中?后面部…

maven查看jar的pom引入来源

从idea中点击 Maven Projects&#xff0c;后点击Show Dependencies&#xff0c;如图所示 得到依赖关系图&#xff0c;如下 在页面进行 Ctrl F 搜索需要的 Jar 名称 例&#xff1a;查找 spring-beans 双击框定的地方&#xff0c;就能进入到对应的pom文件 查找依赖关系 1、…

第三方库介绍——tslib库

文章目录 tslib 简介tslib 框架分析tslib 的框架 交叉编译、测试 tslibtslib应用程序 tslib 简介 tslib 是一个触摸屏的开源库&#xff0c;可以使用它来访问触摸屏设备&#xff0c;可以给输入设备添加各种“ filter ”( 过滤器&#xff0c;就是各种处理) 编译 tslib 后&#…

C语言学习准备-编辑器选择

今天继续给大家更新C语言经典案例 今天的案例会比昨天稍微有一些难度&#xff0c;但是同时还是非常经典的案例 本来是想给大家继续更新C语言经典案例&#xff0c;但是有朋友反应C语言编辑器的选择&#xff0c;刚好我自己也是想更换一下C语言的编辑器&#xff0c;跟大家分享一下…

TX Text Control 31.SP3 for Windows Forms Crack

Windows 窗体应用程序的文档处理 将文档编辑、创建和 PDF 生成添加到 Windows 窗体应用程序中。 视窗用户界面 功能齐全的文档编辑器 TX 文本控件是一种完全可编程的丰富编辑控件&#xff0c;可在专为 Visual Studio 设计的可重用组件中为开发人员提供广泛的文字处理功能。它…

力扣 77. 组合

题目来源&#xff1a;https://leetcode.cn/problems/combinations/ C题解&#xff08;来源&#xff09;&#xff1a; 代码随想录 回溯三部曲&#xff1a;将回溯问题看成一棵N叉树&#xff0c;n为广度&#xff0c;k为深度。 递归函数的返回值以及参数&#xff1a;需提前定义两个…

cookie 和 httpSession

目录 1.认识Cookie对象与HttpSession 1.1概念 1.2会话管理 2.cookie的使用 2.1cookie使用机制 2.2cookie不同属性的含义 2.2修改或者删除Cookie 2.3 Cookie对象的特点 2.4 Cookie对象的创建 2.5 Cookie中数据的获取 2.6 Cookie不支持中文的解决方案 2.7持久化Cooki…

代码随想录算法训练营第五天 | 哈希表系列1(哈希表理论基础--有效的字母异位词--快乐数)

哈希表系列1 哈希表理论基础242 有效的字母异位词读题小记代码随想录的代码力扣的示例代码 基于242的拓展题目--383赎金信我的代码力扣的示例代码代码随想录的代码 49 字母异位词分组力扣中录友的代码我的代码力扣的示例代码 438 找到字符串中所有字母异位词我的代码力扣录友的…

四、交换网络实验2——创建VLAN及端口配置

更多网络基础内容可见: 网络基础学习目录及各章节指引 4.6.2 创建VLAN及端口配置 实验目的 学习VLAN的创建删除 实验工具 Cisco Packet Tracer 实验环境 安装模拟器的Windows系统 实验步骤 第一步,vlan的创建

【实战】 六、用户体验优化 - 加载中和错误状态处理(上) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(八)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理1.给页面添加 …