爲了更方便、便捷的在頁面中輸入和操作動態數據,jsp引入了表達式語言(EL)和jsp標準標籤庫(JSTL)技術。兩者在jsp2.0版本以上都作爲標準被支持。
目錄
一、EL技術
1.EL的作用
jsp頁面中輸出動態信息有三種方法。
①jsp內置對象out:例如,<% out.println("這是一篇技術介紹博客");%>
②jsp表達式:例如,<%=new Date()%>
③表達式語言:例如,${user.id}
EL表達式的作用就是在jsp頁面中輸出動態信息
2.EL語法
(1)EL的語法形式
所有的EL都是以“${”開始,以“}”結束的。
例如:
${user.name}
功能:在頁面上顯示錶達式user.name的值
如果EL表達式不指定範圍,那麼表達式會依次在page、request、session、application範圍中查找。若中途找到user.name,就返回其值,不在繼續找;但若在全部範圍中內有找到,就返回null。
如果要指定範圍,就需要加上特定的前綴
page範圍:${pageScope.user.name}
request範圍:${requestScope.user.name}
response範圍:${responseScope.user.name}
session範圍:${sessionScope.user.name}
在web程序設計時,對jsp頁面常用EL代替腳本代碼顯示輸出內容。
(2)EL內部對象
EL提供了11個可直接使用的內部對象。
類別 | 對象 | 描述 |
---|---|---|
jsp | pageContent | 獲取當前jsp頁面的信息,可訪問jsp的8個內置對象 |
作用域 | pageScope | 獲取page範圍的屬性值 |
requestScope | 獲取request範圍的屬性值 | |
sessionScope | 獲取response範圍的屬性值 | |
applicationScope | 獲取application範圍的屬性值 | |
請求參數 | param | 獲取單個指定請求參數的值 |
paramValues | 獲取請求參數的所有請求參數的值數組 | |
請求頭 | header | 獲取單個指定請求頭信息的值 |
headerValues | 獲取請求頭信息的所有請求頭的值數組 | |
Cookie | cookie | 獲取request中的Cookie集 |
初始化參數 | initParam | 獲取初始化參數值 |
(3)存取運算符
EL表達式是由EL的有關運算符構成的式子,主要運算符有:存取數據運算符以及表達式求值運算符。
在EL中,對數據值的存取是通過"[]"或"."實現的。
${user.name}或${user["name"]}或${user[name]}
"[]"主要用於訪問數組、列表或其他集合對象的屬性
"."主要用於訪問對象的屬性
(4)EL運算符
EL支持的運算符和java語言運算符類似,分爲算數運算符、關係運算符、邏輯運算符和特殊運算符。唯一不同的是EL中的一個特殊運算符empty--用以判斷是否爲空。
EL提供自動類型轉換的功能,能夠按照一定的規則將操作數或結果轉換成指定的類型。
3.EL調用實例
調用並顯示javabean中的信息
package bean;
public class javabean {
private int id;
private String name;
private String sex;
public javabean() {
super();
id=1;
name="張三";
sex="男";
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="bean.javabean" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>調用javabean</title>
</head>
<body>
<jsp:useBean id="javabean" class="bean.javabean" scope="session"></jsp:useBean>
<%
int BId=javabean.getId();
javabean.setId(2);
String Name=javabean.getName();
javabean.setName("李四");
%>
<p>展示信息</p>
<hr>
學號:${javabean.id}<br>
姓名:${javabean.name}<br>
性別:${javabean.sex}<br>
</body>
</html>
二、JSTL技術
1.JSTL簡介
JSTL是jsp標準標籤庫,使用JSTL中的標籤可以提高開發效率,減少jsp頁面中的代碼數量,保持頁面的簡潔性和良好的可讀性、可維護性。
JSTL專門提供了一套支持Jar包,JST標籤按功能分爲5類。
功能類型 | uri | prefix | 庫功能 |
---|---|---|---|
核心庫 |
http://java.sun.com/jsp/jstl/core |
c | 操作範圍變量、流程控制、url生成和操作 |
XML處理 | http://java.sun.com/jsp/jstl/xml | x | 操作通過xml表示的數據 |
格式化 | http://java.sun.com/jsp/jstl/fmt | fmt | 數字及日期數據格式化、頁面國際化 |
數據庫存取 | http://java.sun.com/jsp/jstl/sql | sql | 操作關係數據庫 |
函數 | http://java.sun.com/jsp/jstl/functions | fn | 字符串處理函數 |
表中的統一資源標識符(URI)表示標籤的位置,perfix是使用標籤時用到的前綴。在web程序中使用JSTL標籤,必須首先下載支持Jar包(javax.servlet.jsp.jstl.jar和jstl-impl-1.2.2.jar),然後部署到工程中。
在jsp頁面中添加taglib指令,從而使該頁面使用到添加的標籤:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
2.常用的JSTL標籤
(1)<c:out>:用於在jsp頁面中顯示數據
<c:out value="${user.id}" default="null"/>
value屬性:輸出的信息,可以使EL表達式或常量;default屬性:可選項,當value值爲空時顯示的信息,上述例子顯示null。
(2)<c:set>:用於保存數據
<c:set target="" value="" var="" property="" scope=""/>
value屬性:可選項,要保留的信息;target屬性:可選性,需要修改屬性的變量名;property屬性:可選項,需要修改的javabean屬性;var屬性:可選項,需要保存的信息的變量;scope屬性:可選項,保存信息的變量範圍。
(3)<c:remove>:用於刪除數據
<c:remove var="" scope=""/>
var屬性:要刪除的變量;scope屬性:可選項,被刪除變量的範圍(page、request、response、application)
(4)<c:if>:單條件標籤
<c:if test="test-condition">
body content
</c:if>
test屬性:需要評價的條件,條件需要自己定義;var屬性:可選項,需要保存的信息的變量;scope屬性:可選項,保存信息的變量範圍。
(5)<c:choose>:多分枝標籤
<c:choose>用於多選擇情況,與<c:when>、 <c:otherwise>配合使用。<c:when>有一個屬性test,由於指明判定條件。
<c:choose>
<c:when test="condition1">
相關語句
</c:when>
其他條件語句
<c:otherwise>
相關語句
</c:otherwise>
</c:choose>
(6)<c:forEach>:循環標籤
格式1:
<c:forEach var="" varStatus="" begin="" end="" step="">
循環內容
</c:forEach>
格式2:
<c:forEach var="" varStatus="" items="">
循環內容
</c:forEach>
其中,items屬性:進行循環的項目;var屬性:代表當前項目的變量名;begin屬性:開始條件;end屬性:結束條件;step屬性:步長;vatStatus屬性:顯示循環變量的狀態。
3.JSTL標準函數
調用函數前,需要在jsp中引入標準函數聲明。
http://java.sun.com/jsp/jstl/functions
函數名 | 函數說明 |
---|---|
fn:contains() | 測試輸入的字符串是否包含指定的子串 |
fn:containsIgnoreCase() | 測試輸入的字符串是否包含指定的子串,大小寫不敏感 |
fn:endsWith() | 測試輸入的字符串是否以指定的後綴結尾 |
fn:escapeXml() | 跳過可以作爲XML標記的字符 |
fn:indexOf() | 返回指定字符串在輸入字符串中出現的位置 |
fn:join() | 將數組中的元素合成一個字符串然後輸出 |
fn:length() | 返回字符串長度 |
fn:replace() | 將輸入字符串中指定的位置替換爲指定的字符串然後返回 |
fn:split() | 將字符串用指定的分隔符分隔然後組成一個子字符串數組並返回 |
fn:startsWith() | 測試輸入字符串是否以指定的前綴開始 |
fn:substring() | 返回字符串的子集 |
fn:substringAfter() | 返回字符串在指定子串之後的子集 |
fn:substringBefore() | 返回字符串在指定子串之前的子集 |
fn:toLowerCase() | 將字符串中的字符轉爲小寫 |
fn:toUpperCase() | 將字符串中的字符轉爲大寫 |
fn:trim() | 移除首位的空白符 |
4.JSTL實例--使用EL和JSTL顯示查詢結果
package bean;
public class javabean {
private int id;
private String name;
private String sex;
public javabean() {
super();
// TODO Auto-generated constructor stub
}
public javabean(int id, String name, String sex) {
super();
this.id = id;
this.name = name;
this.sex = sex;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
package bean;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class jieshou
*/
@WebServlet("/jieshou")
public class jieshou extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public jieshou() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
List<javabean> studentlist=new ArrayList<javabean>();
studentlist.add(new javabean(1,"張三","男"));
studentlist.add(new javabean(2,"李四","女"));
studentlist.add(new javabean(3,"王五","男"));
request.setAttribute("result", studentlist);
request.getRequestDispatcher("beanEL.jsp").forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="bean.javabean,java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>調用servlet</title>
</head>
<body>
<p>通過EL和JSTL顯示結果</p>
<hr>
<table>
<tr><th>學號</th><th>姓名</th><th>性別</th></tr>
<c:forEach var="javabean" items="${result }">
<tr><td>${javabean.id}</td>
<td>${javabean.name}</td>
<td>${javabean.sex}</td></tr>
</c:forEach>
</table>
</body>
</html>