JAvaラーニングノート-カスタムラベル2(40)

16546 ワード

ケース1:基本的な盗難防止チェーンラベルを実現


1.ラベル処理クラス
public class MyReferer extends BodyTagSupport {

    private String site;

    private String back;

    public String getSite() {

        return site;

    }

    public void setSite(String site) {

        this.site = site;

    }

    public String getBack() {

        return back;

    }

    public void setBack(String back) {

        this.back = back;

    }

    public int doEndTag() throws JspException {

        //  JSP 

        PageContext pageContext = this.pageContext;

        //  request 

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

        //  

        String header = request.getHeader("referer");

        if(header != null && header.startsWith(getSite())){

            //  

            return Tag.EVAL_PAGE;

        }else{

            //  

            HttpServletResponse response = (HttpServletResponse)pageContext.getResponse();

            try {

                response.sendRedirect(getBack());

            } catch (IOException e) {

                e.printStackTrace();

            }

            //  

            return Tag.SKIP_PAGE;

        }

    }

}

2.説明ファイル
<?xml version="1.0" encoding="UTF-8"?>

<taglib 

    xmlns="http://java.sun.com/xml/ns/javaee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"

    version="2.1">

  <!-- 2.   -->  

  <tlib-version>1.0</tlib-version>

  <short-name>jnb</short-name>

   <tag>  

    <name>referer</name>

    <tag-class>cn.itcast.custom.MyReferer</tag-class>

    <body-content>empty</body-content>

     <attribute>

        <name>site</name>

        <required>true</required>

        <rtexprvalue>true</rtexprvalue>

    </attribute>

     <attribute>

        <name>back</name>

        <required>true</required>

        <rtexprvalue>true</rtexprvalue>

    </attribute>

  </tag>

</taglib> 

3.導入と使用
<%@taglib uri="/WEB-INF/referer.tld" prefix="my"%>

   <my:referer site=http://localhost:8080/day11/list.jsp

 back="/day11/list.jsp"/>

JSP2.0カスタムラベル


---|SimpleTagインタフェース
ラベル処理クラスのライフサイクルメソッドを定義します.doTag()
----|SimpleTagSupportクラス
すべてSimpleTagインタフェースの方法が実装されているので,後でクラスを継承して書き換えるだけでよい.

ケース2:自分のifを実現する....elseラベル


ターゲット:
 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

   <c:choose>

     <c:when test="<%= 12>1 %>">

             

     </c:when>

     <c:otherwise>

             

     </c:otherwise>

   </c:choose>

分析:
1. ChooseTag.JAva、タグフィールド属性を定義する必要があります
public class ChooseTag extends SimpleTagSupport {

    private boolean tag = true;

    public boolean isTag() {

        return tag;

    }

    public void setTag(boolean tag) {

        this.tag = tag;

    }

    //  

    public void doTag() throws JspException, IOException {

        //  

        JspFragment body = this.getJspBody();

        //  

        body.invoke(null);

        super.doTag();

    }

}

2. WhenTag.java
public class WhenTag extends SimpleTagSupport {

    private boolean test;

    public boolean isTest() {

        return test;

    }

    public void setTest(boolean test) {

        this.test = test;

    }

    //  

    public void doTag() throws JspException, IOException {

        //  

        ChooseTag choose = (ChooseTag)this.getParent();

        //  

        boolean parent = choose.isTag();

        //  

        if( parent && this.isTest() ){

            //  

            JspFragment body = this.getJspBody();

            body.invoke(null);

        }

        super.doTag();

    }

}

3. Otherwise.java
public class OtherwiseTag extends SimpleTagSupport {

    

    //  

    public void doTag() throws JspException, IOException {

        //  

        ChooseTag choose = (ChooseTag)this.getParent();

        //  

        boolean parent = choose.isTag();

        //  

        if(parent){

            //  

            JspFragment body = this.getJspBody();

            body.invoke(null);

        }

        super.doTag();

    }

}

4.記述ファイル
<?xml version="1.0" encoding="UTF-8"?>

<taglib 

    xmlns="http://java.sun.com/xml/ns/javaee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"

    version="2.1">

  <!-- 2.   -->  

  <tlib-version>1.0</tlib-version>

  <short-name>jnb</short-name>

   <tag>  

    <name>choose</name>

    <tag-class>cn.itcast.tags.ChooseTag</tag-class>

    <body-content>scriptless</body-content>     JSP2.0 

  </tag>

  <tag>  

    <name>when</name>

    <tag-class>cn.itcast.tags.WhenTag</tag-class>

    <body-content>scriptless</body-content>

    <attribute>

        <name>test</name>

        <required>true</required>

        <rtexprvalue>true</rtexprvalue>

    </attribute>

  </tag>

   

   <tag>  

    <name>otherwise</name>

    <tag-class>cn.itcast.tags.OtherwiseTag</tag-class>

    <body-content>scriptless</body-content>

  </tag>

</taglib>    

5.導入と使用
<%@taglib uri="/WEB-INF/ifelse.tld" prefix="jnb"%>

     <jnb:choose>

        <jnb:when test="<%= 1>2 %>">

                 

        </jnb:when>

        <jnb:otherwise>

                   

        </jnb:otherwise>

     </jnb:choose> 

カスタムラベルライブラリのパッケージング


1.taglibsフォルダを作成する
2.すべてのラベル処理クラスに対応するclassファイルをパッケージとともに1のディレクトリにコピーする
3.1のフォルダにMETA-INFフォルダを作成する
4.tldファイルをMETA-INFディレクトリにコピーする
5.tldファイルを編集してuri要素を導入する
   http://www.jnb.comà導入urlパスの提供
6.jarコマンドによるパッケージング
   D:\mytaglibs>jar cvf jnb.jar *

まとめ


主にJSP 2の使い方を把握する.0カスタムラベルの開発とパッケージングを行います.
1.taglibsフォルダを作成する
2.すべてのラベル処理クラスに対応するclassファイルをパッケージとともに1のディレクトリにコピーする
3.1のフォルダにMETA-INFフォルダを作成する
4.tldファイルをMETA-INFディレクトリにコピーする
5.tldファイルを編集してuri要素を導入する
   http://www.jnb.comà導入urlパスの提供
6.jarコマンドによるパッケージング
   D:\mytaglibs>jar cvf jnb.jar *

まとめ


主にJSP 2の使い方を把握する.0カスタムラベルの開発とパッケージングを行います.