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

2023-11-09

目录

最凝练的CRUD

1、建模

①物理建模

②逻辑建模

2、总体架构

3、搭建持久化层所需环境

①导入jar包

②创建jdbc.properties

③创建JDBCUtils工具类

④BaseDao

4、搭建表述层所需环境

①导入jar包

②创建ViewBaseServlet

③配置web.xml

④创建view目录

5、功能清单


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

1、建模

①物理建模

CREATE DATABASE `view-demo`CHARACTER SET utf8;
USE `view-demo`;
CREATE TABLE t_soldier(
    soldier_id INT PRIMARY KEY AUTO_INCREMENT,
    soldier_name CHAR(100),
    soldier_weapon CHAR(100)
);

②逻辑建模

public class Soldier {
    
    private Integer soldierId;
    private String soldierName;
    private String soldierWeapon;
}

2、总体架构

3、搭建持久化层所需环境

①导入jar包

commons-dbutils-1.6.jar

druid-1.1.9.jar

hamcrest-core-1.3.jar

junit-4.12.jar

mysql-connector-java-5.1.37-bin.jar

②创建jdbc.properties

维护基本连接信息

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://192.168.198.100:3306/view-demo
username=root
password=atguigu
initialSize=10
maxActive=20
maxWait=10000

③创建JDBCUtils工具类


public class JDBCUtil {

    // 将数据源对象设置为静态属性,保证大对象的单一实例
    private static DataSource dataSource;

    static {

        // 1.创建一个用于存储外部属性文件信息的Properties对象
        Properties properties = new Properties();

        // 2.使用当前类的类加载器加载外部属性文件:jdbc.properties
        InputStream inputStream = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");

        try {

            // 3.将外部属性文件jdbc.properties中的数据加载到properties对象中
            properties.load(inputStream);

            // 4.创建数据源对象
            dataSource = DruidDataSourceFactory.createDataSource(properties);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 从数据源中获取数据库连接
     * @return 数据库连接对象
     */
    public static Connection getConnection() {

        Connection connection = null;

        try {
            connection = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();

            throw new RuntimeException(e);
        }

        return connection;

    }

    /**
     * 释放数据库连接
     * @param connection 要执行释放操作的连接对象
     */
    public static void releaseConnection(Connection connection) {

        if (connection != null) {

            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();

                throw new RuntimeException(e);
            }

        }

    }
    
}

测试能否正常连接数据库:

public class DemoTest {

    @Test
    public void testConnection() {
        Connection connection = JDBCUtil.getConnection();
        System.out.println("connection = " + connection);
    }

}

④BaseDao

public class BaseDao<T> {

    private QueryRunner queryRunner = new QueryRunner();

    /**
     * 通用的增删改方法
     * @param sql
     * @param param
     * @return
     */
    public int update(String sql, Object ... param) {

        Connection connection = JDBCUtil.getConnection();

        int count = 0;
        try {
            count = queryRunner.update(connection, sql, param);
        } catch (SQLException e) {
            e.printStackTrace();

            throw new RuntimeException(e);

        } finally {
            
            // 关闭数据库连接
            JDBCUtil.releaseConnection(connection);
            
        }

        return count;
    }

    /**
     * 查询单个对象的通用方法
     * @param clazz
     * @param sql
     * @param param
     * @return
     */
    public T getBean(Class<T> clazz, String sql, Object ... param) {

        Connection connection = JDBCUtil.getConnection();

        T bean = null;
        try {
            bean = queryRunner.query(connection, sql, new BeanHandler<>(clazz), param);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            
            // 关闭数据库连接
            JDBCUtil.releaseConnection(connection);
            
        }

        return bean;
    }

    /**
     * 查询集合对象的通用方法
     * @param clazz
     * @param sql
     * @param param
     * @return
     */
    public List<T> getBeanList(Class<T> clazz, String sql, Object ... param) {

        Connection connection = JDBCUtil.getConnection();

        List<T> beanList = null;

        try {
            beanList = queryRunner.query(connection, sql, new BeanListHandler<>(clazz), param);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            
            // 关闭数据库连接
            JDBCUtil.releaseConnection(connection);
            
        }

        return beanList;
    }
}

4、搭建表述层所需环境

本质上就是Thymeleaf所需要的环境

①导入jar包

attoparser-2.0.5.RELEASE.jar

javassist-3.20.0-GA.jar log4j-1.2.15.jar

ognl-3.1.26.jar

slf4j-api-1.7.25.jar

slf4j-log4j12-1.7.25.jar

thymeleaf-3.0.12.RELEASE.jar

unbescape-1.1.6.RELEASE.jar

②创建ViewBaseServlet

public class ViewBaseServlet extends HttpServlet {

    private TemplateEngine templateEngine;

    @Override
    public void init() throws ServletException {

        // 1.获取ServletContext对象
        ServletContext servletContext = this.getServletContext();

        // 2.创建Thymeleaf解析器对象
        ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);

        // 3.给解析器对象设置参数
        // ①HTML是默认模式,明确设置是为了代码更容易理解
        templateResolver.setTemplateMode(TemplateMode.HTML);

        // ②设置前缀
        String viewPrefix = servletContext.getInitParameter("view-prefix");

        templateResolver.setPrefix(viewPrefix);

        // ③设置后缀
        String viewSuffix = servletContext.getInitParameter("view-suffix");

        templateResolver.setSuffix(viewSuffix);

        // ④设置缓存过期时间(毫秒)
        templateResolver.setCacheTTLMs(60000L);

        // ⑤设置是否缓存
        templateResolver.setCacheable(true);

        // ⑥设置服务器端编码方式
        templateResolver.setCharacterEncoding("utf-8");

        // 4.创建模板引擎对象
        templateEngine = new TemplateEngine();

        // 5.给模板引擎对象设置模板解析器
        templateEngine.setTemplateResolver(templateResolver);

    }

    protected void processTemplate(String templateName, HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 1.设置响应体内容类型和字符集
        resp.setContentType("text/html;charset=UTF-8");

        // 2.创建WebContext对象
        WebContext webContext = new WebContext(req, resp, getServletContext());

        // 3.处理模板数据
        templateEngine.process(templateName, webContext, resp.getWriter());
    }
}

③配置web.xml

<!-- 在上下文参数中配置视图前缀和视图后缀 -->
<context-param>
    <param-name>view-prefix</param-name>
    <param-value>/WEB-INF/view/</param-value>
</context-param>
<context-param>
    <param-name>view-suffix</param-name>
    <param-value>.html</param-value>
</context-param>

④创建view目录

5、功能清单

  • 显示首页:浏览器通过index.html访问首页Servlet,然后再解析对应的模板视图
  • 显示列表:在首页点击超链接,跳转到目标页面把所有士兵的信息列表显示出来
  • 删除信息:在列表上点击删除超链接,执行信息的删除操作
  • 新增信息:
    • 在列表页面点击超链接跳转到新增士兵信息的表单页面
    • 在新增信息的表单页面点击提交按钮执行保存
  • 更新信息:
    • 在列表上点击更新超链接,跳转到更新士兵信息的表单页面:表单回显
    • 在更新信息的表单页面点击提交按钮执行更新

    本章笔记是观看尚硅谷的JAVAWEB的视频和在网上找的资料 以及自己的理解总结出来的笔记希望可以帮助大家,感谢大家的耐心观看 如有错误请即使联系我 我会及时修正 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javaweb使用Thymeleaf 最凝练的CRUD项目-上 的相关文章

随机推荐

  • ElasticSearch8.8 Docker local安装(一)

    ES ElasticSearch 的安装教程网上比较多 但是基本都是8 0以前版本 8 0以后的版本主要默认支持https加密了 连接上有一些不太一样 尤其用java连接的时候 因此再做一个报告避免一些坑 前提linux操作系统 我使用虚拟
  • SQL Server2008下载地址

    SQL Server2008下载地址 https www microsoft com zh CN download details aspx id 30438 版本说明 Microsoft SQL Server 2008 R2 Expres
  • HyperLedger Fabric 实战入门第一天

    2019独角兽企业重金招聘Python工程师标准 gt gt gt HyperLedger Fabric 实战入门 先实践后理论 第一步 初始化开发环境 参考官方文档 http hyperledger fabric readthedocs
  • 【深度学习基础】准确率(Accuracy), 精确率(Precision), 召回率(Recall)和F1-Measure

    深度学习基础 性能评估指标 超参数介绍 这里主要解释的是前四个 先给出百度百科定义 召回率 Recall Rate 也叫查全率 是检索出的相关文档数和文档库中所有的相关文档数的比率 衡量的是检索系统的查全率 精度是检索出的相关文档数与检索出
  • 腾达宽带连接服务器无响应,腾达(Tenda)无线路由器192.168.0.1打不开问题解决方法图文教程...

    本文介绍了腾达 Tenda 无线路由器192 168 0 1 打不开的解决办法 192 168 0 1是腾达无线路由器的设置网址 在浏览器中无法打开192 168 0 1登录页面 请参考下面的解决办法 方法一 正确设置电脑IP地址 这里以W
  • 循环单链表的销毁操作

    循环单链表销毁的时候 我的代码开始是这样子的 Status DestroyList L LinkList L 销毁链表 Lnode p while L p L L L gt next delete p return OK 不出意外的报错了
  • vue 弹窗 多选表格组件封装 以及 回调绑定

    组件
  • CUDA Toolkit多版本安装与配置

    CUDA Toolkit多版本安装目的是为了将CUDA Toolkit支持多个版本 并将当前版本更新到后续支持常见pytorch的版本 即cuda11 6 目前该系统默认安装的是cuda10 2 cuda11 0和cuda11 2 CUDA
  • layui折叠面板无效 - 已解决

    出现折叠面板无效 可能因为一下两点造成的 原因一 原因二 具体是为什么 我不清楚 正确的方式
  • Unity:给角色和敌人加上血条

    横条血条 想法 1 创建一个画布 画布里面包含血条 HealthBar 空对象 Fill image 血条填充物 Border image 血条框 Heart image 心脏图标 2 为HealthBar对象添加HealthBar脚本和S
  • 速腾聚创雷达最新驱动安装(包含ring和timestamp)运行lio-sam

    记录一下搞slam的过程 ring和timestamp 最近想跑lio sam 需要用到ring和timestamp两个参数 lio sam作者用的velodyne雷达是带这两个参数的 但是rs雷达的老版驱动录制的点云包没有这两个参数 在g
  • pandas分析数据的案例

    1 pandas分析电影数据的案例 https blog csdn net houyanhua1 article details 87858575
  • 共享停车位

    随着代步车的普及 对停车位的需求日益增长 停车位的供应跟不上汽车保有量的快速增长 地段有限 停车场有限 停车位有限 停车难已经成为当今 城市病 中最难解决的一环 随着共享经济的发展 错时停车的提出和实施也逐渐被大众接受 通过物联网创新技术实
  • 服务器自动备份怎么做,服务器运维技巧分享,用backup为数据库做定时备份

    写了套网站 除了日志需要定时分割外 数据库还需要定时备份 如果你用的是云服务器自带的备份功能 会更简单些 但也需要自行购买数据库服务器 对于像我这种还在初期的系统来说 能减少服务器的开支就一定要减少 毕竟现在还不挣钱 安装 用的是ruby
  • Ubuntu20 安装Ceres库和g2o库

    此文章主要适配视觉SLAM十四讲 Ubuntu20 04的情况 建议Ceres版本为2 0 0 g2o库为最新版 安装Ceres库 安装依赖 sudo apt get install liblapack dev libsuitesparse
  • JsonNode与java相互转换

    将Jackson JsonNode数组转换为Java List string JsonNode jsonNode getJsonPayload JsonNode partial jsonNode path someArrayField Li
  • 动态规划(C语言)

    一 入门 以斐波那契数列为例 它的第一项为1 第二项为1 从第三项开始 每一项的值都是前面两项的和 让我们求第n项的是多少 对于这个问题 我们从最开始的递归思想来看 int fib int n if n 1 n 2 return 1 ret
  • js对象的属性用中括号表示

    中括号运算符总是能代替点运算符 但点运算符却不一定能全部代替中括号运算符 中括号运算符可以用字符串变量的内容作为属性名 点运算符不能 中括号运算符可以用纯数字为属性名 点运算符不能 中括号运算符可以用js的关键字和保留字作为属性名 点运算符
  • RISC-V、ARM和X86架构

    1 要了解X86 ARM和RISC V架构的区别 就得先了解复杂指令集 CISC 和精简指令集 RISC A X86使用的是复杂指令集 CISC ARM和RISC V使用的是精简指令集 RISC 这便是属于这几种架构之间最大的区别 狭义的x
  • javaweb使用Thymeleaf 最凝练的CRUD项目-上

    目录 最凝练的CRUD 1 建模 物理建模 逻辑建模 2 总体架构 3 搭建持久化层所需环境 导入jar包 创建jdbc properties 创建JDBCUtils工具类 BaseDao 4 搭建表述层所需环境 导入jar包 创建View