編寫無Java腳本的JSP頁面


在上一章中總結了Web開發中應用MVC架構模式,將Servlet 用做控制器,JSP作為視圖,JavaBean作為模型,實現業務流程控制,頁面邏輯和業務邏輯的分離。然而,使用前面的技術實現MVC,並不是最完美的。

在當代的一個最佳的JavaWeb開發實踐就是在MVC架構模式中,中和使用JavaBean,EL(expression language),JSP自定義標記庫以及JSP標准標記庫JSTL,編寫無java腳本的JSP頁面。

一 JSP表達式語言EL

 在使用基於MVC架構模式的Web應用開發中,我們使用Servlet解析用戶的請求,調用業務邏輯或數據訪問代碼,將得到的結果放入Bean中,然后將Bean出處在請求,會話或Servlet上下文中。最后將請求轉發給JSP頁面。JSP頁面通過標准動作jsp:getProperty,和jsp:useBean得到儲存在作用域中的Bean屬性數據,顯示在頁面上。我們使用EL就是在最后的步驟不一樣。我們不在使用jsp:getProperty和jsp:useBean。不同之處看看下面的案例。

有兩個示例的JavaBean,Person和Dog。 Person有一個字符串類型的userName屬性,同時有一個Dog類型的dogName屬性。Dog有一個字符串類型的name屬性。

我們取出人的名字,和dog的名字。

Dog

 1 package com.cy.bean;
 2 
 3 import java.io.Serializable;
 4 
 5 public class Dog  implements Serializable{
 6     private String name;
 7 
 8     public String getName() {
 9         return name;
10     }
11 
12     public void setName(String name) {
13         this.name = name;
14     }
15     
16 
17 }

Person 

 1 package com.cy.bean;
 2 
 3 import java.io.Serializable;
 4 
 5 public class Person implements Serializable {
 6    private String userName;
 7    private Dog dogName;
 8    
 9 public String getUserName() {
10     return userName;
11 }
12 public void setUserName(String userName) {
13     this.userName = userName;
14 }
15 public Dog getDogName() {
16     return dogName;
17 }
18 public void setDogName(Dog dogName) {
19     this.dogName = dogName;
20 }
21    
22 }

 

 編寫一個Servlet作為控制器,在控制器中創建Person實例。將請求轉發到.jsp頁面。

 1 package com.cy.servlet;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 
10 import com.cy.bean.Dog;
11 import com.cy.bean.Person;
12 
13 public class MyDog extends HttpServlet{
14     private static final long serialVersionUID = 1L;
15 
16     @Override
17     protected void doGet(HttpServletRequest req, HttpServletResponse resp)
18             throws ServletException, IOException {
19         
20         resp.setCharacterEncoding("utf-8");
21         resp.setContentType("text/html;charset=utf-8");
22         
23         Person p= new Person();
24         p.setUserName("小明");
25         Dog d=new Dog();
26         d.setName("小狗狗");        
27         p.setDogName(d);        
28         req.setAttribute("person", p);
29         
30         req.getRequestDispatcher("/jsp/myDog.jsp").forward(req, resp);
31         
32         
33     }
34 
35     @Override
36     protected void doPost(HttpServletRequest req, HttpServletResponse resp)
37             throws ServletException, IOException {
38         doGet(req, resp);
39     }
40     
41 
42 }

 

 在web.xml中配置servlet

1   <servlet>
2     <servlet-name>mydog</servlet-name>
3     <servlet-class>com.cy.servlet.MyDog</servlet-class> 
4   </servlet> 
5   <servlet-mapping>
6    <servlet-name>mydog</servlet-name>
7    <url-pattern>/mydog</url-pattern>  
8   </servlet-mapping>

 

作為視圖的jsp頁面;

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6 
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11     
12     <title>My JSP 'myDog.jsp' starting page</title>
13     
14     <meta http-equiv="pragma" content="no-cache">
15     <meta http-equiv="cache-control" content="no-cache">
16     <meta http-equiv="expires" content="0">    
17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18     <meta http-equiv="description" content="This is my page">
19     <!--
20     <link rel="stylesheet" type="text/css" href="styles.css">
21     -->
22 
23   </head>
24   
25   <body>
26  <jsp:useBean id="person" type="com.cy.bean.Person" scope="request"></jsp:useBean> 
27   主人:<jsp:getProperty property="userName" name="person"/><br/>
28   寵物:<jsp:getProperty property="dogName" name="person"/><br/>
29   </body>
30 </html>

 

得出來的結果卻是:

 

因為:person的屬性dogName是個對象,而<jsp:getProperty>的Property屬性只能訪問Bean的屬性,而不能訪問嵌套的屬性。

解決方案就是JSP EL(即表達式語言 Expression Language)

我們使用EL

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6 
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11     
12     <title>My JSP 'myDog.jsp' starting page</title>
13     
14     <meta http-equiv="pragma" content="no-cache">
15     <meta http-equiv="cache-control" content="no-cache">
16     <meta http-equiv="expires" content="0">    
17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18     <meta http-equiv="description" content="This is my page">
19     <!--
20     <link rel="stylesheet" type="text/css" href="styles.css">
21     -->
22 
23   </head>
24   
25   <body>
26  
27     主人:  ${person.userName}
28      寵物:   ${person.dogName.name } 
29   </body>
30 </html>

 

結果:

1.1 EL表達式和JSP腳本表達式

EL表達式形式:${ }

${person.userName}     ${userName}

JSP表達式形式:<%= userName%>

 

一個<div>元素的style屬性的代碼:

JSP表達式設置: 1 <div style=<%=mystyle%>>hello</div> 

EL表達式設置: 1 <div style=${mystyle} >hello</div> 

 

EL表達式不能在腳本中定義變量

JSP中定義一個變量,只需要用<%! int num=10%>

num的值:<%=num%>   值為10;

num的值:${num}     返回一個未定義的值;

1.2在EL表達式中使用隱式變量

類別

隱式變量名

描述

JSP

pageContext

用來訪問JSP的隱式對象

作用域

pageScope

與page作用域屬性的名稱和值相關聯的 Map 類

requestScope

與request作用域屬性的名稱和值相關聯的 Map 類

sessionScope

與session作用域屬性的名稱和值相關聯的 Map 類

applicationScope

與application作用域屬性的名稱和值相關聯的 Map 類

請求參數

param

包含請求參數字符串的Map 類

paramValues

包含請求參數字符串數組( String[])的 Map 類

請求頭

header

包含請求頭字符串的 Map 類

headerValues

包含請求頭字符串數組(String[])的 Map 類

Cookie

cookie

按名稱存儲請求附帶的 cookie 的 Map 類

 注意:pageScope,requestScope,sessionScope,applicationScope這些變量並沒有直接賦予我們在EL中直接訪問真正的page,ServletRequset,HttpSession以及ServeltContext的權利,他們返回的只是一個分別與page作用域,request作用域,session作用域,application作用域有關的屬性名和值的Map對象。

當容器解析EL表達式中的變量時,例如${x}中的x,容器首先檢查隱式變量。如果隱式變量中找不到x,他將依次查找page,request,session,application范圍的屬性,如果還找不到x,則返回null。

測試EL表達式中是個隱式變量

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%@ taglib prefix="juxing" uri="http://function/getJuXing" %>
 3 <%
 4 String path = request.getContextPath();
 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 6 %>
 7 
 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 9 <html>
10   <head>
11     <base href="<%=basePath%>">
12     
13     <title>隱式變量</title>
14     <meta http-equiv="pragma" content="no-cache">
15     <meta http-equiv="cache-control" content="no-cache">
16     <meta http-equiv="expires" content="0">    
17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18     <meta http-equiv="description" content="This is my page">
19     <!--
20     <link rel="stylesheet" type="text/css" href="styles.css">
21     -->
22   </head>
23   
24   <body>
25   <br/>---------------- 1 pageContext對象   :獲取JSP頁面中的pageContext對象---------------------- <br/> 
26     ${pageContext}<br/>
27     
28   <br/>---------------- 2  pageScope對象  :從page域(pageScope)中查找數據--------------------------<br/>
29     <% pageContext.setAttribute("name","kitty");%>  <!-- map -->
30     ${pageScope.name}<br/>
31     
32     <br/>---------------3 requestScope對象:從request域(requestScope)中獲取數據------------------------<br/>
33     <% request.setAttribute("name", "kitty1"); %> <!-- map -->
34     ${requestScope.name}<br/>
35     
36     <br/>---------------4 sessionScope對象:從session域(sessionScope)中獲取數據------------------------<br/>
37     <%session.setAttribute("name", "kitty2"); %>  <!-- map -->
38     ${sessionScope.name}<br/>
39     
40     <br/>---------------5 applicationScope對象:從application域(applicationScope)中獲取數據------------------------<br/>
41     <%application.setAttribute("name", "kitty3"); %><!-- map -->
42     ${applicationScope.name}<br/>
43     
44      <br/>--------------6  param對象:獲得用於保存請求參數map,並從map中獲取數據------------------------<br/>
45      <br/>--------------7  paramValues對象:paramValues獲得請求參數 ------------------------<br/>    
46     param或paramValues變量使我們可以獲取ServletRequest中傳遞過來的參數值。<br/>
47     param相當於是使用參數名,調用getParameter(String name)后 得到的結果。<br/>
48     paramValues是使用getParameter(String[] name)方法所返回的指定參數名的數組值<br/>
49     
50      <br/>--------------8 header對象:header獲得請求頭------------------------<br/>
51      ${header.Accept}<br/>
52      
53    <br/>--------------9 headerValues對象:headerValues獲得請求頭的值------------------------<br/>
54       <%--headerValues表示一個保存了所有http請求頭字段的Map對象,它對於某個請求參數,返回的是一個string[]數組 
55            例如:headerValues.Accept返回的是一個string[]數組 ,headerValues.Accept[0]取出數組中的第一個值
56            --%>
57            
58     ${headerValues.Accept[0]}<br/>
59      <br/>--------------10、cookie對象:cookie對象獲取客戶機提交的cookie------------------------<br/>
60         <!-- 從cookie隱式對象中根據名稱獲取到的是cookie對象,要想獲取值,還需要.value -->
61     ${cookie.JSESSIONID.value}  //保存所有cookie的map
62   </body>
63   </html>

 

結果:

 

1.3 EL運算符

運算符可以分為四類:屬性和集合訪問運算符,算術運算符,關系運算符,邏輯運算符。

  1.3.1用於訪問屬性和集合的EL運算符

  屬性訪問運算符是我們可以訪問對象的成員,集合訪問運算符可以返回Map,List 或Array中的元素。

  1.3.2 EL算數,關系,邏輯運算符

  1.3.2.1 算術運算符就是加減乘除取模;

  1.3.2.2 關系運算符

 

  1.3.2.3 邏輯運算符

 

  1.3.2.4 其他

empty運算符:檢查對象是否為null(空)

二元表達式:${user!=null?user.name :""}

 

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6 
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11     
12     <title>運算符</title>
13     
14     <meta http-equiv="pragma" content="no-cache">
15     <meta http-equiv="cache-control" content="no-cache">
16     <meta http-equiv="expires" content="0">    
17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18     <meta http-equiv="description" content="This is my page">
19     <!--
20     <link rel="stylesheet" type="text/css" href="styles.css">
21     -->
22 
23   </head>
24   
25   <body>
26    <br/>--------------------用於訪問屬性和集合的EL運算符----------------<br/>
27   <%
28      Map<String,String> map = new LinkedHashMap<String,String>();
29          map.put("a","aaaaxxx");
30          map.put("b","bbbb");
31          map.put("c","cccc");
32          map.put("1","aaaa1111");
33          request.setAttribute("map",map);
34    %>
35    ${map.a}<br/>
36    ${map.b}<br/>
37    ${map["1"]}<br/>
38   
39     <br/>--------------------算術運算符----------------<br/>
40    5+5= ${5+5}<br/>
41    5-5= ${5-5}<br/>
42    5*5= ${5*5}<br/>
43    5/5= ${5/5}<br/><%-- ${5div5} --%>
44    5%3= ${5%3}<br/><%-- ${5mod3} --%>
45    <br/>--------------------關系運算符----------------<br/>
46    ${5==5} <br/>
47    ${5!=6} <br/>
48    ${5<=5} <br/><%-- ${5 le 6} --%>
49    ${5< 6} <br/><%--  ${5 lt 6} --%>
50    ${5>=5} <br/><%-- ${5 ge 6} --%>
51    ${5> 4} <br/> <%-- ${5 gt 6} --%>   
52    <br/>--------------------是否為空----------------<br/>
53    <%
54        List<String> list = new ArrayList<String>();
55          list.add("1111");
56          list.add("222");
57          request.setAttribute("list",list);
58     %>
59     ${empty(list)}
60    <br/>--------------------條件運算----------------<br/>
61    ${3==5?3:5}
62    
63   </body>
64 </html>

 

 

 結果顯示:

 

 

1.4 函數

EL函數使用起來比較復雜,但是他為JSP提供了完全的業務邏輯和表現邏輯分離。

使用EL函數的步驟
–方法類(.java):包含需要在JSP中使用的Java方法;
–標記庫描述文件(*.tld):映射每個Java方法到XML函數名;
–部署描述文件(web.xml):映射TLD到標記庫URI

JSP頁面(*.jsp):使用標記庫URI和函數名調用方法

示例:打印個矩形方法。

Rectangle

1.4.1 創建靜態方法

Rectangle.java
 1 package com.cy.functionn;
 2 
 3 public class Rectangle{
 4     /*方法必須被聲明為public和static,而方法所屬的類必須聲明為public。這樣Servlet就可以直接訪問該類及其方法,而不用創建一個新對象*/
 5     /*方法的參數和返回值必須在EL中是有效的。*/
 6     /*類文件一般保存在/WEB-INF/下*/
 7     public static String getRectangle(int clos,int rows){
 8         StringBuffer sb=new StringBuffer();
 9         for(int i=0;i<clos;i++){
10             for(int j=0;j<rows;j++){
11                 sb.append("*");
12             }
13             sb.append("<br/>");
14         }
15         return sb.toString();        
16     }
17 
18 }

 

 

1.4.2 創建標記庫描述文件(TLD)

function.tld 

Rectangle
 1 <!--TLD的目標是講靜態方法映射到可以在JSP中使用的函數名,這是必須的,因為EL中不允許直接調用java方法 -->
 2 <taglib xmlns="http://java.sun.com.xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://java.sun.com.xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
 4     version="2.0">
 5 
 6     <tlib-version>1.0 </tlib-version>
 7     <function>
 8         <name>aaa</name><!-- 定義要在JSP中使用的函數名 -->
 9         <function-class>com.cy.functionn.Rectangle</function-class><!-- 定義方法所在的類的全名 -->
10         <function-signature>java.lang.String getRectangle(int,int)</function-signature><!--定義靜態方法及其參數和返回值的全數據類型  -->
11     </function>
12 
13 </taglib>

 

1.4.3 更改部署描述文件

1

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
 3   <display-name>EL</display-name>
 4   <welcome-file-list>
 5     <welcome-file>index.html</welcome-file>
 6     <welcome-file>index.htm</welcome-file>
 7     <welcome-file>index.jsp</welcome-file>
 8     <welcome-file>default.html</welcome-file>
 9     <welcome-file>default.htm</welcome-file>
10     <welcome-file>default.jsp</welcome-file>
11   </welcome-file-list>
12   
13   <jsp-config>
14     <taglib>
15       <taglib-uri>http://function/getRectangle</taglib-uri><!-- 定義用於 Servlet, JSP要訪問的路徑-->
16       <taglib-location>/WEB-INF/tld/function.tld</taglib-location><!-- 定義標記庫描述文件的上下路徑 -->
17     </taglib>
18   </jsp-config>
19  
20 </web-app>

 

 

1.4.4 在JSP內訪問EL函數

1

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <!-- 使用taglib指令訪問TLD,並用一個前綴代表該標記庫。使用TLD前綴和函數名創建一個EL表達式。
 3  prefix:定義前綴
 4  uri:定義路徑與taglib-uri相同
 5  -->
 6 <%@ taglib prefix="myFun" uri="http://function/getRectangle"%>
 7 <%
 8 String path = request.getContextPath();
 9 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
10 %>
11 
12 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
13 <html>
14   <head>
15     <base href="<%=basePath%>">
16     
17     <title>My JSP 'MyJsp.jsp' starting page</title>
18     
19     <meta http-equiv="pragma" content="no-cache">
20     <meta http-equiv="cache-control" content="no-cache">
21     <meta http-equiv="expires" content="0">    
22     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
23     <meta http-equiv="description" content="This is my page">
24     <!--
25     <link rel="stylesheet" type="text/css" href="styles.css">
26     -->
27 
28   </head> 
29   <body>
30     <pre>${myFun:aaa(6,10)}</pre>
31   </body>
32 </html>

 

 

 

 

二 JSP自定義標記庫與標准標記庫JSTL

 JSTL(JSP標准標准庫,JavaServlet Page Standard Tag Liabary)

jstl規范是SUN JCP指定的一個官方java規范請求(JSR).

                                 JSTL標准標記庫

功能范圍

作用

URI

前綴

核心(core)

一般用途處理的標記

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

c

xml

解析、選擇、轉換XML數據的標記

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

x

數據庫(sql)

訪問關系型數據庫的標記

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

sql

國際化(I18N)

為國際化應用格式化數據的標記

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

fmt

函數(Functions)

處理字符串和集合的標記

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

fn

我們最常用的是核心標記庫。

為了給JSP提供JSTL能力,我們需要兩個JAR文件。第一個文件是jstl.jar,他為JSTL標記庫提供API類。

第二個文件是standard.jar,他提供了標記庫的實現類。我們需要把這兩個文件復制到我們自己的應用程序的WEB-INF下的lib目錄。

我們需要在JSP中通過taglib指令引用標記庫。

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

2.1 通用標記

<c:catch > ,<c:out>

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 3 <%
 4 String path = request.getContextPath();
 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 6 %>
 7 
 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 9 <html>
10   <head>
11     <base href="<%=basePath%>">
12     
13     <title>My JSP 'jstl.jsp' starting page</title>
14     
15     <meta http-equiv="pragma" content="no-cache">
16     <meta http-equiv="cache-control" content="no-cache">
17     <meta http-equiv="expires" content="0">    
18     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
19     <meta http-equiv="description" content="This is my page">
20     <!--
21     <link rel="stylesheet" type="text/css" href="styles.css">
22     -->
23   </head> 
24   <body>  
25   <%--  標記<c:catch>允許我們在jsp中不需要錯誤頁面捕獲程序錯誤。標記<c:out>與JSP腳本表達式類似,用於顯示內容  --%>
26   <c:catch var="a">
27              會拋異常的代碼  ,異常的值會存儲在頁面范圍變量a中。<br/>
28   </c:catch> 
29   <c:out value=""></c:out>
30 如----------------------------:<br/>
31     <c:catch var="e">
32     ${"1aaa"+1}  <!-- 會拋異常的代碼 -->
33     </c:catch>
34      <c:out value="e"></c:out><br/>
35      <c:out value="${e}"></c:out> <br/> 
36   </body>
37 </html>

 

 顯示:

 

2.2 變量支持標記

1<c:set>:用於設置變量和對象的值;

2<c:remove>:用於講一個變量從其作用域中刪除;

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 3 <%
 4 String path = request.getContextPath();
 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 6 %>
 7 
 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 9 <html>
10   <head>
11     <base href="<%=basePath%>">
12     
13     <title>My JSP 'jstl.jsp' starting page</title>
14     
15     <meta http-equiv="pragma" content="no-cache">
16     <meta http-equiv="cache-control" content="no-cache">
17     <meta http-equiv="expires" content="0">    
18     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
19     <meta http-equiv="description" content="This is my page">
20     <!--
21     <link rel="stylesheet" type="text/css" href="styles.css">
22     -->
23   </head> 
24   <body>  
25     <c:set var ="num"> ${8*7} </c:set>   
26     <c:set var ="num" value="${8*7}"></c:set>
27   <% Map<String,String> map = new LinkedHashMap<String,String>();
28          map.put("a","aaaaxxx");
29          map.put("b","bbbb");
30          request.setAttribute("map",map);
31           %> 
32           <!-- 用於javabean和map對象 -->
33     <c:set target="${map}" property="a"> 狗狗</c:set>   
34     ${map.a} <br/>  
35     <c:set target="${map}" property="b" value="小狗狗"></c:set>  
36     ${map.b} <br/>    
37     ${num}<br/>
38     remove標記不用於javaBean和Map對象<br/> 
39    <c:remove var="num" scope="page"/>  
40     ${num}<br/> 
41   </body>
42 </html>

 

 

2.3 流程控制

 

2.3.1 JSTL條件處理

 

2.3.2 循環

 

1 <c:if> <c:choose>條件處理

2 <c:forEach><c:forTokens> 循環

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
 3 <%
 4     String path = request.getContextPath();
 5     String basePath = request.getScheme() + "://"
 6             + request.getServerName() + ":" + request.getServerPort()
 7             + path + "/";
 8 %>
 9 
10 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
11 <html>
12 <head>
13 <base href="<%=basePath%>">
14 
15 <title>My JSP 'jstl.jsp' starting page</title>
16 
17 <meta http-equiv="pragma" content="no-cache">
18 <meta http-equiv="cache-control" content="no-cache">
19 <meta http-equiv="expires" content="0">
20 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
21 <meta http-equiv="description" content="This is my page">
22 <!--
23     <link rel="stylesheet" type="text/css" href="styles.css">
24     -->
25 </head>
26 <body>
27 
28     test:設置布爾表達式,true,false.
29     <br />
30     <c:if test="${9==9}">
31                你好!<br />
32     </c:if>
33     <c:choose>
34         <c:when test="${5!=5}">
35                         錯誤<br />
36         </c:when>
37 
38         <c:when test="${5==5}">
39               正確1<br />
40         </c:when>
41 
42         <c:when test="${5!=5}">
43                 正確2<br />
44         </c:when>
45 
46     </c:choose>
47 
48     x:變量 begin:起始值 end:結束值 step:間隔值
49     <c:forEach var="x" begin="0" end="10" step="3">
50       ${x}
51     </c:forEach>
52     <br />
53 
54     <c:set var="str" value="hello,world,kitty"></c:set>
55     items:要處理的用分隔符分隔的字符串對象; delims:指定分隔符
56     <c:forTokens var="bl" items="${str}" delims=",">
57      ${bl}
58    </c:forTokens>
59 
60 </body>
61 </html>

 

 

2.4 用JSTL訪問URL信息

2.4.1 <c:url> 重寫URL並對其參數編碼

2.4.2 <c:import> 訪問Web應用程序之外的內容

2.4.3 <c:redirect> 重定向到不同的URL

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM