【JSP】使用 JSTL 增强 JSP 功能

news2025/1/12 15:54:20

本文仅供学习参考!

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

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

查看由于脚本元素(在 <% … %> 范围内编写的元素)引起的一些问题。实在是太多了。让我们快速了解其中的一些以及您可以轻松推断的其余部分。

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

然而,JSP中的一些简单的脚本是方便的标志,但是在JSP脚本中编写的业务逻辑仍然是严格的禁忌,不是因为它不能编写,而是因为它是一个不好的预兆(难以维护)。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 部分。

JSTL1

**图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)
);

页面工作流

JSTL2
**图2:**页面的工作流图表

index.jsp

<%--
   Document   : index
   Created on : 29 Dec, 2015, 7:48:45 PM
   Author     : mano
--%>

<%@ 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.jdbc.Driver"
                         url="jdbc:mysql://localhost/testdb1"
                         user="root" password="pass123"/>
      <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 <span>Insert numeric id</span> </label>
            <input type="text" name="id"/>
            <label>First Name <span>Enter first name of
               the person</span> </label>
            <input type="text" name="fname"/>
            <label>Last Name <span>Enter Last name of
               the person</span> </label>
            <input type="text" name="lname"/>
            <label>
               Phone <span>Enter phone number</span>
            </label>
            <input type="text" name="phone"/>
            <label>
               Email <span>Enter email address</span>
            </label>
            <input type="text" name="email"/>
            <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>
                        <a href="updateForm.jsp?id=<c:out
                           value="${row.id}"/>">Update</a>
                     </td>
                     <td><a href="delete.jsp?id=<c:out
                        value="${row.id}"/>">Delete</a></td>
                  </tr>
               </c:forEach>
            </table>
         </div>
      </form>
      <br/>
   </body>
</html>

insert.jsp

<%--
   Document   : insert
   Created on : 29 Dec, 2015, 8:15:47 PM
   Author     : mano
--%>
<%@ 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.jdbc.Driver"
                         url="jdbc:mysql://localhost/testdb1"
                         user="root" password="pass123"/>


      <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>

insertForm.jsp

<%--
   Document   : insertForm
   Created on : 29 Dec, 2015, 8:36:06 PM
   Author     : mano
--%>
<%@ 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.jdbc.Driver"
                         url="jdbc:mysql://localhost/testdb1"
                         user="root" password="pass123"/>

      <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 the person</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

<%--
   Document   : update
   Created on : 29 Dec, 2015, 9:52:26 PM
   Author     : mano
--%>
<%@ 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.jdbc.Driver"
                         url="jdbc:mysql://localhost/testdb1"
                         user="root" password="pass123"/>

      <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

<%--
   Document   : delete
   Created on : 29 Dec, 2015, 10:08:06 PM
   Author     : mano
--%>
<%@ 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.jdbc.Driver"
                         url="jdbc:mysql://localhost/testdb1"
                         user="root" password="pass123"/>
      <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)满足其需求的情况下。

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

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

相关文章

Apache Struts是什么?高效实现应用程序控制器

目录 一、Apache Struts是什么 二、如何使用Apache Struts 三、Apache Struts的优势和作用 一、Apache Struts是什么 Apache Struts是一个基于Java的Web应用程序框架&#xff0c;它通过MVC&#xff08;模型-视图-控制器&#xff09;体系结构来实现应用程序控制器。Struts框…

如何沉淀企业内部的知识体系?

在当今竞争激烈的商业环境下&#xff0c;企业内部的知识是一项宝贵的资产。有效地沉淀企业内部的知识体系&#xff0c;可以帮助企业提高创新能力、加强竞争优势&#xff0c;并为员工学习和发展提供良好的资源。本文将介绍如何在企业中建立和沉淀知识体系&#xff0c;以促进知识…

聊聊程序员必备的软技能——情绪管理

我之前经常提到一句话&#xff1a;大多数时候所谓的“技术之玻璃天花板”&#xff0c;其实只是缺乏软技能而已。 所以粉丝朋友们&#xff0c;我们除了需要关注技术&#xff0c;更需要注重软技能的提高。 今天写的这篇是情绪管理。 文章目录&#xff1a; 01 前言 其实我一开…

6.1.3 关于可执行文件路径的变量:$PATH

查阅文件属性的指令ls完整文件名为&#xff1a;/bin/ls&#xff08;绝对路径&#xff09;。 当我们在执行一个指令的时候&#xff0c;系统会依照PATH的设置去每个PATH定义的目录下搜寻文件名为ls的可可执行文件&#xff0c;如果在PATH定义的目录中含有多个文件名为ls的可可执行…

Node框架 【Egg-企业级框架】

文章目录 &#x1f31f;前言&#x1f31f;Egg.js 是什么?&#x1f31f;Egg.js 的特性:&#x1f31f;Egg.js 的历史?&#x1f31f;Egg 继承于 Koa&#x1f31f;使用脚手架搭建项目环境&#x1f31f;环境准备&#x1f31f;搭建项目环境方式&#x1f31f;无需安装egg脚手架初始化…

大型医院安全(不良)事件报告系统源码(支持二次开发)

医院安全&#xff08;不良&#xff09;事件管理系统通过规范事件上报、流转审批、数据统计、原因分析、措施制定、效果追踪的业务流程&#xff0c;全面覆盖医院所有科室&#xff0c;利用统计工具对本院不良事件数据进行深度分析&#xff0c;查找医疗安全管理的薄弱环节&#xf…

微信小程序的跨页面传参以及data-方法的相关细节

&#x1f642;博主&#xff1a;爱学习的Akali King &#x1f642;文章核心&#xff1a;微信小程序的跨页面传参以及data-方法的相关细节 目录 前言wx.navigateTo()方法微信小程序传参的几种方式通过data-属性传参关于data-方法配合点击事件传参的细节 前言 其实在学习新东西的…

phpmyadmin弱口令至getshell 漏洞复现

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 环境部署02 漏洞配置03 利用方式04 修复方案 01 环境部署 &#xff08;1&#xff09;phpStudy phpStudy 是一款用于进行 PHP 环境调试的程序集成软件包。在软件安装后便 启动了 MySQL 服务、Apache…

【容灾系统搭建】网络杂谈(1)之容灾系统如何搭建?

涉及知识点 什么是容灾&#xff0c;容灾系统的建设&#xff0c;容灾系统的结构模型&#xff0c;容灾平台。深入了解容灾技术。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可去其主页关注下哈&#xff0c;不胜感激 文章目录 涉及知识点前言1.容灾系统…

Android Jetpack Compose - 探索 BottomSheet

Jetpack Compose 是一种现代化的、声明式的 UI 工具集&#xff0c;它使得 Android 的 UI 开发变得更加简单和直观。在这篇文章中&#xff0c;我们将要探索其中的一种常用 UI 元素 —— 底部抽屉&#xff08;BottomSheet&#xff09;。 一、什么是 BottomSheet&#xff1f; 在 …

速度与技能的较量!飞桨黑客松 OpenVINO™ 任务获奖者经验分享

点击蓝字 关注我们,让开发变得更有趣 作者 | Fisher 排版 | 李擎 速度与技能的较量&#xff01; 飞桨黑客松 OpenVINO™ 任务获奖者经验分享 前言/ 获奖经验分享&#xff0c;比赛轻松拿捏&#xff0c; 千元奖金拿到手软&#xff01; 黑客松活动介绍 飞桨黑客马拉松是一项兼具编…

Vuex —— 同步和异步请求

上一篇讲到 Vuex 状态管理的内容&#xff0c;先来简单的回顾一下 Vuex &#xff0c;Vuex 中有五个核心属性&#xff1a;state 、getter、mutation、action、module 。state: 存放数据状态&#xff0c;不能被直接的修改&#xff1b;getter: 基于 state 的计算属性&#xff1b;mu…

kaggle注册时出现一排“Captcha must be filled out.”

kaggle网址&#xff1a;Kaggle: Your Home for Data Science 想去kaggle下载一份数据&#xff0c;但是出现了一排红色的英文&#xff1a;&#xff08;真是学习之路哪哪都是阻碍哭唧唧&#xff09; ​ 出现该问题的原因&#xff1a;必须填写(图片)验证码&#xff0c;可是它没出…

长期不关路由器网速会变慢?一文读懂

如果把现代人最烦的十件事列一个清单&#xff0c;那么网速慢肯定其中一项。看剧的时候画面在转圈&#xff0c;玩游戏的时候角色在卡顿&#xff0c;真是让人非常恼火。 最近我家的网速也比刚安上网时慢了很多&#xff0c;看网上的说法是路由器太久没关了&#xff0c;应该天天关闭…

RESTful API是什么?

82. RESTful API是什么&#xff1f; 当我们构建应用程序或者开发Web服务时&#xff0c;常常需要提供一组接口供客户端访问和使用。RESTful API是一种常见的设计风格&#xff0c;它通过使用HTTP协议和一组规范的设计原则&#xff0c;提供了一种统一、可扩展和可维护的方式来构建…

2023金九银十Java基础-中级-高级面试题汇总(涵盖所有Java核心面试知识点)

寒冬来临&#xff0c;虽受眼前挫折&#xff0c;但咱程序猿&#xff08;媛&#xff09;也不能放弃啊&#xff01;也许这次秋招不是很理想&#xff0c;但是没得关系啊&#xff0c;再过几个月就开始备战2023年的金九银十了呀&#xff0c;现在着手准备&#xff0c;既是给自己的秋招…

机器学习评估与度量指标

这里的内容主要包括&#xff1a;性能度量、比较检验和偏差与方差。在上一篇文章中&#xff0c;我们解决了评估学习器泛化性能的方法&#xff0c;即用测试集的"测试误差"作为"泛化误差"的近似&#xff0c;当我们划分好训练/测试集后&#xff0c;那如何计算&…

《Opencv3编程入门》学习笔记—第十章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第十章 角点检测 一、Harris角点检测 &#xff08;一&#xff09;兴趣点与角点 1、图像特征类型&#xff1a; 边缘角点&#xff08;感兴趣点&#xff09;斑点&#xf…

在pycharm上导出Anaconda3的环境配置文件

目录 1.原理&#xff1a; ​2.亲身实践&#xff1a; 1.原理&#xff1a; 要在PyCharm中导出Anaconda3环境的配置文件&#xff0c;可以使用conda命令行工具来完成。请按照以下步骤进行操作&#xff1a; 打开PyCharm&#xff0c;并确保项目使用的是Anaconda3环境。 在PyCha…

【小程序】如何手动绘制分享用的图片

上一篇【小程序】如何实现滑动翻页中介绍了如何在小程序中实现上下滑动翻页的效果。 如果要给这个产品增加一个生成图片用于分享到朋友圈的功能&#xff0c;又该如何实现呢&#xff1f; 先来看一下最终的效果图&#xff1a; 首先&#xff0c;新建一个页面&#xff08;page&am…