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 |
是否轉換特殊字符,如:<轉換成< |
否 |
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"><c:out></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文件纔可以