JSTL代表JavaServer Pages Standard Tag Library;它提供了一组核心网页功能,可以执行许多基本任务,例如结构元素的条件和迭代,操作 XML 文档,以及支持国际化标记以更复杂的 SQL 元素处理。JSP以scriplets而闻名,但自JSTL和EL(Expression Language)问世以来,它一直非常不受欢迎。原因是JSP中的scriplet元素违反了良好工程实践的许多基本原则。本文深入探讨了 JSTL 的一些关键方面,这些方面强调了在 scriplet 上使用它的便利性。

在 JSP 中使用脚本元素的问题

查看由于脚本元素(在<%... %>内编写的元素)而产生的一些问题。实在是太多了。让我们快速概述其中一些以及您可以非常容易推断的其余部分。

  • 可 重用:嵌入在 JSP 中的 scriplet 不能重用。因此,使用面向对象技术的功能(如继承、组合和关联)是完全不适用的。此外,没有办法使scriplet抽象化。副作用是在多个位置重复相同的代码,这在面向对象编程中是非常不可接受的做法。
  • 调试:这是黑暗区域之一。尝试调试一个 JSP 页面,其中散布着装饰性的 scriplet,散落在 HTML 标记的一些不重要的角落。我的意思是,如果你还没有遇到过像 file 这样的问题,让我告诉你,至少在 JSP 中,创建一个文件非常容易。调试它。现在是困难的部分;不要撞你的头。在代码中途抛出的任何异常都会给出一个空白页,一个空的滚动,以创建你自己的意义。
  • 可维护性:好吧,厌恶可重用性和可怕的调试能力的东西,这是不可能的。杂乱、残缺和重复的代码几乎无法维护。

然而,JSP中的一些简单的scriplet是一个方便的标志,但是在JSP scriplets中编写的业务逻辑仍然是一个严格的禁忌,不是因为它不能被编写,而是因为它是一个不好的预兆(难以维护)。JSP 1.2 规范中的代码约定建议在 Web 应用程序中使用 JSP 标准标记库。这将有助于减少在 JSP 页面中对 JSP 脚本的需求。一般来说,使用 JSTL 的页面更易于阅读和维护。请参阅 JSP 技术的代码约定...。除了JSTL之外,还有其他方法可以克服一些上述问题,例如使用Java Bean组件来编写业务逻辑等。但是,让我们放弃这些细节,坚持JSTL所提供的。

JSTL 概述

JSTL 标签可以分为五类。它们中的每一个都可以用于特定目的。例如:

  • 核心标记用于 JSP 页面中的通用编程,例如显示字符串元素、条件语句、迭代以及重定向到新 URL。包含核心库的语法为:

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  • 除了格式化文本、日期、时间和数字之外,格式标签对于国际化特别有用。包含库的语法为:
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
  • SQL 标记可用于处理关系数据库时的所有 CRUD 操作。包含库的语法为:
    <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
  • XML 标记对于操作 XML 文档(如分析和转换 XML 数据)非常有用。包含库的语法为:
    <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
  • JSTL 函数为字符串处理提供了大量标记。包含库的语法为:
    <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

有关每个类别的标记详细信息的更多信息,请参阅 JSTL 1.1 库的 API 文档。

JSTL 中的一个简单的 CRUD 应用程序

该示例演示了如何使用 JSTL 编写简单的 CRUD 应用程序,而无需在 JSP 页面中编写单个 scriplet 元素。请注意,此程序是可行但基本的实现。为简洁起见,省略了数据验证和错误处理。出于同样的原因,下面的代码部分也没有给出眼睛糖果CSS部分。

图 1:正在执行的程序

该程序在后端使用MySQL数据库。用于创建表的 SQL 代码如下所示。

CREATE DATABASE testdb1;
USE testdb1;
CREATE TABLE address_book
( id INT PRIMARY KEY,fname VARCHAR(30),lname VARCHAR(30),phone VARCHAR(30),email VARCHAR(30)
);

页面工作流

图 2:页面的工作流图表

index.jsp

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type"content="text/html;charset=UTF-8">
<link href="style.css" rel="stylesheet" type="text/css" />
<title>Home Page</title>
</head>
<body><sql:setDataSource var="dbSource" driver="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://localhost/testdb1?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"user="root" password="root" /><sql:query dataSource="${dbSource}" var="dbResult">SELECT * FROM address_book;</sql:query><div id="myform"><form action="insert.jsp" method="post"><h1>New Address</h1><p class="mystyle">Add new address details</p><label>ID </label> <input type="text" name="id" /> <br> <label>FirstName </label> <input type="text" name="fname" /> <br> <label>LastName </label> <input type="text" name="lname" /> <br> <label>Phone </label> <input type="text" name="phone" /> <br> <label>Email </label> <input type="text" name="email" /> <br><input type="submit" value="Add New" /></form></div><br /><font color="blue"> <c:if test="${not empty param.msg}"><c:out value="${param.msg}" /></c:if></font><br /><form><div class="CSSTableGenerator"><table><tr><td>ID</td><td>First Name</td><td>Last Name</td><td>Phone</td><td>Email</td><td colspan="2"></td></tr><c:forEach var="row" items="${dbResult.rows}"><tr><td><c:out value="${row.id}" /></td><td><c:out value="${row.fname}" /></td><td><c:out value="${row.lname}" /></td><td><c:out value="${row.phone}" /></td><td><c:out value="${row.email}" /></td><td><ahref="updateForm.jsp?id=<c:outvalue="${row.id}"/>">Update</a></td><td><ahref="delete.jsp?id=<c:outvalue="${row.id}"/>">Delete</a></td></tr></c:forEach></table></div></form><br />
</body>
</html>

insert.jsp

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type"content="text/html;charset=UTF-8">
<title>JSP Page</title>
</head>
<body><sql:setDataSource var="dbSource" driver="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://localhost/testdb1?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"user="root" password="root" /><sql:update dataSource="${dbSource}" var="dbResult">INSERT INTO address_book(id, fname, lname, phone, email)VALUES (?,?,?,?,?);<sql:param value="${param.id}" /><sql:param value="${param.fname}" /><sql:param value="${param.lname}" /><sql:param value="${param.phone}" /><sql:param value="${param.email}" /></sql:update><c:if test="${dbResult>=1}"><c:redirect url="index.jsp"><c:param name="msg" value="1 record inserted" /></c:redirect></c:if>
</body>
</html>

updateForm.jsp

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type"content="text/html;charset=UTF-8">
<link href="style.css" rel="stylesheet" type="text/css" />
<title>Insert form Page</title>
</head>
<body><sql:setDataSource var="dbSource" driver="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://localhost/testdb1?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"user="root" password="root" /><sql:query dataSource="${dbSource}" var="dbResult">SELECT * from address_book where id=?;<sql:param value="${param.id}" /></sql:query><div id="myform"><form action="update.jsp" method="post"><h1>Update Address</h1><p class="mystyle">Update Address ID<c:out value="${param.id}" /></p><c:forEach var="row" items="${dbResult.rows}"><input type="hidden" value="${row.id}" name="id" /><label>First Name <span>Enter first name of theperson</span></label><input type="text" value="${row.fname}" name="fname" /><label> Last Name <span>Enter Last name of the person</span></label><input type="text" value="${row.lname}" name="lname" /><label>Phone <span>Enter phone number</span></label><input type="text" value="${row.phone}" name="phone" /><label>Email <span>Enter email address</span></label><input type="text" value="${row.email}" name="email" /><input type="submit" value="Update" /></c:forEach></form></div>
</body>
</html>

update.jsp

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type"content="text/html;charset=UTF-8">
<title>JSP Page</title>
</head>
<body><sql:setDataSource var="dbSource" driver="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://localhost/testdb1?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"user="root" password="root" /><sql:update dataSource="${dbSource}" var="dbResult">UPDATE address_book SET fname=?, lname=?, phone=?,email=? WHERE id=?;<sql:param value="${param.fname}" /><sql:param value="${param.lname}" /><sql:param value="${param.phone}" /><sql:param value="${param.email}" /><sql:param value="${param.id}" /></sql:update><c:if test="${dbResult>=1}"><c:redirect url="index.jsp"><c:param name="msg" value="1 record updated" /></c:redirect></c:if>
</body>
</html>

delete.jsp

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type"content="text/html;charset=UTF-8">
<title>JSP Page</title>
</head>
<body><sql:setDataSource var="dbSource" driver="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://localhost/testdb1?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"user="root" password="root" /><sql:update dataSource="${dbSource}" var="dbResult">DELETE FROM address_book WHERE id=${param.id};</sql:update><c:if test="${dbResult>=1}"><c:redirect url="index.jsp"><c:param name="msg" value="1 record deleted." /></c:redirect></c:if>
</body>
</html>

结论

通过使用 JSTL,我们可以方便地克服 JSP 页面中脚本元素的缺点。代码变得简单且更具可读性。但是,JSTL 不能取代脚本编写的灵活性。但是,根据经验,程序员应该避免编写scriplet,特别是在其他技术(如JSTL)满足其需求的情况下。

使用 JSTL SQL 标签的JSP CRUD增删改查相关推荐

  1. java增删改查实例源码_Spring Data JPA 实现简单的CRUD增删改查源码案例

    Spring专题 Spring Data JPA 实现简单的CRUD增删改查源码案例 Spring Data JPA旨在简化JPA基础知识库构建和减少需要与数据库进行通信的代码量.第一部分是如何配置H ...

  2. 关于Qt的CRUD增删改查数据库那些事,带GUI图像界面

    关于Qt的CRUD增删改查数据库那些事,带GUI图像界面 首先感谢CSDN平台提供这样强大的分享平台. Qt Creator 的几个常用快捷键必须要会,开发事半功倍, Ctrl 简称 C C + i ...

  3. 无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口

    无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口 回顾 通过之前一篇文章 无需编程,基于PostgreSQL零代码生成CRUD增删改查RESTful API接 ...

  4. 三、CRUD(增删改查)

    三.CRUD(增删改查) 3.1.namespace ​ namespace中的包名需要和mapper接口的包名一致! 1. id:就是对应的namespace中的方法名:2. resultType: ...

  5. 无需编程,基于微软mssql数据库零代码生成CRUD增删改查RESTful API接口

    无需编程,基于微软mssql数据库零代码生成CRUD增删改查RESTful API接口 回顾 通过之前一篇文章 无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接 ...

  6. Mybatis_第二节:CRUD(增删改查)

    _ ***配套文档:***↓↓↓ mybatis – MyBatis 3 | 简介 二.CRUD(增删改查) 实现功能需要改变的文件(接第一节结尾处) UserMapeer.java接口 UserMa ...

  7. node ajax crud,基于node.js和rethinkdb的CRUD(增删改查)Web服务

    基于node.js和rethinkdb的CRUD(增删改查)Web服务 这是一个简单的REST web服务演示案例源码,使用Node.JS和Express 和RethinkDB,后者持久化JSON数据 ...

  8. MyBatisPlus之CRUD增删改查以及分页

    MyBatisPlus之CRUD增删改查以及分页 1.CRUD详解之插入操作 环境测试,在之前的itcast-mp-springboot项目工程里面使用springboot来进行 编写用户测试类 /* ...

  9. 使用LitePal操作数据库(CRUD增删改查) 项目已上传GitHub

    GitHub项目地址: https://github.com/Skymqq/LitePalSave.git LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)映射的模式 ...

最新文章

  1. 有限算法下的技术实现路线
  2. PhpStorm 注册相关
  3. 在当今移动互联网时代_谁在提供当今最好的电子邮件体验?
  4. ASP.NET下MVC设计模式的实现
  5. hdu2648 Shopping-map容器
  6. 独家揭秘 | 阿里怎么做双11全链路压测?
  7. Dapper and Repository Pattern in MVC
  8. 电压、电流 —— 常用设备的电压电流
  9. RT-Thread源码学习第六篇,线程调度器(1)
  10. c语言回调函数_【云里雾里】回调函数与钩子函数
  11. Mac PS 之 简单去除背景并设置背景透明,变更图片宽高。。。
  12. QCC514x-QCC304x(headset)系列(实战篇)之5.1 tone详解
  13. Evolutionary Clustering of Streaming Trajectories
  14. JDK 9-17 新特性介绍
  15. hdmi怎么支持2k分辨率_HDMI版本小科普及毕亚兹HDMI高清线体验
  16. 推荐给后端工程师进阶的几本技术书籍
  17. 从零开始写Python爬虫 --- 1.5 爬虫实践: 笔趣阁小说批量下载
  18. c语言屏幕输出函数相关题,C语言上机考试题目
  19. 【unity】 untiy中如何导出FBX
  20. 计算机专业大学排名评估,2020全国计算机专业大学排名

热门文章

  1. 百度cdn几时能入币_百度金矿P2P CDN项目12月1号停止运营下线,现在可登记等待结算...
  2. 编写一个猥琐的反爬虫系统是种怎样的体验
  3. 为什么时钟都用32.768K的晶振?2的15次方
  4. 节日循环彩灯电路逻辑设计(使用74LS194二片)
  5. 在jsp页面中怎样把接受过来的id作为表单的隐藏id。
  6. 十进制与26进制英文字母互转
  7. honor荣耀怎么样?
  8. Elasticsearch实践(二)在Springboot微服务中集成搜索服务
  9. QDateTimeEdit 用法总结
  10. WPF 鼠标双击命令