Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 18、EL表達式、JSP標簽、JSTL標簽、自定義標簽

18、EL表達式、JSP標簽、JSTL標簽、自定義標簽

編輯:關於Android編程

EL表達式

jsp的核心語法: jsp表達式 <%=%>和 jsp腳本<% %>。
以後開發jsp的原則: 盡量在jsp頁面中少寫甚至不寫java代碼。

使用EL表達式替換掉jsp表達式

EL表達式作用: 向浏覽器輸出域對象中的變量值或表達式計算的結果!!!

語法: ${變量或表達式}

EL語法

1 輸出基本數據類型變量
從四個域獲取

${name}

指定域獲取

    ${pageScope.name}

域范圍: pageScoep / requestScope / sessionScope / applicationScope

 
<% String name = "rose"; //放入域中 //pageContext.setAttribute("name",name); pageContext.setAttribute("name",name,PageContext.REQUEST_SCOPE); %> <%=name %>
<%-- 1)從四個域自動搜索 --%> EL表達式: ${name } <%-- ${name } 等價於 <%=pageContext.findAttribute("name")%> --%> <%-- 2) 從指定的域中獲取數據 --%> EL表達式: ${pageScope.name } <%-- ${pageScope.name } 等價於 <%= pageContext.getAttribute("name",PageContext.PAGE_SCOPE)%> --%>

2 輸出對象的屬性值
3 輸出集合對象 List 和Map


<%-- 1)EL輸出對象的屬性 --%> <% //保存數據 Student student = new Student("eric",20); //放入域中 pageContext.setAttribute("student",student); //List List list = new ArrayList(); list.add(new Student("rose",18)); list.add(new Student("jack",28)); list.add(new Student("lucy",38)); //放入域中 pageContext.setAttribute("list",list); //Map Map map = new HashMap(); map.put("100",new Student("mark",20)); map.put("101",new Student("maxwell",30)); map.put("102",new Student("narci",40)); //放入域中 pageContext.setAttribute("map",map); %> <%--使用EL獲取對象 --%> ${student.name} - ${student.age } <%-- ${student.name} 等價於 (點相對於調用getXX()方法) <%=((Student)pageContext.findAttribute("student")).getName()%> --%>

<%--使用EL獲取List對象 --%> ${list[0].name } - ${list[0].age }
${list[1].name } - ${list[1].age }
${list[2].name } - ${list[2].age } <%-- list[0]等價於 (中括號相對於調用get(參數)方法) ((List)pageContext.findAttribute("list")).get(0) --%>
<%--使用EL獲取Map對象 --%> ${map['100'].name } - ${map['100'].age }
${map['101'].name } - ${map['101'].age }
${map['102'].name } - ${map['102'].age }

4 EL表達式計算

 
<%-- 1)算術表達式 + - * / --%> ${10+5 }
${10*5 }

<%-- 2)比較運算 > < >= <= == != --%> ${10>5 }
${10<5 }
${10!=10 }

<%-- 3)邏輯運算 && || ! --%> ${true && false }
${true || false }
${!false }


<%-- 4)判空 null 或 空字符串: empty --%> <% //String name = "eric"; //String name = null; String name = ""; pageContext.setAttribute("name",name); %> 判斷null: ${name==null }
判斷空字符: ${name=="" }
判空: ${name==null || name=="" } 另一種判空寫法: ${empty name }

jsp標簽

jsp標簽作用:替換jsp腳本。

1)流程判斷(if   for循環)
2)跳轉頁面(轉發,重定向)
3)。。。。。

Jsp標簽分類

1)內置標簽(動作標簽): 不需要在jsp頁面導入標簽
2)jstl標簽: 需要在jsp頁面中導入標簽
3)自定義標簽 : 開發者自行定義,需要在jsp頁面導入標簽

動作標簽

轉發標簽:  
參數標簽:  
包含標簽:  

原理: 包含與被包含的頁面先各自翻譯成java源文件,然後再運行時合並在一起。(先翻譯再合並),動態包含

靜態包含 vs 動態包含的區別:

1) 語法不同
靜態包含語法: <%@inclue file="被包含的頁面"%>
動態包含語法: 

2)參數傳遞不同
靜態包含不能向被包含頁面傳遞參數
動態包含可以向被包含頁面傳遞參數

3)原理不同
靜態包含: 先合並再翻譯
動態包含: 先翻譯再合並
  
<%--轉發 --%> <% //request.getRequestDispatcher("/09.action2.jsp?name=eric").forward(request,response); %> <%-- 參數 --%> <%-- --%> <%--包含 --%> <%-- --%> <%@include file="common/header.jsp" %> 主頁的內容

JSTL標簽

JSTL (全名:java standard tag libarary - java標准標簽庫 )

核心標簽庫 (c標簽庫) 天天用
國際化標簽(fmt標簽庫)
EL函數庫(fn函數庫)
xml標簽庫(x標簽庫)
sql標簽庫(sql標簽庫)      

使用JSTL標簽步驟

1) 導入jstl支持的jar包(標簽背後隱藏的java代碼)
        注意:使用javaee5.0的項目自動導入jstl支持jar包
2)使用taglib指令導入標簽庫 
                <%@taglib uri="tld文件的uri名稱" prefix="簡寫" %>
3)在jsp中使用標簽     

核心標簽庫的重點標簽:

保存數據:
         
獲取數據: 
      
單條件判斷
      
多條件判斷
      
      
      
循環數據
      
      
重定向
      
<%@ page language="java" import="java.util.*,gz.itcast.b_entity.*" pageEncoding="utf-8"%>
<%--導入標簽庫 --%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%--使用標簽 --%> <%--set標簽 :保存數據(保存到域中)默認保存到page域 --%> <% String msg = null; pageContext.setAttribute("msg",msg); %> ${msg }
<%--out標簽: 獲取數據(從域中) default: 當value值為null時,使用默認值 escapeXml: 是否對value值進行轉義,false,不轉義,true,轉義(默認) --%>

<%--if標簽 :單條件判斷--%> 條件成立
<%--choose標簽+when標簽+otherwirse標簽: 多條件判斷 --%> 優秀 良好 一般 及格 不及格 <%-- forEach標簽:循環 --%> <% //List List list = new ArrayList(); list.add(new Student("rose",18)); list.add(new Student("jack",28)); list.add(new Student("lucy",38)); //放入域中 pageContext.setAttribute("list",list); //Map Map map = new HashMap(); map.put("100",new Student("mark",20)); map.put("101",new Student("maxwell",30)); map.put("102",new Student("narci",40)); //放入域中 pageContext.setAttribute("map",map); %>
<%-- begin="" : 從哪個元素開始遍歷,從0開始.默認從0開始 end="": 到哪個元素結束。默認到最後一個元素 step="" : 步長 (每次加幾) ,默認1 items="": 需要遍歷的數據(集合) var="": 每個元素的名稱 varStatus="": 當前正在遍歷元素的狀態對象。(count屬性:當前位置,從1開始) --%> 序號:${varSta.count} - 姓名:${student.name } - 年齡:${student.age}

${entry.key } - 姓名: ${entry.value.name } - 年齡:${entry.value.age }

<%-- forToken標簽: 循環特殊字符串 --%> <% String str = "java-php-net-平面"; pageContext.setAttribute("str",str); %> ${s }
<%--redrict:重定向 --%>

自定義標簽

1 編寫一個普通的java類,繼承SimpleTagSupport類,叫標簽處理器類

/**
 * 標簽處理器類
 * @author APPle
 * 1)繼承SimpleTagSupport
 *
 */
public class ShowIpTag extends SimpleTagSupport{
    private JspContext context;

    /**
     * 傳入pageContext
     */
    @Override
    public void setJspContext(JspContext pc) {
        this.context = pc;
    }

    /**
     * 2)覆蓋doTag方法
     */
    @Override
    public void doTag() throws JspException, IOException {
        //向浏覽器輸出客戶的ip地址
        PageContext pageContext = (PageContext)context;

        HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();

        String ip = request.getRemoteHost();

        JspWriter out = pageContext.getOut();

        out.write("使用自定義標簽輸出客戶的IP地址:"+ip);

    }
}

2 在web項目的WEB-INF目錄下建立itcast.tld文件,這個tld叫標簽庫的聲明文件。(參考核心標簽庫的tld文件)




  
  1.1
  
  itcast
  
  http://gz.itcast.cn

  
  
    
    showIp
    
    gz.itcast.a_tag.ShowIpTag
    
    scriptless
  


3 在jsp頁面的頭部導入自定義標簽庫

<%@taglib uri="http://gz.itcast.cn" prefix="itcast"%>

4 在jsp中使用自定義標簽


執行過程

問題: http://localhost:8080/day14/01.hellotag.jsp 如何訪問到自定義標簽?

前提: tomcat服務器啟動時,加載到每個web應用,加載每個web應用的WEB-INF目錄下的所有文件!!!例如。web.xml, tld文件!!!

1)訪問01.hellotag.jsp資源
2)tomcat服務器把jsp文件翻譯成java源文件->編譯class->構造類對象->調用_jspService()方法
3)檢查jsp文件的taglib指令,是否存在一個名為http://gz.itcast.cn的tld文件。如果沒有,則報錯
4)上一步已經讀到itcast.tld文件
5)讀到 到itcast.tld文件中查詢是否存在為showIp的標簽
6)找到對應的標簽,則讀到內容
7)得到 gz.itcast.a_tag.ShowIpTag

構造ShowIpTag對象,然後調用ShowIpTag裡面的方法

自定義標簽處理器類的生命周期

SimpleTag接口:

void setJspContext(JspContext pc)  --設置pageContext對象,
    傳入pageContext(一定調用)通過getJspCotext()方法得到pageContext對象

void setParent(JspTag parent)  --設置父標簽對象,傳入父標簽對象,
    如果沒有父標簽,則不調用此方法。通過getParent()方法得到父標簽對象。
void setXXX(值)  --設置屬性值。
void setJspBody(JspFragment jspBody) --設置標簽體內容。標簽體內容封裝到JspFragment對象中,然後傳入JspFragment對象。
    通過getJspBody()方法得到標簽體內容。如果沒有標簽體內容,則不會調用此方法
void doTag()  --執行標簽時調用的方法。(一定調用)

自定義標簽的作用:

控制是否輸出標簽體內容

輸出: this.getJspBody().invoke(null)  
不輸出:  不調用invoke(null)方法

控制標簽余下內容是否輸出

輸出: 什麼不都做!
不輸出: 拋出SkipPageException異常

重復輸出標簽體內容

重復調用: this.getJspBody().invoke(null)

修改標簽體內容

StringWriter sw = new StringWriter();
this.getJspBody().invoke(sw);
String content = sw.toString();
//修改內容
//手動輸出到浏覽器
this.getJspContext().getOut().writer(修改過的內容);

帶屬性的標簽

a)在標簽處理器類中聲明成員變量和setter方法,用於給屬性變量賦值。
b)在tld文件中聲明屬性
c)使用屬性

輸出標簽體內容格式

JSP:   在傳統標簽中使用的。可以寫和執行jsp的java代碼。
scriptless:  標簽體不可以寫jsp的java代碼
empty:    必須是空標簽。
tagdependent : 標簽體內容可以寫jsp的java代碼,但不會執行。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved