JSP標準標籤庫

JSP標準標籤庫

    Pass by xkk ,and author is not clear

 

1. JSTL簡介

  JSTL全名JspServer Pages Standdard Tag Library(Jsp標準標籤庫),它是sun公司發佈的一個針對JSP開發的新組件,它允許使用標籤開發Jsp頁面.

   JSTL是一個標準的已制定好的標籤庫,它可以應用到很多領域. 如:基本輸入輸出、流程控制、循環、XML文件剖析、數據庫查詢及國際化和文字格式標準化的應用等。

  JSTL所提供的標籤庫主要分爲五大類:

JSTL

前置名稱

URI

範例

核心標籤庫

c

http://java.sun.com/jsp/jstl/core

<c:out>

I18N格式標籤庫

fmt

http://java.sun.com/jsp/jstl/fmt

<fmt:formatDate>

SQL標籤庫

sql

http://java.sun.com/jsp/jstl/sql

<sql:query>

XML標籤庫

Xml

http://java.sun.com/jsp/jstl/xml

<x:forEach>

函數標籤庫

fn

http://java.sun.com/jsp/jstl/functions

<fn:split>

 

2.核心標籤庫

 

功能分類

標籤名稱

表達式操作

out、set、remove、catch

流程控制

if、choose、when、otherwise

迭代操作

forEach、forTokens

URL操作

import、param、url、redirect

       2.1<c:out>

         功能: <c:out>主要用來顯示數據的內容

           屬性列表:

名稱

說明

必須

默認值

value

需要顯示出來的值

default

如果value的值爲null,則顯示default的值

escapeXml

是否轉換特殊字符,如:<轉換成&lt;

true

 

       實例:使用核心標籤庫,並輸出數據

       步驟一:將標籤庫中所有的.jar包(內部是所有的標籤處理器)放到/WEB_INF/lib下,將所有的.tld(內部是所有的標籤庫描述)放到/WEB-INF/tlds下

步驟二:在Jsp頁面中引用核心標籤(c_out.jsp)

<%@ page contentType="text/html;charset=gbk" language="java"%>

<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>

 

<%--default的兩種使用方式--%>

<%--如果在uri中輸入參數name=jgl,則顯示輸入的value中的值,否則顯示默認信息(default)--%>

<c:out value="${param.name}" default="welecome jgl to my website!"/>

<c:out value="${param.name}">welecome jgl to my website!</c:out>

 

<%--value屬性是必添的,escapeXml屬性是true時,不解析特殊字符,false時,解析特殊字符--%>

<c:out value="${param.name}" ecapeXml="false">&lt;c:out&gt;</c:out>

2.2<c:set>

功能: <c:set>主要用來將變量存儲至JSP範圍中 或是JavaBean的屬性或Map對象中。

屬性列表:

 

名稱

說明

必須

默認值

value

要被存儲的值

var

欲存入的變量名稱

scope

var變量的JSP範圍

page

target

JavaBean或Map對象

property

指定target對象的屬性

      

 實例1:將變量設置到Jsp範圍內,並輸出

<%--將變量定義在Jsp範圍內--%>

<%--value屬性的兩鍾使用方式--%>

<c:set var="username" value="jack" scope="session"/>

<c:set var="pwd" scope="session">000</c:set>

<%--通過el表達式語言輸出--%>

${sessionScope.username}

${sessionScope.pwd}

<%--通過jstl中<c:out>標籤輸出--%>

<c:out value="${sessionScope.username}"/>

實例2:將變量設置到javaBean對象內,並輸出

<jsp:useBean id="stu" class="net.pcedu.student"/>

<%--通過<c:set>標籤給javaBean對象的age屬性設值--%>

<c:set value="16" target="${stu}" property="age"/>

<%--輸出javaBean對象的屬性值--%>

年齡:<c:out value="${stu.age}"/>

2.3<c:remove>

功能:主要負責移除變量

屬性列表:

名稱

說明

必須

默認值

var

欲移出的變量名稱

scope

Var變量的JSP範圍

page

 

如:

<c:remove var="username" scope="session"/>

${sessionScope.username}—輸不出結果

2.4<c:catch>

功能:主要用於捕獲異常

屬性列表:

名稱

說明

必須

默認值

var

用來儲存錯誤信息的變量

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

<%@ page contentType="text/html; charset=gb2312" language="java" %>

<%--捕獲異常,並將異常信息存儲在var變量中--%>

<c:catch var="myexp">

<%

int i=0;

int j=3/0;

%>

</c:catch>

<h1>異常</h1>

<hr>

<c:out value="${myexp}"></c:out><%--輸出異常--%>

<hr>

<h1>異常信息</h1>

<c:out value="${myexp.message}"/><%--獲取異常信息--%>

<hr>

<h1>引起原因</h1>

<c:out value="${myexp.cause}"/><%--獲取引起異常的原因--%>

2.5<c:if>

功能:主要用於進行if判斷,如果爲true,則輸出標籤體中的內容

名稱

說明

必須

默認值

test

如果表達式的結果爲true,則執行體內容,false則相反

var

用來存儲test運算的結果(true或false)

scope

Var變量的JSP範圍

page

實例:利用<c:set>標籤設置javaBean的屬性age,在jsp頁面中獲取age,如果age<18,輸出相應信息

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

<%@ page contentType="text/html; charset=gb2312" language="java" %>

<%--jsp頁面默認是true,EL表達式被忽略--%>

<%@ page isELIgnored="false"%>

<%--定義一個javaBean對象--%>

<jsp:useBean id="stu" class="net.pcedu.student"/>

<%--通過<c:set>標籤給javaBean對象的age屬性設值--%>

<c:set value="16" target="${stu}" property="age"/>

<%--輸出javaBean對象的屬性值--%>

年齡:<c:out value="${stu.age}"/>

<%--當if判斷爲true時,輸出標籤體的內容--%>

<c:if test="${stu.age<18}" var="young" scope="session">對不起,未成年,不能訪問這個網站...</c:if>

<%--輸出if語句的判斷結果--%>

判斷結果:<c:out value="${sessionScope.young}"/>

2.6<c:choose>,<c:when>,<c:otherwise>

<c:when>中屬性列表:

名稱

說明

必須

默認值

test

如果表達式的結果爲true,則執行本體內容,false則相反

實例:從javaBean中獲取color屬性,並根據不同的屬性值顯示不同的顏色

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

<%@ page contentType="text/html; charset=gb2312" language="java" %>

<%@ page isELIgnored="false"%>

<%--定義一個Color對象--%>

<jsp:useBean id="c" class="net.pcedu.Color"/>

<%--爲Color對象設置屬性--%>

<c:set value="blue" target="${c}" property="color"/>

<%--獲取Color對象的屬性值,並根據不同的屬性值顯示不同的顏色--%>

<c:out value="${c.color}"></c:out>

<c:choose>

    <c:when test="${c.color eq 'red'}">

       <font color=red face="華文行楷">你選擇的顏色是:<c:out value="${c.color}"/></font>

    </c:when>

    <c:when test="${c.color eq 'blue'}">

       <font color=blue face="華文行楷">你選擇的顏色是:<c:out value="${c.color}"/></font>

    </c:when>

    <c:otherwise>

       <font color=green face="華文行楷">你選擇的顏色是:<c:out value="${c.color}"/>

    </c:otherwise>

</c:choose>

2.7<c:forEach>

功能: <c:forEach>爲循環控制,它可以將數組,集合(Collection)中的成員循序瀏覽一遍。

屬性列表:

 

名稱

說明

必須

默認值

var

用來存放現在指定的成員

items

被迭代的集合對象

varStatus

用來存放現在指的相關成員信息

begin

開始的位置

0

end

結束的位置

最後一個成員

step

每次迭代的間隔數

1

實例:

<%@ page contentType="text/html;charset=gbk"%>

<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>

<%@ page import="java.util.*,net.pcedu.core.UserInfo" %>

<%--將javabean對象存放到集合中--%>

<%

List users=new ArrayList();

for(int i=0;i<5;i++)

{

UserInfo u=new UserInfo();

u.setName("jack-"+i);

u.setPwd("00"+i);

users.add(u);

session.setAttribute("users",users);

}

%>

<%--注意:EL中只可通過11個隱含對象來輸出表達式中的內容(因此直接將List對象添加到EL表達式中不可用)--%>

<%--通過<c:forEach>迭代出集合中的信息>--%>

<h1>用戶信息</h1>

<table>

  <tr>

    <th>用戶名</th>

    <th>密碼</th>

    <th>當前行的索引</th>

    <th>已遍歷的行數</th>

    <th>是否第一行</th>

    <th>是否最後一行</th>

  </tr>

  <c:forEach var="user" items="${users}" varStatus="status"><%--加上begin="1" end="3" step="1"屬性,將只顯示前三條記錄--%>

  <tr>

    <td><c:out value="${user.name}"/></td>

    <td><c:out value="${user.pwd}"/></td>

    <td><c:out value="${status.index}"/></td><%--輸出當前行的索引號--%>

    <td><c:out value="${status.count}"/></td><%--輸出已遍歷的行數--%>

    <td><c:out value="${status.first}"/></td><%--輸出當前行是否是第一行--%>

    <td><c:out value="${status.last}"/></td><%--輸出當前行是否是最後一行--%>

  </tr>

  </c:forEach>

</table>

 

<%--通過<c:forEach>輸出從1到10的數據--%>

<c:forEach var="num" begin="1" end="10" step="2">

<c:out value="->${num}"></c:out>

</c:forEach>

 

<%--通過<c:forEach>遍歷數組,枚舉,集合等--%>

<%

int[]intarr=new int[]{10,20,30,40,50};

String[]strarr=new String[]{"I","am","a","handsome","boy"};

Vector v=new Vector();

v.add("This");

v.add("is");

v.add("a");

v.add("Enumeration");

v.add("example");

Enumeration e=v.elements();

HashMap h=new HashMap();

h.put("hello","0");

h.put("hello1","1");

h.put("hello2","2");

h.put("hello3","3");

h.put("hello4","4");

request.setAttribute("intarr",intarr);

request.setAttribute("strarr",strarr);

request.setAttribute("e",e);

request.setAttribute("h",h);

%>

<br>

<h1>--遍歷整形數組--</h1>

<%--遍歷整形數組--%>

<c:forEach var="i" items="${intarr}">

<c:out value="${i}"></c:out>

</c:forEach>

 

<br>

<h1>--遍歷字符串數組--</h1>

<%--遍歷字符串數組--%>

<c:forEach var="s" items="${strarr}">

<c:out value="${s}"></c:out>

</c:forEach>

 

<br>

<h1>--遍歷枚舉--</h1>

<%--遍歷枚舉--%>

<c:forEach var="ee" items="${e}">

<c:out value="${ee}"></c:out>

</c:forEach>

 

<br>

<h1>--遍歷HashMap--</h1>

<%--遍歷HashMap--%>

<c:forEach var="hh" items="${h}">

<c:out value="${hh.key}"/>=<c:out value="${hh.value}"/>

</c:forEach>

 

2.8<c:forTokens>

功能:將字符串以指定的一個或多個字符分割開來

屬性列表

 

名稱

說明

必須

默認值

var

用來存放現在的成員

items

被迭代的字符串

delims

定義用來分割字符串的字符

varStatus

用來存放現在指定的相關成員信息

begin

開始位置

0

end

結束位置

最後一個成員

step

每次迭代的間隔數

1

 

實例:

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

<%@ page contentType="text/html; charset=gb2312" language="java" %>

 

<%--通過一個分割符將字符串劃分爲數組,並遍歷出來--%>

<c:forTokens var="ele" items="blue,red,green|yellow|pink,black|white" delims="|">

<c:out value="${ele}"/>||

</c:forTokens>

<br>

<%--通過多個分割符將字符串劃分問數組,並遍歷出來--%>

<c:forTokens var="ele" items="blue,red!green|yellow;pink;black|white" delims="|;,!">

<c:out value="${ele}"/>||

</c:forTokens>

2.9<c:import>

功能: <c:import>可以把其他靜態或動態文件包含至本身JSP網頁。

屬性列表:

名稱

說明

必須

默認值

url

文件被包含的地址

context

相同容器下,其它web必須以“/”開頭

var

儲存被包含文件的內容

scope

var變量的JSP範圍

page

charEncoding

被包含文件內容的編碼格式

varReader

儲存被包含的文件的內容

注意:<c:import>與<jsp:include>的區別

<jsp:include>只能包含和自己同一個Web應用程序下的文件;而<c:import>除了能包含和自己同一個Web應用程序的文件外,亦可以包含不同Web應程序或者是其它網站的文件。

       實例:包含同一個web應用程序的文件和不同webweb應用程序的文件

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

<%@ page contentType="text/html; charset=gb2312" language="java" %>

 

<%--引入絕對路徑的文件--%>

<%--注意:被引入的文件將被解析爲html的形式嵌入引用文件--%>

<h1>引入絕對路徑的文件</h1>

<c:import url="http://127.0.0.1:8080/test/c_beimported.jsp" var="file" charEncoding="gbk"/>

<blockquote>

<pre>

<c:out value="${file}"></c:out>

</pre>

</blockquote>

 

<%--引入相對路徑的文件--%>

<h1>引入相對路徑的文件</h1>

<blockquote>

<pre>

<c:import url="c_beimported.jsp" var="f"/>

<c:out value="${f}"></c:out>

</pre>

</blockquote>

 

<%--傳遞參數到被引入文件--%>

<h1>傳遞參數到被引入文件</h1>

<blockquote>

<pre>

<c:import url="c_beimported.jsp" var="ff">

<c:param name="name" value="jack"/>

</c:import>

<c:out value="${ff}"></c:out>

</pre>

</blockquote>

 

       2.10.<c:url>

功能: <c:url>主要用來產生一個URL

 

名稱

說明

必須

默認值

value

執行的URL

context

相同容器下,必須以“/”開頭

var

儲存被包含文件的內容

scope

var變量的JSP範圍

page

 

實例: 將一個url存放到一個變量中,並輸出url

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

<%@ page contentType="text/html; charset=gb2312" language="java" %>

<%--將一個url存放到一個變量中,並輸出url--%>

<c:url var="myurl" value="c_beimported.jsp" scope="session">

<c:param name="name" value="jgl"/>

</c:url>

<c:out value="${myurl}"/>

 

2.11<c:redirect>

功能: <c:redirect>可以將客戶端的請求從一個JSP網頁導向到其它文件。

屬性列表:

 

名稱

說明

必須

默認值

url

導向的目標地址

context

相同容器下,必須以“/”開頭

 

 

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

<%@ page contentType="text/html; charset=gb2312" language="java" %>

 

<%--通過<c:url>獲得url--%>

<c:url value="c_beimported.jsp" var="test"><c:param name="name" value="jgl"/></c:url>

<%--通過<c:redirect>重定向到獲得的url上--%>

<c:redirect url="${test}"/>

 

<%--通過<c:url>獲得url--%>

<c:url value="c_beimported.jsp" var="t"></c:url>

<%--通過<c:redirect>重定向到獲得的url上(在<c:redirect>內部傳參)--%>

<c:redirect url="${t}">

<c:param name="name" value="admin"/>

</c:redirect>

 

3.SQL標籤庫

實例:通過數據源來連接數據庫

步驟一:配置上下文中的<Resource>(test.xml)

<Context docBase="G:\jstlPro\WebRoot" path="/test" reloadable="true">

<Resource

name="jdbc/mydb"

auth="Container"

type="javax.sql.DataSource"

maxActive="100"

maxIdle="30"

maxWait="10000"

username="root"

password="admin"

driverClassName="com.mysql.jdbc.Driver"

url="jdbc:mysql://localhost:3306/mydb"

/>

</Context>

步驟二:編寫DbHelper.java來進行連接

package net.pcedu.util;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.naming.NamingException;

import javax.sql.DataSource;

 

public class DbHelper {

    DataSource ds;

    Connection conn;

    Statement stmt;

    ResultSet rs;

    public DataSource getDataSource()

    {

       //定義一個Context接口類型的變量

       Context context;

       try {

           //通過InitialContext(實現了Context接口的類)來實例化一個Context類型對象

           context=new InitialContext();

           //通過字符串名字查找到數據源對象

           ds=(DataSource)context.lookup("java:comp/env/jdbc/mydb");

       } catch (NamingException e) {

           e.printStackTrace();

       }     

       return ds;

    }

    public Connection getConnection()

    {

       if(ds==null)

       ds=getDataSource();

       try {

           //通過數據源來獲得連接

           conn=ds.getConnection();

       } catch (SQLException e) {

           e.printStackTrace();

       }

       return conn;

    }

    public Statement getStatement()

    {

       if(conn==null)

       conn=getConnection();

       try {

           //通過連接來創建一個會話

           stmt=conn.createStatement();

       } catch (SQLException e) {

           e.printStackTrace();

       }

       return stmt;

    }

    public ResultSet getResultSet(String sql)

    {

       try {

           if(stmt==null)

           //通過會話來執行sql語句,並返回結果集

           rs=stmt.executeQuery(sql);

       } catch (SQLException e) {

           e.printStackTrace();

       }

       return rs;

    }

    public static void main(String[]args)

    {

       DbHelper db=new DbHelper();

       System.out.println(db.getConnection());

    }

}

步驟三:在Jsp頁面中判斷是否連接成功(index.jsp)

<%@ page contentType="text/html;charset=gbk"%>

<jsp:useBean class="net.pcedu.util.DbHelper" id="db"/>

<%

out.println(db.getConnection());

%>

3.1Javax.naming.Context 接口:

Javax.naming.Context 接口表示一個命名上下文,定義了將對象(把連接數據庫的資源封裝成一個對象)和名字綁定,以及通過名字查詢對象的方法。查詢一個命名的對象,是通過調用Context接口的lookup方法。

 

  資源文件的屬性列表

屬性

描述

name

指定資源相對於JAVA:COMP/ENV上下文的JNDI名

auth

指定資源的管理者,它有兩個選項APPLICATION和Container

type

指定資源所屬java類的完整限定名

maxActive

指定在連接池中數據庫連接的最大數目,指定這個值需要參照使用的數據庫所配置的最大連接數。取值爲0,表示沒有限制

maxIdle

指定連接池中保留的空閒的數據庫連接的最大數目。取值-1表示沒有限制

maxWait

指定等待一個數據庫連接成爲可用狀態的最大時間,以毫秒爲單位。如果設-1,表示沒有限制

username

連接數據庫用戶名

password

連接數據庫密碼

driverClassName

指定JDBC驅動程序類名

url

指定數據庫的URL

 

實例:SQL標籤庫中標籤的使用

 

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

<%@ taglib prefix="sql" uri="http://java.sun.com/jstl/sql_rt" %>

<%@ page contentType="text/html; charset=gb2312" language="java" %>

<%--從jndi名稱空間中獲得一個數據源--%>

<sql:setDataSource

  var="sc"

  dataSource="jdbc/mydb"

/>

<c:out value="${sc}"></c:out>

<%--創建普通的數據源--%>

<sql:setDataSource

  var="shopcart"

  driver="com.mysql.jdbc.Driver"

  url="jdbc:mysql://localhost:3306/shopcart"

  user="root"

  password="admin"

/>

<c:out value="ok"/>

 

<%--使用數據源進行更新--%>

<sql:update var="up" dataSource="${sc}">

    update user set pwd='123' where name='jack'

</sql:update>

 

<%--含參數的更新--%>

<sql:update var="up1" sql="update user set name=? where pwd=?" dataSource="${sc}">

   <sql:param value="rose"/>

   <sql:param value="123"/>

</sql:update>

 

<%--增加記錄--%>

<sql:update var="up2" sql="insert into user values(1002,'jgl','jgl')" dataSource="${sc}"/>

<c:out value="${up2}"></c:out><%--var中存放的是影響的行數--%>

 

<%--刪除記錄--%>

<sql:update var="up3" sql="delete from user" dataSource="${sc}"/>  

 

<%--創建表

<sql:update var="up3" sql="create table student(name varchar(20))" dataSource="${sc}"/>

<c:out value="${up3}"></c:out>

--%>

 

<%--刪除表--%>

<sql:update var="up4" sql="drop table student" dataSource="${sc}"/>

 

<%--使用數據源進行查詢--%>

<sql:query var="query1" dataSource="${sc}">

    SELECT * FROM user

</sql:query>

<table border="1">

  <c:forEach var="row" items="${query1.rows}">

  <tr>

    <td>name: <c:out value="${row.name}"/></td>

    <td>pwd: <c:out value="${row.pwd}"/></td>

  </tr>

  </c:forEach>

</table>

 

<%--使用事務處理方式創建一個表--%>

<%--使用事務處理方式可以將要執行的sql語句放到<sql:transaction>元素中--%>

<sql:transaction dataSource="${sc}">

  <sql:update var="newTable">

    create table usertable (

      nameid int primary key,

      name varchar(80)

    )

  </sql:update>

</sql:transaction>

4.Jsp頁面中出現el不能解析的異常時的解決方式

方式一: 把<web-app xmlns="http://java.sun.com/xml/ns/j2ee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

    version="2.4">

改成

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

 

       方式二: <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

改爲<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

前提必須有c-rt.tld文件纔可以

發佈了22 篇原創文章 · 獲贊 21 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章