日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Java Web之自定义JSP标签

發布時間:2023/12/8 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java Web之自定义JSP标签 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java Web之自定義JSP標簽
write:2022-5-7

上文:Java Web之使用過濾器,
前面我們學習了JSP自帶的標簽:Java web之JSP技術詳解,但自帶標簽數量有限,從JSP1.1開始出現了自定義JSP標簽技術,允許用戶創建客戶化的標簽,從而完成特定需求的功能。

文章目錄

  • 1. 理解自定義JSP標簽的作用
  • 2. 掌握創建并運用自定義JSP標簽的步驟
  • 3. 了解JSP Tag API
    • 3.1 標簽的處理類
    • 3.2 TagSupport類
    • 3.3 PageContext類
    • 3.4 doStartTag()方法的返回值
    • 3.5 doEndTag()方法的返回值
    • 3.6 用戶自定義的標簽屬性
  • 4. Servlet容器處理自定義標簽的流程
    • 4.1 范例1:創建hello標簽
    • 4.2 范例2:創建message標簽
  • 5. 練習題

1. 理解自定義JSP標簽的作用

自定義JSP標簽技術是在JSP 1.1版本中才出現的,它支持用戶在JSP文件中自定義標簽,這樣可以使JSP代碼更加簡潔。
自定義標簽是可重用的
自定義標簽能處理復雜的邏輯運算和事務,或者定義JSP網頁的輸出內容和格式。

2. 掌握創建并運用自定義JSP標簽的步驟

因為自定義的JSP標簽可以被重復使用,因此創建自定義JSP標簽和在JSP文件中使用自定義JSP標簽是獨立的;

  • 創建自定義JSP標簽
    (1)創建標簽的處理類(決定標簽完成的功能)
    (2)創建XML格式的標簽庫描述文件
  • 在JSP文件中使用自定義JSP標簽
    (1)在web.xml文件中聲明所引用的自定義標簽所在的標簽庫(標簽庫:組織和管理一組功能相關的標簽)
    (2)在JSP文件中引入標簽庫,然后插入標簽,例如:< mm:hello/>
  • 3. 了解JSP Tag API

    3.1 標簽的處理類

    Servlet容器執行JSP文件時,如果遇到自定義標簽,就會調用這個標簽的處理類。

    標簽處理類必須擴展以下兩個類之一
    javax.servlet.jsp.TagSupport或者javax.servlet.jsp.BodyTagSupport
    下面主要結束如何擴展TagSupport類

    3.2 TagSupport類

  • TagSupport類的主要方法
    doStartTag():Servlet容器遇到自定義標簽的起始標志(即:<)時調用該方法
    doEndTag():Servlet容器遇到自定義標簽的結束標志(即:/>)時調用該方法
    setValue(String k,Object o):在標簽處理類中設置key/value
    getValue(String k): 在標簽處理類中根據參數key返回匹配的value
    removeValue(String k):在標簽處理類中刪除key/value
  • TagSupport類的兩個重要屬性
    (1)兩個屬性
    parent:引用嵌套了當前標簽的上層標簽(父標簽)的處理類對象
    pageContext:引用當前JSP頁面的javax.servlet.jsp.PageContext對象
    (2)與屬性對應的方法
    setPageContext(PageContext pc):設置PageContext對象,該方法由Servlet容器在調用doStartTag或doEndTag方法前調用
    setParent(Tag t):設置嵌套了當前標簽的上層標簽的處理類,該方法由Servlet容器在調用doStartTag()方法前調用
    getParent():返回嵌套了當前標簽的上層標簽的處理類對象
  • Servlet容器在調用doStartTag() 方法前,會先調用setPageContext()和setParent()方法,設置pageContext和parent屬性。

    parent屬性是private類型的,在doStartTag()或doEndTag()方法中可以通過getParent()方法獲取上層父標簽的處理類對象;
    在TagSupport類中定義了protected類型的pageContext成員變量,因此在標簽處理類中可以直接訪問pageContext變量。

    3.3 PageContext類

    TagSupport類的兩個重要屬性之一:PageContext類
    PageContext類本身由Servlet容器創建,它是Servlet容器為JSP頁面提供的得力助手,在JSP頁面的自定義標簽也可以使用這個得力助手;

    PageContext類提供了保存和訪問Web應用的各個范圍內的共享數據的方法:

    public void setAttribute(String name, Object value, int scope)//存放 public Object getAttribute(String name, int scope)//訪問

    其中,scope參數用來指定屬性存在的范圍,它的可選值包括:
    PageContext.PAGE_SCOPE
    PageContext.REQUEST_SCOPE
    PageContext.SESSION_SCOPE
    PageContext.APPLICATION_SCOPE
    例如:

    pageContext.setAttribute(“username”,Tom, PageContext.SESSION_SCOPE);//存放 String username=(String)pageContext.getAttribute(“username”, PageContext.SESSION_SCOPE);//訪問

    3.4 doStartTag()方法的返回值

    TagSupport類的主要方法之一:doStartTag():Servlet容器遇到自定義標簽的起始標志(即:<)時調用該方法

    doStartTag()方法返回一個整數值,用來決定程序的后續流程。它有兩個可選值:
    Tag.SKIP_BODY表示標簽之間的內容被忽略。
    Tag.EVAL_BODY_INCLUDE表示標簽之間的內容被正常執行。

    例如對于以下代碼:
    < prefix: Mytag>
    Hello
    ……
    ……
    < /prefix:Mytag>

    假若< Mytag>的doStartTag()方法返回Tag.SKIP_BODY,”Hello”字符串不會顯示在網頁上;若返回Tag.EVAL_BODY_INCLUDE,“Hello” 字符串將顯示在網頁上。

    3.5 doEndTag()方法的返回值

    TagSupport類的主要方法之一:doEndTag():Servlet容器遇到自定義標簽的結束標志(即:/>)時調用該方法

    doEndTag()方法也返回一個整數值,用來決定程序后續流程。它有兩個可選值:
    Tag.SKIP_PAGE:表示立刻停止執行JSP網頁,網頁上未處理的靜態內容和JSP程序代碼均被忽略,任何已有的輸出內容立刻返回到客戶的瀏覽器上。
    Tag.EVAL_PAGE:表示按正常的流程繼續執行JSP網頁。

    3.6 用戶自定義的標簽屬性

    在標簽中還能包含自定義的屬性,例如:
    < prefix:mytag username=“Tom">
    ……
    ……
    < /prefix:mytag>

    在標簽處理類中應該將這個屬性作為成員變量,并且分別提供設置和讀取屬性的方法;
    假定以上username為String類型,可以定義如下方法:
    private String username;
    public void setUsername(String value){
    this.username=value;
    }
    public String getUsername(){
    return username;
    }

    4. Servlet容器處理自定義標簽的流程

    4.1 范例1:創建hello標簽

    定義一個名為mytaglib的標簽庫,它包含一個簡單的hello標簽,這個標簽能夠將JSP頁面中所有的< mm:hello/>解析為字符串“hello”。

    hello標簽的處理類HelloTag

    import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.tagext.TagSupport;public class HelloTag extends TagSupport{/** 當Servlet容器遇到hello標簽的結束標志時,調用此方法 */public int doEndTag() throws JspException{try{//打印字符串“Hello”pageContext.getOut().print("Hello");}catch (Exception e) {throw new JspTagException(e.getMessage());}return EVAL_PAGE;} }

    創建hello標簽的標簽庫的描述文件
    創建Tag Library的描述文件mytaglib.tld文件,在這個文件中定義mytaglib標簽庫和hello標簽。這個文件存放位置為/WEB-INF/mytaglib.tld。

    <taglib><tlib-version>1.0</tlib-version>//標簽庫版本<jsp-version>1.1</jsp-version>//jsp版本<short-name>mytaglib</short-name>//標簽庫默認的前綴名<uri>/mytaglib</uri>//標簽庫唯一的訪問標識符<tag>//定義一個標簽<name>hello</name>//標簽名<tag-class>mypack.HelloTag</tag-class>//標簽處理類<body-content>empty</body-content>//標簽主體的類型<info>Just Says Hello</info>//標簽的說明信息</tag></taglib>

    如果某個web應用需要使用名為mytaglib的標簽庫中的標簽,就需要在web應用中加入標簽庫的描述文件mytaglib.tld文件:把mytaglib.tld文件放在/WEB-INF下,目錄/WEB-INF/mytaglib.tld;
    在web.xml文件中加入< taglib>元素

    <web>……<taglib>//聲明web應用引用的標簽庫<taglib-uri>/mytaglib</taglib-uri>//為標簽庫映射唯一一個標識符,根據標識符引用標簽庫<taglib-location>/WEB-INF/mytaglib.tld</taglib-location>//標簽庫tld文件存放位置</taglib><web>

    在JSP文件中加入hello標簽
    (1)在hellowithtag1.jsp中加入引用mytaglib的taglib指令:<%@ taglib uri=“/mytaglib” prefix=“mm” %>
    以上taglib指令中,prefix屬性用來指定引用mytaglib標簽庫時的前綴(所有以mm開頭的標簽都來自mytaglib標簽庫)。

    (2)在hellowithtag1.jsp文件中插入hello標簽:
    < b>< mm:hello/> :
    <%= request.getParameter(“username") %>

    訪問hellowithtag1.jsp:
    http://localhost:8080/hellowithtag1.jsp?username=weiqin

    4.2 范例2:創建message標簽

    創建一個能替換helloapp應用中JSP網頁的靜態文本的標簽,這個標簽名為message,它放在mytaglib標簽庫中。

    在hellowithtag2.jsp文件中使用message標簽的代碼如下:
    < b>< mm:message key=“hello.hello” /> :
    <%= request.getAttribute(“username") %>< /b>
    當客戶訪問hello.jsp網頁時,message標簽的處理類會根據屬性key的值從一個文本文件中找到與key匹配的字符串。假定這個字符串為“Hello”,然后將這個字符串輸出到網頁上。
    創建包含JSP網頁靜態文本的文件
    首先將創建包含JSP網頁靜態文本的文件,這些文本以key=value的形式存放,這個文件名為messageresource.properties:

    在Web應用啟動時裝載靜態文本
    盡管裝載靜態文本的任務可以直接由標簽處理類來完成,但是把初始化的操作安排在Web應用啟動時完成,這更符合Web編程的規范。
    在本例中,由LoadServlet類的init方法負責從靜態文本文件中讀取靜態文本,然后把它們裝載到Properties對象中,最后再把這個Properties對象作為屬性保存到ServletContext中。

    LoadServlet類的init方法

    public void init()throws ServletException {Properties ps=new Properties();try{ServletContext context=getServletContext();InputStream in=context.getResourceAsStream("/WEB-INF/messageresource.properties");ps.load(in);in.close();//在Web應用范圍內存放包含靜態文本的Properties對象context.setAttribute("ps",ps); }catch(Exception e){e.printStackTrace();}}

    為了保證在Web應用啟動時就加載LoadServlet,應該在web.xml中配置這個Servlet時設置load-on-startup屬性:

    <servlet><servlet-name>load</servlet-name><servlet-class>mypack.LoadServlet</servlet-class><load-on-startup>1</load-on-startup></servlet>

    創建MessageTag標簽處理類
    MessageTag包含一個成員變量key,它與message標簽的屬性key對應。在MessageTag中定義了getKey和setKey方法:

    private String key=null;public String getKey(){return this.key; } public void setKey(String key){this.key=key; } public int doEndTag() throws JspException {try {Properties ps=(Properties)pageContext.getAttribute("ps",pageContext.APPLICATION_SCOPE);String message=(String)ps.get(key);pageContext.getOut().print(message);} catch (Exception e) {throw new JspTagException(e.getMessage());}return EVAL_PAGE;} }

    在mytaglib庫中定義message標簽

    <tag>//定義一個標簽<name>message</name>//標簽名<tag-class>mypack.MessageTag</tag-class>//標簽處理類<body-content>empty</body-content>//標簽主體的類型<info>produce message by key</info>//標簽的說明信息<attribute><name>key</name>//屬性<required>true</required>//屬性是否需要賦值</attribute></tag>

    5. 練習題

  • 問題:在標簽處理類中,如何訪問session范圍內的共享數據?
    選項:
    (A)在TagSupport類中定義了session成員變量,直接調用它的getAttribute()方法即可。
    (B)在標簽處理類TagSupport類中定義了pageContext成員變量,先通過它的getSession()方法獲得當前的HttpSession對象,再調用HttpSession對象的getAttribute()方法。
    ?pageContext.getAttribute(“attributename”,PageContext.SESSION_SCOPE)
    答案: B,C
  • 問題:在下面的選項中,哪些是TagSupport類的doStartTag()方法的有效返回值?
    選項:
    (A) Tag.SKIP_BODY
    (B) Tag.SKIY_PAGE
    ? Tag.EVAL_BODY_INCLUDE
    (D) Tag.EVAL_PAGE
    答案: A,C
  • 問題:標簽處理類的doStartTag()方法以及doEndTag()方法由誰調用?
    選項:
    (A) HTTPServletRequest類
    (B) HTTPServletResponse類
    ? ServletContext類
    (D) Servlet容器
    答案: D
  • 總結

    以上是生活随笔為你收集整理的Java Web之自定义JSP标签的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。