单表CURD操作

article/2025/9/26 7:46:09

 

该项目纯粹用 Servlet 编写,理解跳转过程。理解原理.....

一、准备数据库脚本

USE `test`;DROP TABLE IF EXISTS `dept`;CREATE TABLE `dept` (`deptno` int(2) NOT NULL,`dname` varchar(14) DEFAULT NULL,`loc` varchar(13) DEFAULT NULL,PRIMARY KEY (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;/*Data for the table `dept` */insert  into `dept`(`DEPTNO`,`DNAME`,`LOC`) values (10,'ACCOUNTING','NEW YORK'),(20,'RESEARCH','DALLAS'),(30,'SALES','CHICAGO'),(40,'OPERATIONS','BOSTON'),(50,'XIAOSHOUBU','TangShan'),(51,'RenShiBu','TangShan'),(60,'YBUMEN','HENAN'),(70,'QBUMEn','TX');

二、准备页面

  • 欢迎页面:先进入到这个页面,有个连接跳转到查询页面
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>欢迎界面</title></head><style type="text/css">div {font-size: 150px;text-align: center;}</style><body><!--带项目名+DeptListServlet的路径名--><a href="/oa/list"><div>欢迎使用本系统</div></a></body>
</html>
  • 查询页面:返回dept表中的所有信息
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><style type="text/css">table,td,tr,th {border: blue solid 2px;align: center;}</style></head><body><!-- 处理查询页面 --><h1 align="center">部门管理</h1><hr><table align="center" style="width: 40%; height: 40%;"><tr><th>部门编号</th><th>部门名称</th><th>部门地址</th><th>操作</th></tr><!--下面是动态的从数据库中获取数据。编号,部门名字,地点都是动态显示的--><tr><td>1</td><td>销售部</td><td>北京</td><td><a href="add.html">增加</a><a href="update.html">修改</a><a href="#" onclick="window.confirm('确定删除吗?')">删除</a></td></tr></table></body>
</html>
  • 增加页面:向 dept 表中增加数据
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><h1>部门增加</h1><hr /><form action="list.html" method="get"><!--  -->部门编号:<input type="text" name="deptno" /><br />部门名称:<input type="text" name="dname" /><br />部门地点:<input type="text" name="loc" /><br /><input type="submit" value="提交" /><br /></form></body>
</html>
  • 修改页面:修改dept表中的数据
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><h1>部门修改</h1><hr /><form action="list.html" method="get"><!-- value 是动态获取的,部门编号不能修改 -->部门编号:<input type="text" name="deptno" value="1" readonly="readonly" /><br />部门名称:<input type="text" name="dname" value="销售部" /><br />部门地点:<input type="text" name="loc" value="北京" /><br /><input type="submit" value="修改" /><br /></form></body>
</html>
  • 详情页面
<!DOCTYPE html>
<html lang='en'>
<head><meta charset='UTF-8'><title>Title</title>
</head>
<body><!--这是动态获取的-->部门编号:1部门名称:部门地点:<input type='button' value='后退' onclick='history.back()'>
</body>
</html>

 

三、准备实现的功能

  • 查询数据:dept表中的数据,有增加,修改,删除,详情操作链接
  • 增加数据:增加完跳转到查询页面
  • 修改数据:要求动态获取信息,比如:对销售部进行修改,要把销售部的原始信息显示到修改页面中,部门编号不能修改
  • 删除数据:删除有确认框,删除后呆在查询页面。
  • 部门的详细情况:点击哪个部门就将哪个部门的信息显示出来

四、搭建项目环境

  •  构建Servlet环境
  • 引进 mysql-connector.jar 包到 WEB-INF的lib目录下
  • 创建工具类 DButils 。主要负责连接数据库。将 Driver,url,user,password 写进配置文件中,符合 OCP 原则:对扩展是开放的,而对修改是封闭的。 
/**  JDBC 工具类* */
public class DBUtils {//静态变量:“在类加载的时候执行,并且自上而下按顺序执行。//获取配置文件的信息,不需要加  后缀名。 包名.文件名private static ResourceBundle resource = ResourceBundle.getBundle("yangzhaoguang.resource.jdbc");private static String driver = resource.getString("driver");private static String url = resource.getString("url");private static String user = resource.getString("user");private static String password = resource.getString("password");/** 静态代码快:注册驱动。注册一次就可以,所以写进静态代码块中* */static {//这样就会链接数据库的驱动写死了。以后还可能链接别的数据库。// 不符合:OCP原则:对扩展开放,对修改关闭//什么是符合OCP原则呢? 在进行功能扩展的时候,不用修改源代码// Class.forName("com.jdbc.mysql.Driver");try {Class.forName(driver);} catch (ClassNotFoundException e) {e.printStackTrace();}}/*连接数据库*/public Connection getConnection() {Connection conn = null;try {conn = DriverManager.getConnection(url, user, password);} catch (SQLException e) {e.printStackTrace();}return conn;}/*释放资源*/public void close(Connection conn , ResultSet rs, PreparedStatement ps){if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (ps != null) {try {ps.close();} catch (SQLException e) {e.printStackTrace();}}}
}
  •  配置文件 jdbc.properties:
#驱动
driver=com.mysql.jdbc.Driver
#url
url=jdbc:mysql://localhost:3306/test
#账户
user=root
#密码
password=root

五、实现查询功能

  • 创建 DeptListServlet 类,并配置web.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--设置欢迎界面--><welcome-file-list><welcome-file>welcome.html</welcome-file></welcome-file-list><!--DeptListServlet映射信息--><servlet><servlet-name>DeptListServlet</servlet-name><servlet-class>yangzhaoguang.oa.DeptListServlet</servlet-class></servlet><servlet-mapping><servlet-name>DeptListServlet</servlet-name><!--DeptListServlet类的路径名。不需要加项目名--><url-pattern>/list</url-pattern></servlet-mapping>
</web-app>
  • 实现从数据库中查询数据的功能,并显示到 list 页面。单纯的使用Servlet是比较繁琐的。需要将动态获取的数据放在 处理查询结果集 的while 循环中。【提前将 list.html 页面的 "" 替换成 ''  要不会和 DeptListServlet 类中的 "" 冲突】。原来的list页面其实可以删除了!
/** 实现查询功能* */
public class DeptListServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html");PrintWriter writer = resp.getWriter();writer.print("        <!DOCTYPE html>");writer.print("<html>");writer.print("	<head>");writer.print("		<meta charset='utf-8'>");writer.print("		<title></title>");writer.print("			<style type='text/css'>");writer.print("                table,");writer.print("                td,");writer.print("                tr,");writer.print("        th {");writer.print("            border: blue solid 2px;");writer.print("            align: center;");writer.print("        }");writer.print("		</style>");writer.print("	</head>");writer.print("	<body>");writer.print("		<!-- 处理查询页面 -->");writer.print("		<h1 align='center'>部门管理</h1>");writer.print("			<hr>");writer.print("			<table align='center' style='width: 40%; height: 40%;'>");writer.print("				<tr>");writer.print("					<th>部门编号</th>");writer.print("					<th>部门名称</th>");writer.print("					<th>部门地址</th>");writer.print("					<th>操作</th>");writer.print("				</tr>");/*以上是固定不变的,不需要改动*//*连接数据库*/PreparedStatement ps = null;ResultSet rs = null;Connection conn = null;try {/*获取连接*/conn = DBUtils.getConnection();/*获取预编译的数据库操作对象*/String sql = "select * from dept";ps = conn.prepareStatement(sql);/*处理查询结果集*/rs = ps.executeQuery();while (rs.next()) {String deptno = rs.getString(1);String dname = rs.getString(2);String loc = rs.getString(3);/*这部分是要动态显示的,需要从数据库中获取数据,需要放到循环中去*/writer.print("				<tr>");writer.print("					<td>" + deptno + "</td>");writer.print("					<td>" + dname + "</td>");writer.print("					<td>" + loc + "</td>");writer.print("					<td><a href='add.html'>增加</a>");writer.print("						<a href='update.html'>修改</a>");writer.print("						<a href='#' onclick='window.confirm('确定删除吗?')'>删除</a>");writer.print("						<a href='update.html'>详情</a>");writer.print("					</td>");writer.print("				</tr>");}} catch (SQLException e) {e.printStackTrace();} finally {/*释放资源*/DBUtils.close(conn, rs, ps);}/*以下也是固定的,不需要改变*/writer.print("			</table>");writer.print("	</body>");writer.print("</html>");}
}
  • 到这里就完成了查询功能。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAMjAyMuWKoOayueWRgA==,size_20,color_FFFFFF,t_70,g_se,x_16

  •  这个功能的具体流程是什么样的呢?

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAMjAyMuWKoOayueWRgA==,size_20,color_FFFFFF,t_70,g_se,x_16

  • 首先Tomcat根据在欢迎界面设置的超链接, 通过配置信息中的映射信息,找到我们写好的 DeptListServlet 类,由于超链接是 GET 请求,会执行 DeptListServlet 中的doGet 方法。

六、实现查看部门详情功能

  • 实现参数传递是有固定写法的:url?name=value&name=value......
        /*获取根路径*/String contextPath = req.getContextPath();/*首先路径需要更改:跳转到一个 Servlet ,这里也需要加项目名:但是在java程序里,项目名可以动态获取。*/writer.print("						<a href='"+contextPath+"/detail?deptno="+deptno+"'>详情</a>");
  •  编辑配置文件,编写 deptDetailServlet 类        
    <!--DeptDetailServlet映射信息--><servlet><servlet-name>DeptDetailServlet</servlet-name><servlet-class>yangzhaoguang.oa.DeptDetailServlet</servlet-class></servlet><servlet-mapping><servlet-name>DeptDetailServlet</servlet-name><!--设置DeptDetailServlet类的路径名,不需要加项目名--><url-pattern>/detail</url-pattern></servlet-mapping>
  •  提前将 detail 页面的 "" 替换成  ''  
public class DeptDetailServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {/*获取 地址栏上请求参数 deptno 的 value*/String deptno = req.getParameter("deptno");resp.setContentType("text/html");PrintWriter writer = resp.getWriter();writer.print("<!DOCTYPE html>");writer.print("<html lang='en'>");writer.print("<head>");writer.print("    <meta charset='UTF-8'>");writer.print("    <title>Title</title>");writer.print("</head>");writer.print("<body>");/*连接数据库操作*/Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {/*获取连接*/conn = DBUtils.getConnection();/*获取预编译数据库操作对象*/String sql = "select * from  dept where deptno=?";ps = conn.prepareStatement(sql);/*传值*/ps.setString(1, deptno);/*结果集中只有一条对象,不需要while循环*/rs = ps.executeQuery();if (rs.next()) {String dname = rs.getString(2);String loc = rs.getString(3);/*动态获取*/writer.print("        部门编号:" + deptno + "<br>");writer.print("        部门名称:" + dname + "<br>");writer.print("        部门地点:" + loc + "<br>");}} catch (SQLException e) {e.printStackTrace();}finally {/*释放资源*/DBUtils.close(conn,rs,ps);}writer.print("    <input type='button' value='后退' onclick='history.back()'>");writer.print("</body>");writer.print("</html>");}
}

七、实现删除功能

  • 纯粹的用Servlet写,需要将删除的前端代码写到后端当中。【学完JSP会简单很多】。
  • 凡是前端向后端发送请求,那么请求路径必须要加上项目名,项目名能动态获取就动态获取使用:getContextPath();
        /*点击缺点删除后,浏览器发送删除请求。请求路径需要带项目名:只要是前端向后端发送请求都需要加项目名*//*deptno 是动态获取的。删除数据的where条件*/writer.print(";		<script type='text/javascript'>");writer.print(";        function del(deptno) {");writer.print(";    var res = window.confirm('确认删除吗?');");writer.print(";    if(res){");writer.print(";        window.location = '"+contextPath+"/del?deptno='+deptno ;");writer.print(";    }");writer.print(";}");writer.print("</script>");
          /*  javascript:void(0):保持超链接的样式,但是不实现跳转执行del()函数:参数是 deptno,是动态的*/writer.print("						<a href='javascript:void(0)' onclick='del("+deptno+")'>删除</a>");
  • 编写 DeptDelServlet 类,并编辑配置文件
    <!--DeptDelServlet 映射信息--><servlet><servlet-name>DeptDelServlet</servlet-name><servlet-class>yangzhaoguang.oa.DeptDelServlet</servlet-class></servlet><servlet-mapping><servlet-name>DeptDelServlet</servlet-name><!--设置DeptDelServlet 类的路径名,不需要加项目名--><url-pattern>/del</url-pattern></servlet-mapping>
public class DeptDelServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Connection conn = null;PreparedStatement ps = null;/*获取请求信息的参数:deptno*/String deptno = req.getParameter("deptno");try {conn = DBUtils.getConnection();String sql = "delete from dept where deptno=?";ps = conn.prepareStatement(sql);ps.setString(1, deptno);int count = ps.executeUpdate();/*判断是否删除成功*/if (count != 0){/*删除成功后,需要重新访问 查询列表。这个查询列表是需要重新访问数据库的。* 所以我们可以用转发【重定向最好】* */req.getRequestDispatcher("list").forward(req,resp);}else{req.getRequestDispatcher("err.html").forward(req,resp);}} catch (SQLException e) {e.printStackTrace();}finally {DBUtils.close(conn,null,ps);}}
}

八、增加功能

  • 首先将增加页面的表单提交路径设置为: 项目名+DeptInsertServlet 类的路径名
	<form action="/oa/insert" method="post">
  • 配置web.xml信息,编写 DeptInsertServlet 类
    <!--DeptInsertServlet 映射信息--><servlet><servlet-name>DeptInsertServlet</servlet-name><servlet-class>yangzhaoguang.oa.DeptInsertServlet </servlet-class></servlet><servlet-mapping><servlet-name>DeptInsertServlet </servlet-name><!--DeptInsertServlet 类的路径名,不需要加项目名--><url-pattern>/insert</url-pattern></servlet-mapping>
public class DeptInsertServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Connection conn = null;PreparedStatement ps=  null ;/*获取请求中的 deptno ,dname, loc 信息。* 这里的 name 是在前端页面form表单中的name属性* */String deptno = req.getParameter("deptno");String dname = req.getParameter("dname");String loc = req.getParameter("loc");try {/*第一步:获取连接*/conn = DBUtils.getConnection();/*第二步:获取预编译数据库操作对象*/String sql = "insert into dept(deptno,dname,loc) values(?,?,?)";ps = conn.prepareStatement(sql);/*第三步:给占位符传值*/ps.setString(1,deptno);ps.setString(2,dname);ps.setString(3,loc);/*第四步:返回结果*/int count = ps.executeUpdate();if (count != 0){/*增加成功跳转到 list 页面*/req.getRequestDispatcher("/list").forward(req,resp);}else{req.getRequestDispatcher("err.html").forward(req,resp);}} catch (SQLException e) {e.printStackTrace();}finally {DBUtils.close(conn,null,ps);}}
}
  • 当我们测试的时候,他会报 405 错误。
    • 这是因为前端发送的是 POST 请求,虽然在 DeptInsertServlet 类中重写的也是 doPost 方法,但是当执行到 转发 到 list 界面的时候,DeptListServlet类中重写的是 doGet 方法。所以会报 405
  • 解决办法:
    • 1、在 DeptListServlet 类中重写 doPost方法,doPost方法中调用 doGet
    • 2、重定向可以解决。
    /*防止增加的时候报 405 错误*/@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);}

访问流程:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAMjAyMuWKoOayueWRgA==,size_20,color_FFFFFF,t_70,g_se,x_16

 

九、修改

  • 对部门进行修改的时候,需要将部门的信息回显到单元格中。并且 部门编号不能修改
  • 需要动态获取 deptno,根据 deptno 在数据库进行查询,和 详情 操作一样。
  • 获取部门信息:配置文件,编写 DeptUpdateServlet 类
    <!--DeptUpdateServlet 映射信息--><servlet><servlet-name>DeptUpdateServlet</servlet-name><servlet-class>yangzhaoguang.oa.DeptUpdateServlet </servlet-class></servlet><servlet-mapping><servlet-name>DeptUpdateServlet </servlet-name><!--DeptUpdateServlet 类的路径名,不需要加项目名--><url-pattern>/update</url-pattern></servlet-mapping>
public class DeptUpdateServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html");PrintWriter writer = resp.getWriter();writer.print("<!DOCTYPE html>");writer.print("<html>");writer.print("	<head>");writer.print("		<meta charset='utf-8'>");writer.print("		<title></title>");writer.print("	</head>");writer.print("	<body>");writer.print("		<h1>部门修改</h1>");writer.print("		<hr />");/*向 DeptModifyServlet 提交数据,在DeptModifyServlet中做真正的修改* 提交方式:post* */writer.print("		<form action='/oa/modify' method='post'>");/*从前端获取deptno,根据 deptno 从数据库中获取数据*/String deptno = req.getParameter("deptno");Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {conn = DBUtils.getConnection();/*获取预编译数据库操作对象*/String sql = "select * from dept where deptno=?";ps = conn.prepareStatement(sql);ps.setString(1, deptno);rs = ps.executeQuery();if (rs.next()) {/*取数据*/String dname = rs.getString(2);String loc = rs.getString(3);/*动态获取页面*/writer.print("			<!-- value 是动态获取的,部门编号不能修改 -->");writer.print("                部门编号:<input type='text' name='deptno' value='" + deptno + "' readonly='readonly' /><br />");writer.print("                部门名称:<input type='text' name='dname' value='" + dname + "' /><br />");writer.print("                部门地点:<input type='text' name='loc' value='" + loc + "' /><br />");}} catch (SQLException e) {e.printStackTrace();} finally {DBUtils.close(conn, rs, ps);}writer.print("			<input type='submit' value='修改' /><br />");writer.print("		</form>");writer.print("	</body>");writer.print("</html>");}
}
  • 对数据进行修改,注意:前端发送的请求时 doPost请求,要重写doPost 方法
    <!--DeptModifyServlet 映射信息--><servlet><servlet-name>DeptModifyServlet</servlet-name><servlet-class>yangzhaoguang.oa.DeptModifyServlet </servlet-class></servlet><servlet-mapping><servlet-name>DeptModifyServlet </servlet-name><!--DeptModifyServlet类的路径名,不需要加项目名--><url-pattern>/modify</url-pattern></servlet-mapping>
public class DeptModifyServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html");/*从前端获取数据*/String deptno = req.getParameter("deptno");String dname = req.getParameter("dname");String loc = req.getParameter("loc");Connection conn = null ;PreparedStatement ps = null;ResultSet rs  = null ;try {conn = DBUtils.getConnection();String sql = "update dept set dname=?,loc=? where deptno=?";ps = conn.prepareStatement(sql);/*修改数据*/ps.setString(1,dname);ps.setString(2,loc);ps.setString(3,deptno);int count = ps.executeUpdate();if (count != 0){/*修改成功后跳转到 list 页面*/req.getRequestDispatcher("/list").forward(req,resp);}else{req.getRequestDispatcher("/err.html").forward(req,resp);}} catch (SQLException e) {e.printStackTrace();}finally {DBUtils.close(conn,rs,ps);}}
}

访问流程:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAMjAyMuWKoOayueWRgA==,size_20,color_FFFFFF,t_70,g_se,x_16

 

到这里,用Servlet 制作单表增删改查已经完毕。部分代码使用 JSP+重定向 效果更好,代码更简单!~

 


http://chatgpt.dhexx.cn/article/35BhIt3H.shtml

相关文章

Avue-curd个性化定制

在使用vue(js)elelment(ui)开发一些后台管理项目的时候&#xff0c;基本会用到 列表页&#xff0c;条件搜索(search),表格数据(table),分页&#xff0c;操作栏的&#xff0c;增、删、改、查几种操作。如下图这样的&#xff1a; 很多的页面都很类似&#xff0c;这里就给大家介绍…

Python简单CURD

python Python的注释模块 python变量 格式化输出 转义字符 与 数据类型 控制台输入 实体类 Student.dy class Emp:def __init__(self,id,name,age,sex,sal):self.id idself.name nameself.age ageself.sex sexself.sal saldef __str__(self):return "学号&#xf…

MySQL常用语句(CURD)

文章目录 一、数据库定义语言&#xff08;DDL&#xff09;1.1 库操作1.2 表操作 二、数据库操纵语言&#xff08;DML&#xff09;2.1 插入 insert2.2 修改 update2.3 删除 delete 三、数据库查询语言&#xff08;DQL&#xff09;3.1 单表查询①查询&#xff1a;select②条件&am…

SpringBoot实现CURD

SpringBoot实现CURD 项目列表 Pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:/…

thinkphp curd 列表关联展现方式分享

在维护自己的开源框架中&#xff0c;针对后台列表模板&#xff0c;有时候我们需要在一键CURD的情况下&#xff0c;进行多个字段的关联显示&#xff0c;比如用户订单表里面存在user_id字段&#xff0c;那么在显示的时候&#xff0c;我们期望显示出用户的名称&#xff0c;而不是用…

mysql curd_mysql 基础之CURD

原文:mysql 基础之CURD 增删改查基本语法学习 增: insert Insert 3问: 1: 插入哪张表? 2: 插入哪几列? 3: 这几列分别插入什么值? Insert into TableName (列1,列2....列n) Values (值1,值2,....值n) 值 与 列,按顺序,一一对应 特殊: insert语句 允不允许不写列名 答:允许. …

小白入门:什么是CURD?

CRUD是CREATE、READ、UPDATE和DELETE的首字母缩写词&#xff0c;在数据库操作中频繁出现&#xff0c;本文针对小白&#xff0c;如果你已经是开发人员或者对数据库有一定认识的工程师可以默默离开了。让我直接走进CURD的世界。 为什么 CRUD 如此重要&#xff1f; CRUD 经常用于…

大龄焦虑?如何看待程序员35岁职业危机?

往期精选&#xff08;欢迎转发~~&#xff09; Java全套学习资料&#xff08;14W字&#xff09;&#xff0c;耗时半年整理 消息队列&#xff1a;从选型到原理&#xff0c;一文带你全部掌握 肝了一个月的ETCD&#xff0c;从Raft原理到实践 我肝了三个月&#xff0c;为你写出了…

Sitemesh前段框架基础

用sitemesh框架解决项目统一布局的解决方案 Sitemesh装饰框架 Sitemesh项目简介&#xff1a; Sitemesh是一个用来在jsp中实现页面布局和装饰&#xff08;layout and decoration&#xff09;的框架组件&#xff0c;能够帮助网站开发人员较容易实现页面中动态和静态装饰外观的分…

Sitemesh Demo

简介 sitemesh是一个网页布局与装饰体系,主要应用于创建具有大量一致性用户界面、导航与布局框架的站点。sitemesh拦截一切经过web server的静态或动态生成的HTML页面请求,处理页面内容,并将其与一个或多个装饰页面进行融合,生成最终页面。sitemesh也可用于构建由多个部分小…

spring集成sitemesh3

1、SiteMesh是什么&#xff1f; SiteMesh是一个网页布局和修饰的框架&#xff0c;利用它可以将网页的内容和页面结构分离&#xff0c;以达到页面结构共享的目的。 SiteMesh是基于Servlet的filter&#xff0c;通过截取response&#xff0c;并进行装饰后再交付给客户。 2、SiteMe…

sitemesh框架的简单使用(springboot+maven+jsp+sitemesh)

一 简单介绍 sitemesh是一种模板框架&#xff0c;是为了解决页面重复代码而设计的sitemesh的设计思想是装饰者设计模式 二 简单使用 目录结构&#xff0c;因为我这个项目本来是用来学习flowable的&#xff0c;后面为了方便快速学习&#xff0c;直接把sitemesh集成到这里了&a…

SiteMesh3简介及使用

最近项目用到SiteMesh3&#xff0c;研究学习一段时间后决定写篇博文来记录收获。 SiteMesh SiteMesh 介绍工作原理配置及使用 下载1添加maven依赖2webxml中添加SiteMesh过滤器3创建一个装饰页面decorator page4创建一个被装饰页面content page5配置 1XML方式1Java方式 6查看…

sitemesh初步

sitemesh小项目 1.工程目录 2.需要的lib:sitemesh-2.4.2.jar http://wiki.sitemesh.org/wiki/display/sitemesh/Download 3.配置 decorators.xml[sitemesh的配置文件] <?xml version"1.0" encoding"ISO-8859-1"?><!-- 在defaultdir目录…

SiteMesh框架统一布局用法介绍

SiteMesh 是一个网页布局和修饰的框架&#xff0c;基于 Servlet 中的 Filter&#xff0c;类似于 ASP.NET 中的‘母版页’技术。 介绍&#xff1a; 1&#xff0c;SiteMesh是OpenSymphony团队开发的JEE框架之一,它是一个非常优秀的页面装饰器框架。它通过对所有的用户请求进行过…

SIteMesh介绍

转自:http://javauu.com/thread-27-1-1.html 一、SIteMesh介绍 一、SiteMesh简介 SiteMesh是由一个基于Web页面布局、装饰以及与现存Web应用整合的框架。它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观&#xff0c;如一致的导航条&#xff0c;一致的banner&a…

【CSRF】学习关于CSRF攻击和防范

文章目录 1.CSRF攻击是什么2.CSRF攻击如何实现2.1 使用GET请求的CSRF的攻击例子2.2 使用post请求的CSRF攻击 3.如何防御CSRF攻击3.1 什么是CSRF令牌3.2 反-CSRF令牌工作流程3.3 同站Cookie策略 4.结论 高质量原文&#xff1a; CSRF Attacks: Anatomy, Prevention, and XSRF To…

CSRF攻击简述

一.CSRF是什么&#xff1f; CSRF&#xff08;Cross-site request forgery&#xff09;&#xff0c;中文名称&#xff1a;跨站请求伪造&#xff0c;也被称为&#xff1a;one click attack/session riding&#xff0c;缩写为&#xff1a;CSRF/XSRF。 二.CSRF可以做什么&#xff…

如何防止CSRF攻击?

文章目录 一、什么是CSRF&#xff1f;二、CSRF的几种类型1、GET类型的CSRF2、POST类型的CSRF3、链接类型的CSRF 三、CSRF的特点四、防护策略1、同源检测如何阻止外域请求无法确认来源域名情况 2、CSRF Token原理1&#xff09;将CSRF Token输出到页面中2&#xff09;页面提交的请…

CSRF攻击原理以及防御方法

CSRF攻击原理以及防御方法 CSRF概念&#xff1a;CSRF跨站点请求伪造(Cross—Site Request Forgery)&#xff0c;跟XSS攻击一样&#xff0c;存在巨大的危害性&#xff0c;你可以这样来理解&#xff1a; 攻击者盗用了你的身份&#xff0c;以你的名义发送恶意请求&#xff0c;对服…