javaweb使用Thymeleaf 最凝练的CRUD项目-中

javaweb使用Thymeleaf 最凝练的CRUD项目-中

6、显示首页

①目标

浏览器访问index.html,通过首页Servlet,渲染视图,显示首页。

②思路

img

③代码

[1]创建PortalServlet

<servlet><servlet-name>PortalServlet</servlet-name><servlet-class>com.atguigu.demo.servlet.PortalServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>PortalServlet</servlet-name><url-pattern>/index.html</url-pattern>
</servlet-mapping>

Servlet代码:

public class PortalServlet extends ViewBaseServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String viewName = "portal";super.processTemplate(viewName, request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

[2]创建portal.html
在这里插入图片描述

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>士兵信息管理系统</title>
</head>
<body><a th:href="@{/SoldierServlet?method=showList}">显示士兵信息列表</a></body>
</html>

7、显示列表

①目标

在目标页面显示所有士兵信息,士兵信息是从数据库查询出来的

②思路

在这里插入图片描述

③代码

[1]ModelBaseServlet

创建这个基类的原因是:我们希望每一个模块能够对应同一个Servlet,

这个模块所需要调用的所有方法都集中在同一个Servlet中。

如果没有这个ModelBaseServlet基类,我们doGet()、doPost()方法可以用来处理请求,

这样一来,每一个方法都需要专门创建一个Servlet(就好比咱们之前的LoginServlet、RegisterServlet其实都应该合并为UserServlet)。

public class ModelBaseServlet extends ViewBaseServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 在doGet()方法中调用doPost()方法,这样就可以在doPost()方法中集中处理所有请求doPost(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 1.从请求参数中获取method对应的数据String method = request.getParameter("method");// 2.通过反射调用method对应的方法// ①获取Class对象Class<? extends ModelBaseServlet> clazz = this.getClass();try {// ②获取method对应的Method对象Method methodObject = clazz.getDeclaredMethod(method, HttpServletRequest.class, HttpServletResponse.class);// ③打开访问权限methodObject.setAccessible(true);// ④通过Method对象调用目标方法methodObject.invoke(this, request, response);} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}}

[2]SoldierDao.selectSoldierList()

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

接口方法:

public interface SoldierDao {List<Soldier> selectSoldierList();}

实现类方法:

public class SoldierDaoImpl extends BaseDao<Soldier> implements SoldierDao {@Overridepublic List<Soldier> selectSoldierList() {String sql = "select soldier_id soldierId,soldier_name soldierName,soldier_weapon soldierWeapon from t_soldier";return getBeanList(Soldier.class, sql);}
}

[3]SoldierService.getSoldierList()

在这里插入图片描述

接口方法:

public interface SoldierService {List<Soldier> getSoldierList();}

实现类方法:

public class SoldierServiceImpl implements SoldierService {private SoldierDao soldierDao = new SoldierDaoImpl();@Overridepublic List<Soldier> getSoldierList() {List<Soldier> soldierList = soldierDao.selectSoldierList();return soldierList;}
}

[4]SoldierServlet.showList()

实现步骤

1.调用Service方法获取集合数据
2.将集合数据存入请求域
3.渲染视图(在渲染的过程中,已经包含了转发)

protected void showList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 1.调用Service方法获取集合数据List<Soldier> soldierList = soldierService.getSoldierList();// 2.将集合数据存入请求域request.setAttribute("soldierList", soldierList);// 3.渲染视图(在渲染的过程中,已经包含了转发)processTemplate("list", request, response);
}

8、删除功能

①目标

点击页面上的超链接,把数据库表中的记录删除。

②思路

[1]先不考虑后续

在这里插入图片描述

[2]加上后续返回响应页面

在这里插入图片描述

③代码

[1]完成删除超链接

在这里插入图片描述

<a th:href="@{/SoldierServlet(soldierId=${soldier.soldierId},method='remove')}">删除</a>

关于@{地址}附加请求参数的语法格式:

  • 只有一个请求参数:@{地址(请求参数名=普通字符串)}或@{地址(请求参数名=${需要解析的表达式})}
  • 多个请求参数:@{地址(名=值,名=值)}

官方文档中的说明如下:

在这里插入图片描述

[2]Servlet方法

1.从请求参数中获取士兵信息的id值

实现步骤

2.将集合数据存入请求域

实现方案

方案一:还是直接前往list.html,需要重新查询soldierList数据,代码重复
方案二:直接调用隔壁的showList()
方案三:通过请求转发的方式间接调用showList()方法
方案四:通过请求重定向的方式间接调用showList()方法

protected void remove(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 1.从请求参数中获取士兵信息的id值String soldierId = request.getParameter("soldierId");// 2.调用Service方法执行删除操作soldierService.remove(soldierId);// 3.后续……// 方案一:还是直接前往list.html,需要重新查询soldierList数据,代码重复// 1.调用Service方法获取集合数据// List<Soldier> soldierList = soldierService.getSoldierList();// 2.将集合数据存入请求域// request.setAttribute("soldierList", soldierList);// processTemplate("list", request, response);// 方案二:直接调用隔壁的showList()// 也能实现需求,但是总感觉这样调用方法破坏了程序的结构// showList(request, response);// 方案三:通过请求转发的方式间接调用showList()方法// request.getRequestDispatcher("/SoldierServlet?method=showList").forward(request, response);// 方案四:通过请求重定向的方式间接调用showList()方法response.sendRedirect(request.getContextPath() + "/SoldierServlet?method=showList");
}

[3]Service方法

   @Overridepublic void remove(String soldierId) {soldierDao.delete(soldierId);}

[4]Dao方法

 @Overridepublic void delete(String soldierId) {String sql = "delete from t_soldier where soldier_id=?";update(sql, soldierId);}

9、前往新增信息的表单页面

①创建超链接

<a th:href="@{/SoldierServlet?method=toAddPage}">前往新增页面</a>

②Servlet

protected void toAddPage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {processTemplate("add-page", request, response);
}

③创建表单页面

在这里插入图片描述

<form th:action="@{/SoldierServlet}" method="post"><input type="hidden" name="method" value="saveSoldier" />士兵姓名:<input type="text" name="soldierName" /><br/>士兵武器:<input type="text" name="soldierWeapon" /><br/><button type="submit">保存</button></form>

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

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

相关文章

怎么用Midjourney制作表情包

要使用Midjourney制作表情包&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 打开Midjourney的官方网站或下载Midjourney应用程序&#xff0c;并登录你的账户。 2. 在Midjourney中&#xff0c;选择创建新项目或表情包。 3. 在项目中&#xff0c;你可以选择使用预设的模…

类 和 对象

目录 1、面向对象编程 2、面向对象编程 2.1面向对象编程特征 3、类和对象的概念 3.1类的定义 3.11属性 3.12方法 3.13重载 3.14递归 3.13返回值return 3.2对象 3.2.1对象组合 4、jvm内主要三块内存空间 5、参数传值 1、面向对象编程 面向过程&#xff1a;关注的是步骤…

将大模型集成到语音识别系统中的例子

概述 本文旨在探索将大型语言模型&#xff08;LLMs&#xff09;集成到自动语音识别&#xff08;ASR&#xff09;系统中以提高转录准确性的潜力。 文章介绍了目前的ASR方法及其存在的问题&#xff0c;并对使用LLMs的上下文学习能力来改进ASR系统的性能进行了合理的动机论证。 本…

深度学习标量、向量、矩阵、张量之间的区别与联系

文章目录 前言1、张量**注意**&#xff1a; 2、**标量** (scalar)&#xff1a;0阶的张量&#xff0c;0个轴&#xff0c;一个单独的数(整数或实数)&#xff1b;3、**向量**(vector)&#xff1a;1阶的张量&#xff0c;也叫矢量&#xff0c;1个轴&#xff0c;一个数组&#xff1b;…

那些你必须知道的4个matlab小技巧(附最新安装包)

文末福利&#xff1a;MATLAB R2022b软件安装包 MATLAB 简介 01 一、MATLAB简介 数学类科技应用软件包括数值计算&#xff08;Number Crunching&#xff09;型软件和数学分析&#xff08;Math Analysis&#xff09;型软件 数值计算型软件 它们对大批数据具有较强的管理、计…

微信小程序下拉刷新获取数据和触底事件刷新实现

一、下拉刷新 1.json文件 说明&#xff1a;开启下拉刷新&#xff0c;然后设置窗口的背景色&#xff0c;方便观看。 "enablePullDownRefresh": true,"backgroundColor":"#FFC0CB" 2. js文件 说明&#xff1a;重新发起请求&#xff0c;并显示加…

【问题总结】Docker环境下备份和恢复postgresql数据库

目录 文章目录 以从备份恢复forest_resources库为例一、备份数据库二、需要还原的数据库准备1 删除掉远程的库。2 重新创建一个空的库。可以使用sql3 找到数据库存放的路径&#xff0c;并将备份文件上传到对应的路径下 三、 进入docker容器内部&#xff0c;执行数据库恢复附录…

Vue3统计数值(Statistic)

可自定义设置以下属性&#xff1a; 数值的标题&#xff08;title&#xff09;&#xff0c;类型&#xff1a;string | slot&#xff0c;默认&#xff1a;‘’数值的内容&#xff08;value&#xff09;&#xff0c;类型&#xff1a;string | number&#xff0c;默认&#xff1a;…

AlphaPose复现配置教程

AlphaPose复现配置教程 AlphaPose介绍 AlphaPose是一种准确的多人姿态估计器&#xff0c;这是第一个在COCO数据集上达到70 mAP (75 mAP)和在MPII数据集上达到80 mAP (82.1 mAP)的开源系统。为了匹配跨帧的同一人的姿态&#xff0c;我们还提供了一种高效的在线姿态跟踪器&…

scala学习手册

1. case class学习 样例类模式匹配 1.1 样例类&#xff08;case class&#xff09;适合用于不可变的数据。它是一种特殊的类&#xff0c;能够被优化以用于模式匹配。 case class MetaData(userId: String)case class Book(name: String) {def printBookName(): Unit {printl…

跨网络的通信过程、路由的作用以及默认网关

如下网络拓扑图&#xff0c;交换机0所在的网段为192.168.1.0/24&#xff0c;交换机1所在网段为192.168.2.0/24&#xff0c;且各自有2台主机&#xff1a; 假设PC0&#xff08;192.168.1.10/32&#xff09;要跟PC4&#xff08;192.168.2.11/32&#xff09;通信&#xff0c;如何实…

函数和控制流

专栏简介&#xff1a;本专栏作为Rust语言的入门级的文章&#xff0c;目的是为了分享关于Rust语言的编程技巧和知识。对于Rust语言&#xff0c;虽然历史没有C、和python历史悠远&#xff0c;但是它的优点可以说是非常的多&#xff0c;既继承了C运行速度&#xff0c;还拥有了Java…

Simulink仿真模块 - Data Store Read

Data Store Read:从数据存储中读取数据 在仿真库中的位置为:Simulink / Signal Routing 模型为: 说明 Data Store Read 模块将指定数据存储中的数据复制到其输出中。多个 Data Store Read 模块可从同一个数据存储读取数据。 用来读取数据的源数据存储由 Data Store Memory 模…

vue+element-ui通用后台管理系统(适合新手)

vueelement-ui通用后台管理系统&#xff08;适合新手&#xff09; 1、使用到的技术 使用vue2element-uiaxiosjs-cookielessecharts实现的一个简易的通用后台管理系统&#xff0c;具有很强的可扩展性&#xff0c;修改简单&#xff0c;只要有点前端基础就能看懂&#xff1b; 2…

怎么学习Java数据库连接(JDBC)? - 易智编译EaseEditing

学习Java数据库连接&#xff08;JDBC&#xff09;是掌握Java与数据库交互的关键步骤。以下是学习Java JDBC的一些建议&#xff1a; 先掌握Java基础&#xff1a; 在学习JDBC之前&#xff0c;确保你已经掌握了Java的基本语法、面向对象编程和其他核心概念。这将有助于更好地理解…

Spring、SpringBoot、SpringCloud、SpringCloud Alibaba、Elasticsearch版本对应,附下载地址

1、GitHub Alibaba 发布SpringCloud Alibaba和SpringCloud 、SpringBoot版本 Spring Cloud Alibaba VersionSpring Cloud VersionSpring Boot2022.0.0.0-RC2Spring Cloud 2022.0.03.02022.0.0.0-RC1Spring Cloud 2022.0.03.0.02021.0.5.0*Spring Cloud 2021.0.52.6.132021.0.4…

基于FPGA的softmax函数优化及实现

文章目录 前言优化方案测试数据产生及Matlab结果处理流程工程说明功耗与面积标准softmax函数功耗与面积总结前言 FPGA异构计算是一个趋势,在AI推理、深度学习中广泛使用FPGA进行加速,减小系统延迟。而AI推理中有一个组件被广泛使用,各种网络模型中都有其身影,那就是激活函…

Ceph 应用

Ceph 应用 一、创建 CephFS 文件系统 MDS 接口 1.服务端操作 1&#xff09;在管理节点创建 mds 服务 cd /etc/ceph ceph-deploy mds create node01 node02 node032&#xff09;查看各个节点的 mds 服务 ssh rootnode01 systemctl status ceph-mdsnode01 ssh rootnode02 syst…

人工智能顶会投稿截止时间汇总

一、NeurIPS 1. 会议名称及等级 Annual Conference on Neural Information Processing Systems&#xff08;CCF-A&#xff09;https://dblp.uni-trier.de/db/conf/nips/index.html 2. 投稿时间及接收率 https://neurips.cc/Conferences/2023/CallForPapers#OpenReview 一般…

【C++修炼之路】内存管理

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录 一、C/C 内存分布二、考题三、C语言动态内存管理方式四、C内存管理方式1、对内置类型2、对自定义类型 五、C对动态管理的升级六…