【JSP】使用 JSTL 增强 JSP 功能

本文仅供学习参考!

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)满足其需求的情况下。

猜你喜欢

转载自blog.csdn.net/m0_47015897/article/details/131418156