使用thymeleaf做CRUD的体会

准备工作

  1. 引入需要的Jar包(数据库连接,druidCRUD封装,Thymeleaf第三方jar包,单元测试包,servlet包)

  1. 引入我们需要的工具类(封装好的CRUD方法,数据库连接,Thymeleaf和servlet关联,创建一个基类希望每一个模块能够对应同一个Servlet,这个模块所需要调用的所有方法都集中在同一个Servlet中.通过反射的技术可以获取到所有的方法,然后在一个thymeleaf里面传入多个不同方法的参数)

package com.sun.utils;

import com.sun.utils.ViewBaseServlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

@WebServlet("/ModelBaseServlet")
public class ModelBaseServlet extends ViewBaseServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        //获取请求参数
        String method = req.getParameter("method");
        //获取当前类的类描述对象
        Class clazz = this.getClass();
        try {
            Method declaredMethod = clazz.getDeclaredMethod(method, HttpServletRequest.class, HttpServletResponse.class);
            declaredMethod.setAccessible(true);//关闭访问权限
            declaredMethod.invoke(this,req,resp);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }
}

小tip

由于我们的项目启动时,会先启动index.jsp或者index.html,当我们想要进行thymeleaf路径转发的时候,我们要在首页面上面进行点击或者在路径栏进行输入,当我们希望打开网页就直接进入到我们想要到的网页时,我们可以把Servlet的路径设置成(index.html),这样打开就可以直接跳转到我们需要的页面了。

package com.sun.servlet;

import com.sun.utils.ViewBaseServlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/index.html")
public class PortalServlet extends ViewBaseServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String viewName = "portal";

        super.processTemplate(viewName, req, resp);
    }
}

把所有方法整合到一个Servlet里面

package com.sun.servlet;

import com.sun.utils.ModelBaseServlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/SoldierServlet")
public class SoldierServlet extends ModelBaseServlet {

    protected void insert(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("SoldierServlet.add");
    }
    protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("SoldierServlet.delete");
    }
    protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("SoldierServlet.update");
    }
    protected void select(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("SoldierServlet.select");
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>士兵信息管理系统</title>
</head>
<body>
<a th:href="@{/SoldierServlet?method=insert}">插入士兵信息列表</a>
<a th:href="@{/SoldierServlet?method=select}">显示士兵信息列表</a>'
<a th:href="@{/SoldierServlet?method=update}">更新士兵信息列表</a>
<a th:href="@{/SoldierServlet?method=delete}">删除士兵信息列表</a>
</body>
</html>

总结

采用三层架构,满足我们平常的开发模式,mybatis(dao层+ORM<对象关系映射>) ,spring(service层),spring mvc(控制层 servlet)。

dao层

首先bean是我们的实体类,一个实体类对应一张数据库的表,一个属性对应一个字段,用于对增删改查后的数据进行封装,成一个对象显示给用户查看。

dao层接口是我们的自定义方法,我们将需要的方法写在这个接口,然后有一个实现类去实现这个接口,并且继承这个我们封装好CRUD方法的工具类,达到解耦,并且体现了java的封装性。

Service层

该层是我们业务实现最重要的一个环节,它主要是再次对dao层的进行了封装,它一一对应dao层的每一个方法,然后通过组合的方法,把dao层作为它的一个成员变量去调用dao层的方法,采用的是组合模式。层层调用,可维护性好,隐藏内部细节,只负责自己要做的任务。

servlet层

我们把增删改查的功能全部封装到一个Servlet里面,需要的时候我们直接在一个html里面调用。然后转跳到我们指定的thymeleaf页面,也就是一个Thymeleaf对应一个servlet。

这种方法的逻辑继承关系如图所示

这一层我们采用的思想是将一张页面上的所有方法都放在一个servelt里面,这样一来,就可以无须创建多个servlet了,只需要一个就可以实现多个逻辑,在还没有采用框架的时候,这一逻辑需要我们自己书写,我们要创建一个基类采用反射的技术动态获取我们页面上需要用到的方法,然后通过servlet的请求和分发机制将我们请求的方法分发到我们的自定义的servlet中调用指定的方法。然后调用service层的方法进行逻辑处理后,通过转发到我们的html视图上,thymeleaf模板渲染又开始解析我们返回的数据,然后呈现在页面上。此处需要注意一个地方,当我们是从页面上获取提交的表单数据的数据,如果需要做一些类型转化,很有可能会出现异常导致我们程序停止,从而无法跳转到模板引擎渲染的页面上。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title></title>
    <base th:href="@{/}">
    <script language="JavaScript" type="text/javascript" th:src="@{My97DatePicker/WdatePicker.js}"></script>
</head>
<body>
<form th:action="@{SoldierServlet}" method="post">
    <table border="" cellpadding="0.5px" cellspacing="0.5px">
        <input type="hidden" name="method" value="addInfo">
        <tr>
            <td>士兵姓名:</td>
            <td><input type="text"  name="soldierName"></td>
        </tr>
        <tr>
            <td>士兵武器:</td>
            <td><input type="text"  name="soldierWeapon"></td>
        </tr>
        <tr>
            <td>士兵性别:</td>
            <td><input type="text"  name="soldierSex"></td>
        </tr>
        <tr>
            <td>士兵年龄:</td>
            <td><input type="text"  name="soldierAge"></td>
        </tr>
        <tr>
            <td>士兵生日:</td>
            <td><input type="text"  onclick="WdatePicker({el:this,dateFmt:'yyyy-MM-dd'})" name="soldierBirthday"></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="提交">
            </td>
        </tr>
    </table>
</form>
</body>
</html>

由于我做了类型转换,并且是先获取,再转跳,所以会出现如下异常,因为在页面没有获取到数据。导致程序中断,页面也跳转不了。

转跳

当我们完成一个功能的时候,我们需要进行转跳时,如果是表单提交数据,我们可以采用重定向,因为这不会出现表单数据重复提交的问题。

当我们删除以后,页面会进行跳转。

采用重定向,页面不会进行跳转。

比较

前面也有通过servlet的输出打印流,将数据库获取到的数据通过servlet回响打印到html页面上。

而这次采用的是thymeleaf模板引擎动态将数据渲染到页面上,还是要通过servlet的加持。

经验

通过这个thymeleaf实现CRUD,用到了三层架构,动态页面,获取页面请求参数很重要,例如,我们需要id时,我们可以通过url得到我们的id然后进行某项操作,我们也是通过url上的method参数再加上反射技术才能实现将多个方法放在一个servlet里面调用。虽然说三层架构是层层递增,但是我们可以从上往下进行编写,先在业务层确定我们需要的方法,再去dao层定义我们的方法。

这是thymeleaf里对a链接含有多个参数的写法。

window.location.href = "SoldierServlet?method=remove&soldierId=" + id;这句是重定向的意思,不加/是因为在重定向的时候,需要加/它会自动加上http://ip:端口号/

上述的总结:a链接既可以重定向也可以做请求转发。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

媪姝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值