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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Java Web之自定义JSP标签

發(fā)布時(shí)間:2023/12/8 javascript 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java Web之自定义JSP标签 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java Web之自定義JSP標(biāo)簽
write:2022-5-7

上文:Java Web之使用過(guò)濾器,
前面我們學(xué)習(xí)了JSP自帶的標(biāo)簽:Java web之JSP技術(shù)詳解,但自帶標(biāo)簽數(shù)量有限,從JSP1.1開始出現(xiàn)了自定義JSP標(biāo)簽技術(shù),允許用戶創(chuàng)建客戶化的標(biāo)簽,從而完成特定需求的功能。

文章目錄

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

1. 理解自定義JSP標(biāo)簽的作用

自定義JSP標(biāo)簽技術(shù)是在JSP 1.1版本中才出現(xiàn)的,它支持用戶在JSP文件中自定義標(biāo)簽,這樣可以使JSP代碼更加簡(jiǎn)潔。
自定義標(biāo)簽是可重用的
自定義標(biāo)簽?zāi)芴幚韽?fù)雜的邏輯運(yùn)算和事務(wù),或者定義JSP網(wǎng)頁(yè)的輸出內(nèi)容和格式。

2. 掌握創(chuàng)建并運(yùn)用自定義JSP標(biāo)簽的步驟

因?yàn)樽远x的JSP標(biāo)簽可以被重復(fù)使用,因此創(chuàng)建自定義JSP標(biāo)簽和在JSP文件中使用自定義JSP標(biāo)簽是獨(dú)立的;

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

    3.1 標(biāo)簽的處理類

    Servlet容器執(zhí)行JSP文件時(shí),如果遇到自定義標(biāo)簽,就會(huì)調(diào)用這個(gè)標(biāo)簽的處理類。

    標(biāo)簽處理類必須擴(kuò)展以下兩個(gè)類之一
    javax.servlet.jsp.TagSupport或者javax.servlet.jsp.BodyTagSupport
    下面主要結(jié)束如何擴(kuò)展TagSupport類

    3.2 TagSupport類

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

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

    3.3 PageContext類

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

    PageContext類提供了保存和訪問(wèn)Web應(yīng)用的各個(gè)范圍內(nèi)的共享數(shù)據(jù)的方法:

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

    其中,scope參數(shù)用來(lái)指定屬性存在的范圍,它的可選值包括:
    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);//訪問(wèn)

    3.4 doStartTag()方法的返回值

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

    doStartTag()方法返回一個(gè)整數(shù)值,用來(lái)決定程序的后續(xù)流程。它有兩個(gè)可選值:
    Tag.SKIP_BODY表示標(biāo)簽之間的內(nèi)容被忽略。
    Tag.EVAL_BODY_INCLUDE表示標(biāo)簽之間的內(nèi)容被正常執(zhí)行。

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

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

    3.5 doEndTag()方法的返回值

    TagSupport類的主要方法之一:doEndTag():Servlet容器遇到自定義標(biāo)簽的結(jié)束標(biāo)志(即:/>)時(shí)調(diào)用該方法

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

    3.6 用戶自定義的標(biāo)簽屬性

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

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

    4. Servlet容器處理自定義標(biāo)簽的流程

    4.1 范例1:創(chuàng)建hello標(biāo)簽

    定義一個(gè)名為mytaglib的標(biāo)簽庫(kù),它包含一個(gè)簡(jiǎn)單的hello標(biāo)簽,這個(gè)標(biāo)簽?zāi)軌驅(qū)SP頁(yè)面中所有的< mm:hello/>解析為字符串“hello”。

    hello標(biāo)簽的處理類HelloTag

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

    創(chuàng)建hello標(biāo)簽的標(biāo)簽庫(kù)的描述文件
    創(chuàng)建Tag Library的描述文件mytaglib.tld文件,在這個(gè)文件中定義mytaglib標(biāo)簽庫(kù)和hello標(biāo)簽。這個(gè)文件存放位置為/WEB-INF/mytaglib.tld。

    <taglib><tlib-version>1.0</tlib-version>//標(biāo)簽庫(kù)版本<jsp-version>1.1</jsp-version>//jsp版本<short-name>mytaglib</short-name>//標(biāo)簽庫(kù)默認(rèn)的前綴名<uri>/mytaglib</uri>//標(biāo)簽庫(kù)唯一的訪問(wèn)標(biāo)識(shí)符<tag>//定義一個(gè)標(biāo)簽<name>hello</name>//標(biāo)簽名<tag-class>mypack.HelloTag</tag-class>//標(biāo)簽處理類<body-content>empty</body-content>//標(biāo)簽主體的類型<info>Just Says Hello</info>//標(biāo)簽的說(shuō)明信息</tag></taglib>

    如果某個(gè)web應(yīng)用需要使用名為mytaglib的標(biāo)簽庫(kù)中的標(biāo)簽,就需要在web應(yīng)用中加入標(biāo)簽庫(kù)的描述文件mytaglib.tld文件:把mytaglib.tld文件放在/WEB-INF下,目錄/WEB-INF/mytaglib.tld;
    在web.xml文件中加入< taglib>元素

    <web>……<taglib>//聲明web應(yīng)用引用的標(biāo)簽庫(kù)<taglib-uri>/mytaglib</taglib-uri>//為標(biāo)簽庫(kù)映射唯一一個(gè)標(biāo)識(shí)符,根據(jù)標(biāo)識(shí)符引用標(biāo)簽庫(kù)<taglib-location>/WEB-INF/mytaglib.tld</taglib-location>//標(biāo)簽庫(kù)tld文件存放位置</taglib><web>

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

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

    訪問(wèn)hellowithtag1.jsp:
    http://localhost:8080/hellowithtag1.jsp?username=weiqin

    4.2 范例2:創(chuàng)建message標(biāo)簽

    創(chuàng)建一個(gè)能替換helloapp應(yīng)用中JSP網(wǎng)頁(yè)的靜態(tài)文本的標(biāo)簽,這個(gè)標(biāo)簽名為message,它放在mytaglib標(biāo)簽庫(kù)中。

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

    在Web應(yīng)用啟動(dòng)時(shí)裝載靜態(tài)文本
    盡管裝載靜態(tài)文本的任務(wù)可以直接由標(biāo)簽處理類來(lái)完成,但是把初始化的操作安排在Web應(yīng)用啟動(dòng)時(shí)完成,這更符合Web編程的規(guī)范。
    在本例中,由LoadServlet類的init方法負(fù)責(zé)從靜態(tài)文本文件中讀取靜態(tài)文本,然后把它們裝載到Properties對(duì)象中,最后再把這個(gè)Properties對(duì)象作為屬性保存到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應(yīng)用范圍內(nèi)存放包含靜態(tài)文本的Properties對(duì)象context.setAttribute("ps",ps); }catch(Exception e){e.printStackTrace();}}

    為了保證在Web應(yīng)用啟動(dòng)時(shí)就加載LoadServlet,應(yīng)該在web.xml中配置這個(gè)Servlet時(shí)設(shè)置load-on-startup屬性:

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

    創(chuàng)建MessageTag標(biāo)簽處理類
    MessageTag包含一個(gè)成員變量key,它與message標(biāo)簽的屬性key對(duì)應(yīng)。在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庫(kù)中定義message標(biāo)簽

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

    5. 練習(xí)題

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

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。