javascript
JSP高级进阶
文章目錄
- JSP高級進階
- 1、EL表達式
- 1.1、表達式語言
- 1.2、一個簡單的語法
- 1.3、EL中的基礎操作符
- 1.4、JSP EL隱含對象
- pageContext對象
- Scope對象
- param和paramValues對象
- header和headerValues對象
- Attribute
- 2、連接數據庫
- 2.1、提前準備
- 2.2、測試數據
- SELECT操作
- INSERT操作
- DELETE操作
- UPDATE操作
- 3、JavaBean
- 3.1、JavaBean 屬性
- 3.2、JavaBean 程序示例
- 3.3、訪問JavaBean
- 3.4、訪問 JavaBean 對象的屬性
- 4、JSTL
- 4.1、JSTL 庫安裝
- 4.2、核心標簽
- 4.3、格式化標簽
- 4.4、SQL標簽
- 4.5、JSTL函數
- 5、JSP 異常處理
- 5.1、使用Exception對象
- 5.2、在錯誤頁面中使用JSTL標簽
- 5.3、使用 try…catch塊
- 6、JSP 國際化
- 6.1、檢測Locale
- 6.2、實例演示
- 6.3、語言設置
- 6.4、區域特定日期
- 6.5、區域特定貨幣
- 6.6、區域特定百分比
JSP高級進階
1、EL表達式
1.1、表達式語言
**JSP表達式語言(EL)**使得訪問存儲在JavaBean中的數據變得非常簡單。JSP EL既可以用來創建算術表達式也可以用來創建邏輯表達式。在JSP EL表達式內可以使用整型數、浮點數、字符串、常量、true、false,還有null。
1.2、一個簡單的語法
典型的,當您需要在JSP標簽中指定一個屬性值時,只需要簡單地使用字符串即可:
<jsp:setProperty name="box" property="perimeter" value="100"/>JSP EL允許您指定一個表達式來表示屬性值。一個簡單的表達式語法如下:
${expr}// 根據變量名取出變量值其中,expr指的是表達式。在JSP EL中通用的操作符是 . 和 {} 。這兩個操作符允許您通過內嵌的JSP對象訪問各種各樣的JavaBean屬性。
舉例來說,上面的jsp:setProperty標簽可以使用表達式語言改寫成如下形式:
<jsp:setProperty name="box" property="perimeter" value="${2*box.width+2*box.height}"/>當JSP編譯器在屬性中見到"${}"格式后,它會產生代碼來計算這個表達式,并且產生一個替代品來代替表達式的值。
您也可以在標簽的模板文本中使用表達式語言。比如jsp:text標簽簡單地將其主體中的文本插入到JSP輸出中:
<jsp:text><h1>Hello JSP!</h1> </jsp:text>現在,在jsp:text標簽主體中使用表達式,就像這樣:
<jsp:text>Box Perimeter is: ${2*box.width + 2*box.height} </jsp:text>在EL表達式中可以使用圓括號來組織子表達式。比如(1+2)?3等于9,但是{(1 + 2) * 3}等于9,但是(1+2)?3等于9,但是{1 + (2 * 3)} 等于7。
想要停用對EL表達式的評估的話,需要使用page指令將isELIgnored屬性值設為true:
<%@ page isELIgnored ="true|false" %>這樣,EL表達式就會被忽略。若設為false,則容器將會計算EL表達式。
1.3、EL中的基礎操作符
EL表達式支持大部分Java所提供的算術和邏輯操作符:
| . | 訪問一個Bean屬性或者一個映射條目 |
| [] | 訪問一個數組或者鏈表的元素 下標 和 名字 |
| ( ) | 組織一個子表達式以改變優先級 |
| + | 加 |
| - | 減或負 |
| * | 乘 |
| / or div | 除 |
| % or mod | 取模 |
| == or eq | 測試是否相等 |
| != or ne | 測試是否不等 |
| < or lt | 測試是否小于 |
| > or gt | 測試是否大于 |
| <= or le | 測試是否小于等于 |
| >= or ge | 測試是否大于等于 |
| && and | 測試邏輯與 |
| || or | 測試邏輯或 |
| ! not | 測試取反 |
| empty | 測試是否空值 |
1.4、JSP EL隱含對象
JSP EL支持下表列出的隱含對象:
| pageScope | page 作用域 |
| requestScope | request 作用域 |
| sessionScope | session 作用域 |
| applicationScope | application 作用域 |
| param | Request 對象的參數,字符串 |
| paramValues | Request對象的參數,字符串集合 |
| header | HTTP 信息頭,字符串 |
| headerValues | HTTP 信息頭,字符串集合 |
| initParam | 上下文初始化參數 |
| cookie | Cookie值 |
| pageContext | 當前頁面的pageContext |
您可以在表達式中使用這些對象,就像使用變量一樣。接下來會給出幾個例子來更好的理解這個概念。
pageContext對象
pageContext對象是JSP中pageContext對象的引用。通過pageContext對象,您可以訪問request對象。比如,訪問request對象傳入的查詢字符串,就像這樣:
${pageContext.request.queryString}Scope對象
pageScope,requestScope,sessionScope,applicationScope變量用來訪問存儲在各個作用域層次的變量。
舉例來說,如果您需要顯式訪問在applicationScope層的box變量,可以這樣來訪問:applicationScope.box。
變量取值順序: pageScope>requestScope>sessionScope>applicationScope 。
param和paramValues對象
param和paramValues對象用來訪問參數值,通過使用request.getParameter方法和request.getParameterValues方法。
舉例來說,訪問一個名為order的參數,可以這樣使用表達式:param.order,或者{param.order},或者param.order,或者{param[“order”]}。
接下來的例子表明了如何訪問request中的username參數:
<%@ page import="java.io.*,java.util.*" %> <%String title = "Accessing Request Param"; %> <html><head><title><% out.print(title); %></title></head> <body><center><h1><% out.print(title); %></h1></center><div align="center"><p>${param["username"]}</p></div> </body> </html>param對象返回單一的字符串,而paramValues對象則返回一個字符串數組。
header和headerValues對象
header和headerValues對象用來訪問信息頭,通過使用 request.getHeader方法和request.getHeaders方法。
舉例來說,要訪問一個名為user-agent的信息頭,可以這樣使用表達式:header.user?agent,或者{header.user-agent},或者header.user?agent,或者{header[“user-agent”]}。
接下來的例子表明了如何訪問user-agent信息頭:
<%@ page import="java.io.*,java.util.*" %> <%String title = "User Agent Example"; %> <html><head><title><% out.print(title); %></title></head><body><center><h1><% out.print(title); %></h1></center><div align="center"><p>${header["user-agent"]}</p></div></body> </html>Attribute
page、request、response、application都可以通過setAttribute()來設置一個鍵值對存儲,然后EL表達式可以通過 **${鍵}**來獲取一個值。
2、連接數據庫
2.1、提前準備
注意:
你可以下載本站提供的 jar 包:
- MySQL 5 版本:mysql-connector-java-5.1.39-bin.jar
- MySQL 8 版本:mysql-connector-java-8.0.19.jar
下載后把 mysql-connector-java-<對應版本>-bin.jar 拷貝到 tomcat 下 lib 目錄。
MySQL 8.0 以上版本的數據庫連接有所不同:
- 1、com.mysql.jdbc.Driver 更換為 com.mysql.cj.jdbc.Driver。
- MySQL 8.0 以上版本不需要建立 SSL 連接的,需要顯示關閉。
- 最后還需要設置 CST。
加載驅動與連接數據庫方式如下:
<sql:setDataSource var="snapshot" driver="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://localhost:3306/RUNOOB?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8user="root" password="12345"/>2.2、測試數據
SELECT操作
接下來的這個例子告訴我們如何使用JSTL SQL標簽來運行SQL SELECT語句:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.io.*,java.util.*,java.sql.*"%> <%@ page import="javax.servlet.http.*,javax.servlet.*" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> <html><head><title>SELECT 操作</title></head> <body><!--JDBC 驅動名及數據庫 URL 數據庫的用戶名與密碼,需要根據自己的設置useUnicode=true&characterEncoding=utf-8 防止中文亂碼--><sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/RUNOOB?useUnicode=true&characterEncoding=utf-8"user="root" password="123456"/><sql:query dataSource="${snapshot}" var="result">SELECT * from websites;</sql:query><h1>JSP 數據庫實例 - 菜鳥教程</h1><table border="1" width="100%"><tr><th>ID</th><th>站點名</th><th>站點地址</th></tr><c:forEach var="row" items="${result.rows}"><tr><td><c:out value="${row.id}"/></td><td><c:out value="${row.name}"/></td><td><c:out value="${row.url}"/></td></tr></c:forEach></table> </body> </html>INSERT操作
這個例子告訴我們如何使用JSTL SQL標簽來運行SQL INSERT語句:
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <%@ page import="java.io.*,java.util.*,java.sql.*"%> <%@ page import="javax.servlet.http.*,javax.servlet.*" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> <html><head><title>SELECT 操作</title></head> <body><!--JDBC 驅動名及數據庫 URL 數據庫的用戶名與密碼,需要根據自己的設置useUnicode=true&characterEncoding=utf-8 防止中文亂碼--><sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/RUNOOB?useUnicode=true&characterEncoding=utf-8"user="root" password="123456"/><!--插入數據--><sql:update dataSource="${snapshot}" var="result">INSERT INTO websites (name,url,alexa,country) VALUES ('教程移動站', 'http://m.runoob.com', 5093, 'CN');</sql:update><sql:query dataSource="${snapshot}" var="result">SELECT * from websites;</sql:query><h1>JSP 數據庫實例 - 菜鳥教程</h1><table border="1" width="100%"><tr><th>ID</th><th>站點名</th><th>站點地址</th></tr><c:forEach var="row" items="${result.rows}"><tr><td><c:out value="${row.id}"/></td><td><c:out value="${row.name}"/></td><td><c:out value="${row.url}"/></td></tr></c:forEach></table> </body> </html>DELETE操作
這個例子告訴我們如何使用JSTL SQL標簽來運行SQL DELETE語句:
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <%@ page import="java.io.*,java.util.*,java.sql.*"%> <%@ page import="javax.servlet.http.*,javax.servlet.*" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> <html><head><title>SELECT 操作</title></head> <body> <!--JDBC 驅動名及數據庫 URL 數據庫的用戶名與密碼,需要根據自己的設置useUnicode=true&characterEncoding=utf-8 防止中文亂碼 --> <sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/RUNOOB?useUnicode=true&characterEncoding=utf-8"user="root" password="123456"/> <!--刪除 ID 為 11 的數據 --> <sql:update dataSource="${snapshot}" var="count">DELETE FROM websites WHERE Id = ?<sql:param value="${11}" /> </sql:update> <sql:query dataSource="${snapshot}" var="result">SELECT * from websites; </sql:query> <h1>JSP 數據庫實例 - 菜鳥教程</h1> <table border="1" width="100%"> <tr><th>ID</th><th>站點名</th><th>站點地址</th> </tr> <c:forEach var="row" items="${result.rows}"> <tr><td><c:out value="${row.id}"/></td><td><c:out value="${row.name}"/></td><td><c:out value="${row.url}"/></td> </tr> </c:forEach> </table> </body> </html>UPDATE操作
這個例子告訴我們如何使用JSTL SQL標簽來運行SQL UPDATE語句:
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <%@ page import="java.io.*,java.util.*,java.sql.*"%> <%@ page import="javax.servlet.http.*,javax.servlet.*" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> <html><head><title>SELECT 操作</title></head> <body> <!-- JDBC 驅動名及數據庫 URL 數據庫的用戶名與密碼,需要根據自己的設置 useUnicode=true&characterEncoding=utf-8 防止中文亂碼 --> <sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/RUNOOB?useUnicode=true&characterEncoding=utf-8"user="root" password="123456"/> <!--修改 ID 為 3 的名字:菜鳥教程改為 RUNOOB --><c:set var="SiteId" value="3"/><sql:update dataSource="${snapshot}" var="count">UPDATE websites SET name = 'RUNOOB' WHERE Id = ?<sql:param value="${SiteId}" /></sql:update><sql:query dataSource="${snapshot}" var="result">SELECT * from websites;</sql:query><h1>JSP 數據庫實例 - 教程</h1><table border="1" width="100%"><tr><th>ID</th><th>站點名</th><th>站點地址</th></tr><c:forEach var="row" items="${result.rows}"><tr><td><c:out value="${row.id}"/></td><td><c:out value="${row.name}"/></td><td><c:out value="${row.url}"/></td></tr></c:forEach></table> </body> </html>3、JavaBean
JavaBean 是特殊的 Java 類,使用 Java 語言書寫,并且遵守 JavaBean API 規范。
接下來給出的是 JavaBean 與其它 Java 類相比而言獨一無二的特征:
- 提供一個默認的無參構造函數。
- 需要被序列化并且實現了 Serializable 接口。
- 可能有一系列可讀寫屬性。
- 可能有一系列的 getter 或 setter 方法。
3.1、JavaBean 屬性
一個 JavaBean 對象的屬性應該是可訪問的。這個屬性可以是任意合法的 Java 數據類型,包括自定義 Java 類。
一個 JavaBean 對象的屬性可以是可讀寫,或只讀,或只寫。JavaBean 對象的屬性通過 JavaBean 實現類中提供的兩個方法來訪問:
| getPropertyName() | 舉例來說,如果屬性的名稱為 myName,那么這個方法的名字就要寫成 getMyName() 來讀取這個屬性。這個方法也稱為訪問器。 |
| setPropertyName() | 舉例來說,如果屬性的名稱為 myName,那么這個方法的名字就要寫成 setMyName()來寫入這個屬性。這個方法也稱為寫入器。 |
一個只讀的屬性只提供 getPropertyName() 方法,一個只寫的屬性只提供 setPropertyName() 方法。
3.2、JavaBean 程序示例
這是 StudentBean.java 文件:
package com.runoob;public class StudentsBean implements java.io.Serializable {private String firstName = null;private String lastName = null;private int age = 0;public StudentsBean() {}public String getFirstName(){return firstName;}public String getLastName(){return lastName;}public int getAge(){return age;}public void setFirstName(String firstName){this.firstName = firstName;}public void setLastName(String lastName){this.lastName = lastName;}public void setAge(int age) {this.age = age;} }3.3、訪問JavaBean
jsp:useBean 標簽可以在 JSP 中聲明一個 JavaBean,然后使用。聲明后,JavaBean 對象就成了腳本變量,可以通過腳本元素或其他自定義標簽來訪問。jsp:useBean 標簽的語法格式如下:
<jsp:useBean id="bean 的名字" scope="bean 的作用域" typeSpec/>其中,根據具體情況,scope 的值可以是 page,request,session 或 application。id值可任意只要不和同一 JSP 文件中其它 jsp:useBean 中 id 值一樣就行了。
接下來給出的是 jsp:useBean 標簽的一個簡單的用法:
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <html><head><title>useBean 實例</title></head> <body><jsp:useBean id="date" class="java.util.Date" /> <p>日期為:<%= date %> </body> </html>3.4、訪問 JavaBean 對象的屬性
在 jsp:useBean 標簽主體中使用 jsp:getProperty/ 標簽來調用 getter 方法,使用 jsp:setProperty/ 標簽來調用 setter 方法,語法格式如下:
<jsp:useBean id="id" class="bean 編譯的類" scope="bean 作用域"><jsp:setProperty name="bean 的 id" property="屬性名" value="value"/><jsp:getProperty name="bean 的 id" property="屬性名"/>........... </jsp:useBean>name屬性指的是Bean的id屬性。property屬性指的是想要調用的getter或setter方法。
接下來給出使用以上語法進行屬性訪問的一個簡單例子:
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <html> <head> <title>get 和 set 屬性實例</title> </head> <body><jsp:useBean id="students" class="com.runoob.StudentsBean"> <jsp:setProperty name="students" property="firstName" value="小強"/><jsp:setProperty name="students" property="lastName" value="王"/><jsp:setProperty name="students" property="age" value="10"/> </jsp:useBean> <p>學生名字: <jsp:getProperty name="students" property="firstName"/> </p> <p>學生姓氏: <jsp:getProperty name="students" property="lastName"/> </p> <p>學生年齡: <jsp:getProperty name="students" property="age"/> </p> </body> </html>4、JSTL
Java標準標簽庫(JSTL)是一個JSP標簽集合,它封裝了JSP應用的通用核心功能。為了實現頁面無腳本化。
JSTL支持通用的、結構化的任務,比如迭代,條件判斷,XML文檔操作,國際化標簽,SQL標簽。 除了這些,它還提供了一個框架來使用集成JSTL的自定義標簽。
根據JSTL標簽所提供的功能,可以將其分為5個類別。
- 核心標簽 core
- 格式化標簽 format
- SQL 標簽
- XML 標簽
- JSTL 函數
- 國際化 i18n
4.1、JSTL 庫安裝
Apache Tomcat安裝JSTL 庫步驟如下:
從Apache的標準標簽庫中下載的二進包(jakarta-taglibs-standard-current.zip)。
- 官方下載地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
- 本站下載地址:jakarta-taglibs-standard-1.1.2.zip
下載 jakarta-taglibs-standard-1.1.2.zip 包并解壓,將 jakarta-taglibs-standard-1.1.2/lib/ 下的兩個 jar 文件:standard.jar 和 jstl.jar 文件拷貝到 /WEB-INF/lib/ 下。
將 tld 下的需要引入的 tld 文件復制到 WEB-INF 目錄下。
接下來我們在 web.xml 文件中添加以下配置:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" 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"><jsp-config><taglib><taglib-uri>http://java.sun.com/jsp/jstl/fmt</taglib-uri><taglib-location>/WEB-INF/fmt.tld</taglib-location></taglib><taglib><taglib-uri>http://java.sun.com/jsp/jstl/fmt-rt</taglib-uri><taglib-location>/WEB-INF/fmt-rt.tld</taglib-location></taglib><taglib><taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri><taglib-location>/WEB-INF/c.tld</taglib-location></taglib><taglib><taglib-uri>http://java.sun.com/jsp/jstl/core-rt</taglib-uri><taglib-location>/WEB-INF/c-rt.tld</taglib-location></taglib><taglib><taglib-uri>http://java.sun.com/jsp/jstl/sql</taglib-uri><taglib-location>/WEB-INF/sql.tld</taglib-location></taglib><taglib><taglib-uri>http://java.sun.com/jsp/jstl/sql-rt</taglib-uri><taglib-location>/WEB-INF/sql-rt.tld</taglib-location></taglib><taglib><taglib-uri>http://java.sun.com/jsp/jstl/x</taglib-uri><taglib-location>/WEB-INF/x.tld</taglib-location></taglib><taglib><taglib-uri>http://java.sun.com/jsp/jstl/x-rt</taglib-uri><taglib-location>/WEB-INF/x-rt.tld</taglib-location></taglib></jsp-config> </web-app>使用任何庫,你必須在每個 JSP 文件中的頭部包含 **<taglib>**標簽。
4.2、核心標簽
核心標簽是最常用的 JSTL標簽。引用核心標簽庫的語法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>| <c:out> | 用于在JSP中顯示數據,就像<%= … > |
| <c:set> | 用于保存數據 |
| <c:remove> | 用于刪除數據 |
| <c:catch> | 用來處理產生錯誤的異常狀況,并且將錯誤信息儲存起來 |
| <c:if> | 與我們在一般程序中用的if一樣 |
| <c:choose> | 本身只當做<c:when>和<c:otherwise>的父標簽 代替switch |
| <c:when> | <c:choose>的子標簽,用來判斷條件是否成立 代替了case |
| <c:otherwise> | <c:choose>的子標簽,接在<c:when>標簽后,當<c:when>標簽判斷為false時被執行 代替了 default |
| <c:import> | 檢索一個絕對或相對 URL,然后將其內容暴露給頁面 |
| <c:forEach> | 基礎迭代標簽,接受多種集合類型 |
| <c:forTokens> | 根據指定的分隔符來分隔內容并迭代輸出 |
| <c:param> | 用來給包含或重定向的頁面傳遞參數 |
| <c:redirect> | 重定向至一個新的URL. |
| <c:url> | 使用可選的查詢參數來創造一個URL |
4.3、格式化標簽
JSTL格式化標簽用來格式化并輸出文本、日期、時間、數字。引用格式化標簽庫的語法如下:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>| fmt:formatNumber | 使用指定的格式或精度格式化數字 |
| fmt:parseNumber | 解析一個代表著數字,貨幣或百分比的字符串 |
| fmt:formatDate | 使用指定的風格或模式格式化日期和時間 |
| fmt:parseDate | 解析一個代表著日期或時間的字符串 |
| fmt:bundle | 綁定資源 |
| fmt:setLocale | 指定地區 |
| fmt:setBundle | 綁定資源 |
| fmt:timeZone | 指定時區 |
| fmt:setTimeZone | 指定時區 |
| fmt:message | 顯示資源配置文件信息 |
| fmt:requestEncoding | 設置request的字符編碼 |
4.4、SQL標簽
JSTL SQL標簽庫提供了與關系型數據庫(Oracle,MySQL,SQL Server等等)進行交互的標簽。引用SQL標簽庫的語法如下:
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>| sql:setDataSource | 指定數據源 |
| sql:query | 運行SQL查詢語句 |
| sql:update | 運行SQL更新語句 |
| sql:param | 將SQL語句中的參數設為指定值 |
| sql:dateParam | 將SQL語句中的日期參數設為指定的java.util.Date 對象值 |
| sql:transaction | 在共享數據庫連接中提供嵌套的數據庫行為元素,將所有語句以一個事務的形式來運行 |
4.5、JSTL函數
JSTL包含一系列標準函數,大部分是通用的字符串處理函數。引用JSTL函數庫的語法如下:
<%@ taglib prefix="fn" uri="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() | 移除首尾的空白符 |
5、JSP 異常處理
當編寫JSP程序的時候,程序員可能會遺漏一些BUG,這些BUG可能會出現在程序的任何地方。JSP代碼中通常有以下幾類異常:
- 檢查型異常:檢查型異常就是一個典型的用戶錯誤或者一個程序員無法預見的錯誤。舉例來說,如果一個文件將要被打開,但是無法找到這個文件,則一個異常被拋出。這些異常不能在編譯期被簡單地忽略。
- 運行時異常:一個運行時異常可能已經被程序員避免,這種異常在編譯期將會被忽略。
- 錯誤:錯誤不是異常,但問題是它超出了用戶或者程序員的控制范圍。錯誤通常會在代碼中被忽略,您幾乎不能拿它怎么樣。舉例來說,棧溢出錯誤。這些錯誤都會在編譯期被忽略。
本節將會給出幾個簡單而優雅的方式來處理運行時異常和錯誤。
5.1、使用Exception對象
exception對象是Throwable子類的一個實例,只在錯誤頁面中可用。下表列出了Throwable類中一些重要的方法:
| 1 | **public String getMessage()**返回異常的信息。這個信息在Throwable構造函數中被初始化 |
| 2 | **public ThrowablegetCause()**返回引起異常的原因,類型為Throwable對象 |
| 3 | **public String toString()**返回類名 |
| 4 | **public void printStackTrace()**將異常棧軌跡輸出至System.err |
| 5 | **public StackTraceElement [] getStackTrace()**以棧軌跡元素數組的形式返回異常棧軌跡 |
| 6 | **public ThrowablefillInStackTrace()**使用當前棧軌跡填充Throwable對象 |
JSP提供了可選項來為每個JSP頁面指定錯誤頁面。無論何時頁面拋出了異常,JSP容器都會自動地調用錯誤頁面。
接下來的例子為main.jsp指定了一個錯誤頁面。使用<%@page errorPage=“XXXXX”%>指令指定一個錯誤頁面。
<%@ page errorPage="ShowError.jsp" %><html> <head><title>Error Handling Example</title> </head> <body> <%// Throw an exception to invoke the error pageint x = 1;if (x == 1){throw new RuntimeException("Error condition!!!");} %> </body> </html>現在,編寫ShowError.jsp文件如下:
<%@ page isErrorPage="true" %> <html> <head> <title>Show Error Page</title> </head> <body> <h1>Opps...</h1> <p>Sorry, an error occurred.</p> <p>Here is the exception stack trace: </p> <pre> <% exception.printStackTrace(response.getWriter()); %>注意到,ShowError.jsp文件使用了<%@page isErrorPage=“true”%>指令,這個指令告訴JSP編譯器需要產生一個異常實例變量。
現在試著訪問main.jsp頁面,它將會產生如下結果:
java.lang.RuntimeException: Error condition!!! ......Opps... Sorry, an error occurred.Here is the exception stack trace:5.2、在錯誤頁面中使用JSTL標簽
可以利用JSTL標簽來編寫錯誤頁面ShowError.jsp。這個例子中的代碼與上例代碼的邏輯幾乎一樣,但是本例的代碼有更好的結構,并且能夠提供更多信息:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@page isErrorPage="true" %> <html> <head> <title>Show Error Page</title> </head> <body> <h1>Opps...</h1> <table width="100%" border="1"> <tr valign="top"> <td width="40%"><b>Error:</b></td> <td>${pageContext.exception}</td> </tr> <tr valign="top"> <td><b>URI:</b></td> <td>${pageContext.errorData.requestURI}</td> </tr> <tr valign="top"> <td><b>Status code:</b></td> <td>${pageContext.errorData.statusCode}</td> </tr> <tr valign="top"> <td><b>Stack trace:</b></td> <td> <c:forEach var="trace" items="${pageContext.exception.stackTrace}"> <p>${trace}</p> </c:forEach> </td> </tr> </table> </body> </html>運行結果如下:
5.3、使用 try…catch塊
如果您想要將異常處理放在一個頁面中,并且對不同的異常進行不同的處理,那么您就需要使用try…catch塊了。
接下來的這個例子顯示了如何使用try…catch塊,將這些代碼放在main.jsp中:
<html> <head><title>Try...Catch Example</title> </head> <body> <%try{int i = 1;i = i / 0;out.println("The answer is " + i);}catch (Exception e){out.println("An exception occurred: " + e.getMessage());} %> </body> </html>試著訪問main.jsp,它將會產生如下結果:
An exception occurred: / by zero6、JSP 國際化
在開始前,需要解釋幾個重要的概念:
- 國際化(i18n):表明一個頁面根據訪問者的語言或國家來呈現不同的翻譯版本。
- 本地化(l10n):向網站添加資源,以使它適應不同的地區和文化。比如網站的印度語版本。
- 區域:這是一個特定的區域或文化,通常認為是一個語言標志和國家標志通過下劃線連接起來。比如"en_US"代表美國英語地區。
如果想要建立一個全球化的網站,就需要關心一系列項目。本章將會詳細告訴您如何處理國際化問題,并給出了一些例子來加深理解。
JSP容器能夠根據request的locale屬性來提供正確地頁面版本。接下來給出了如何通過request對象來獲得Locale對象的語法:
java.util.Locale request.getLocale()6.1、檢測Locale
下表列舉出了Locale對象中比較重要的方法,用于檢測request對象的地區,語言,和區域。所有這些方法都會在瀏覽器中顯示國家名稱和語言名稱:
| 1 | **String getCountry()**返回國家/地區碼的英文大寫,或 ISO 3166 2-letter 格式的區域 |
| 2 | **String getDisplayCountry()**返回要顯示給用戶的國家名稱 |
| 3 | **String getLanguage()**返回語言碼的英文小寫,或ISO 639 格式的區域 |
| 4 | **String getDisplayLanguage()**返回要給用戶看的語言名稱 |
| 5 | **String getISO3Country()**返回國家名稱的3字母縮寫 |
| 6 | **String getISO3Language()**返回語言名稱的3字母縮寫 |
6.2、實例演示
這個例子告訴我們如何在JSP中顯示語言和國家:
<%@ page import="java.io.*,java.util.Locale" %> <%@ page import="javax.servlet.*,javax.servlet.http.* "%> <%//獲取客戶端本地化信息Locale locale = request.getLocale();String language = locale.getLanguage();String country = locale.getCountry(); %> <html> <head> <title>Detecting Locale</title> </head> <body> <center> <h1>Detecting Locale</h1> </center> <p align="center"> <% out.println("Language : " + language + "<br />");out.println("Country : " + country + "<br />"); %> </p> </body> </html>6.3、語言設置
JSP 可以使用西歐語言來輸出一個頁面,比如英語,西班牙語,德語,法語,意大利語等等。由此可見,設置 Content-Language 信息頭來正確顯示所有字符是很重要的。
第二點就是,需要使用 HTML 字符實體來顯示特殊字符,比如 “?” 代表的是 ?,"?"代表的是 ? :
<%@ page import="java.io.*,java.util.Locale" %> <%@ page import="javax.servlet.*,javax.servlet.http.* "%> <%// Set response content typeresponse.setContentType("text/html");// Set spanish language code.response.setHeader("Content-Language", "es");String title = "En Espa?ol"; %> <html> <head> <title><% out.print(title); %></title> </head> <body> <center> <h1><% out.print(title); %></h1> </center> <div align="center"> <p>En Espa?ol</p> <p>?Hola Mundo!</p> </div> </body> </html>6.4、區域特定日期
可以使用java.text.DateFormat類和它的靜態方法getDateTimeInstance()來格式化日期和時間。接下來的這個例子顯示了如何根據指定的區域來格式化日期和時間:
<%@ page import="java.io.*,java.util.Locale" %> <%@ page import="javax.servlet.*,javax.servlet.http.* "%> <%@ page import="java.text.DateFormat,java.util.Date" %><%String title = "Locale Specific Dates";//Get the client's LocaleLocale locale = request.getLocale( );String date = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.SHORT, locale).format(new Date( )); %> <html> <head> <title><% out.print(title); %></title> </head> <body> <center> <h1><% out.print(title); %></h1> </center> <div align="center"> <p>Local Date: <% out.print(date); %></p> </div> </body> </html>6.5、區域特定貨幣
可以使用java.text.NumberFormat類和它的靜態方法getCurrencyInstance()來格式化數字。比如在區域特定貨幣中的long型和double型。接下來的例子顯示了如何根據指定的區域來格式化貨幣:
<%@ page import="java.io.*,java.util.Locale" %> <%@ page import="javax.servlet.*,javax.servlet.http.* "%> <%@ page import="java.text.NumberFormat,java.util.Date" %><%String title = "Locale Specific Currency";//Get the client's LocaleLocale locale = request.getLocale( );NumberFormat nft = NumberFormat.getCurrencyInstance(locale);String formattedCurr = nft.format(1000000); %> <html> <head> <title><% out.print(title); %></title> </head> <body> <center> <h1><% out.print(title); %></h1> </center> <div align="center"> <p>Formatted Currency: <% out.print(formattedCurr); %></p> </div> </body> </html>6.6、區域特定百分比
可以使用java.text.NumberFormat類和它的靜態方法getPercentInstance()來格式化百分比。接下來的例子告訴我們如何根據指定的區域來格式化百分比:
<%@ page import="java.io.*,java.util.Locale" %> <%@ page import="javax.servlet.*,javax.servlet.http.* "%> <%@ page import="java.text.NumberFormat,java.util.Date" %><%String title = "Locale Specific Percentage";//Get the client's LocaleLocale locale = request.getLocale( );NumberFormat nft = NumberFormat.getPercentInstance(locale);String formattedPerc = nft.format(0.51); %> <html> <head> <title><% out.print(title); %></title> </head> <body> <center> <h1><% out.print(title); %></h1> </center> <div align="center"> <p>Formatted Percentage: <% out.print(formattedPerc); %></p> </div> </body> </html>總結
- 上一篇: xy轴坐标图数字表示_cad图纸上的X、
- 下一篇: 小米线刷 mysql_小米6刷机(线刷)