JSP自定义标签

1.set和out标签

set的一个助手类

 

    private static final long serialVersionUID = 1L;
    private String var;
    private Object value;
    public String getVar() {
        return var;
    }
    public void setVar(String var) {
        this.var = var;
    }
    public Object getValue() {
        return value;
    }
    public void setValue(Object value) {
        this.value = value;
    }
    
    @Override
    public int doStartTag() {
        pageContext.setAttribute(var, value);//将值存入pageContext
        return SKIP_BODY;
    }

 

set的tld文件

<tag>
        <name>set</name>
        <tag-class>com.jsp.SetTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <name>var</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>value</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>

out的助手类

    public Object getValue() {
        return value;
    }
    public void setValue(Object value) {
        this.value = value;
    }
    private Object value;
    @Override
    public int doStartTag() throws JspException {
         JspWriter out=pageContext.getOut();
         try {
            out.write(value.toString());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            throw new RuntimeException(e);
        }
        return SKIP_BODY;
    }

out的tld文件

<tag>
        <name>out</name>
        <tag-class>com.jsp.OutTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>value</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>

下面我通过jsp文件做的演示

 

<p:set value="zhangsan" var="name"></p:set>
<p:out value="${name }"/>

结果

if标签助手类

 

    private boolean test;

    public boolean isTest() {
        return test;
    }

    public void setTest(boolean test) {
        this.test = test;
    }

    @Override
    public int doStartTag() throws JspException {
        if (!test) {
            return SKIP_BODY;// 不显示标签中间的内容
        }
        return EVAL_BODY_INCLUDE;// 显示标签中间的内容
    }

 

if标签的tld文件

<tag>
        <name>if</name>
        <tag-class>com.jsp.IfTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <name>test</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>

if标签测试

<p:if test="true">ls</p:if>
<p:if test="false">ww</p:if>

test里面为true会显示在jsp页面上,false的不显示

foreach标签的助手类

private static final long serialVersionUID = 2893253295092920387L;
    //集合
    private List<Object> items;
    //变量的名称
     private String var;
    public List<Object> getItems() {
        return items;
    }
    public void setItems(List<Object> items) {
        this.items = items;
    }
    public String getVar() {
        return var;
    }
    public void setVar(String var) {
        this.var = var;
    }
     @Override
    public int doStartTag() throws JspException {
        Iterator<Object> it=items.iterator();
        //默认存放的位置是没有指向对象的,现在需要指向对象,那么需要指针下移
        pageContext.setAttribute(var, it.next());
        //因为集合中元素较多,那么指针需要循环的向下移动,那么我们需要将迭代器保存,用于下一次指针下移使用
        pageContext.setAttribute("it", it);
        return EVAL_BODY_INCLUDE;
      } 
     @Override
    public int doAfterBody() throws JspException {
     Iterator<Object> it=(Iterator<Object>) pageContext.getAttribute("it");
     if(it.hasNext()) {
         pageContext.setAttribute(var, it.next());
         pageContext.setAttribute("it", it);
         return EVAL_BODY_AGAIN;
     }else {
         return EVAL_PAGE;
     }
    }

foreach的tld文件

<tag>
        <name>foreach</name>
        <tag-class>com.jsp.ForEachTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <name>var</name>
            <required>true</required>
            <rtexprvalue>flase</rtexprvalue>
        </attribute>
        <attribute>
            <name>items</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>

foreach标签的测试

<%
   List list=new ArrayList();
   list.add(new Student("sb1","zs"));
   list.add(new Student("sb2","ls"));
   list.add(new Student("sb3","ws"));
   request.setAttribute("stus",list);

%>
<p:foreach items="${stus }" var="stu">
${stu.sid },${stu.sname }<br>
</p:foreach>

结果是3个值全都显示出来

select标签助手类

    private static final long serialVersionUID = 1L;
    private String id;
    private String name;
    private List<Object> items = new ArrayList<Object>();
    private String textKey;
    private String textval;
    private String headTextKey;
    private String headTextVal;
    private String selectedval;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Object> getItems() {
        return items;
    }

    public void setItems(List<Object> items) {
        this.items = items;
    }

    public String getTextKey() {
        return textKey;
    }

    public void setTextKey(String textKey) {
        this.textKey = textKey;
    }

    public String getTextval() {
        return textval;
    }

    public void setTextval(String textval) {
        this.textval = textval;
    }

    public String getHeadTextKey() {
        return headTextKey;
    }

    public void setHeadTextKey(String headTextKey) {
        this.headTextKey = headTextKey;
    }

    public String getHeadTextVal() {
        return headTextVal;
    }

    public void setHeadTextVal(String headTextVal) {
        this.headTextVal = headTextVal;
    }

    public String getSelectedval() {
        return selectedval;
    }

    public void setSelectedval(String selectedval) {
        this.selectedval = selectedval;
    }

    @Override
    public int doStartTag() throws JspException {
        JspWriter out = pageContext.getOut();
        try {
            out.write(toHTML());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return super.doStartTag();
    }

    /**
     * 拼接出下拉列表所对应的select的html代码 
     * <select id='' name=''>
     *  <option value='-1'selected>===请选择===</option>
     *   </select>
     * 
     * @return
     * @throws IllegalAccessException
     * @throws Exception
     */
    private String toHTML() throws Exception {
        StringBuilder sb = new StringBuilder();
        sb.append("<select id='" + id + "' name='" + name + "'>");
        if (headTextKey == null || "".equals(headTextKey) || headTextVal == null || "".equals(headTextVal)) {
            sb.append("<option value='" + headTextKey + "' selected>" + headTextVal + "</option>");
        }
        String val;
        String html;
        for (Object obj : items) {
            // 要让学生的ID存入数据库,让学生的名字展示在JSP页面
            // <option value='s001'>ls</option>
            // obj sid sname
            Field textKeyField = obj.getClass().getDeclaredField(textKey);
            textKeyField.setAccessible(true);
            val = (String) textKeyField.get(obj);
            html = BeanUtils.getProperty(obj, textval);
            if(val.equals(selectedval)) {
                sb.append(" <option value='"+val+"'selected>"+html+"</option>");
            }else {
                sb.append("<option value='"+val+"'>"+html+"</option>");
            }
        }
        sb.append("</select>");
        return sb.toString();
    }

select的tld文件

<tag>
        <name>select</name>
        <tag-class>com.jsp.ServletTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <name>id</name>
            <required>false</required>
            <rtexprvalue>flase</rtexprvalue>
        </attribute>
        <attribute>
            <name>name</name>
            <required>flase</required>
            <rtexprvalue>flase</rtexprvalue>
        </attribute>
        <attribute>
            <name>items</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>textKey</name>
            <required>true</required>
            <rtexprvalue>false</rtexprvalue>
        </attribute>
        <attribute>
            <name>textval</name>
            <required>true</required>
            <rtexprvalue>flase</rtexprvalue>
        </attribute>
        <attribute>
            <name>headTextKey</name>
            <required>false</required>
            <rtexprvalue>false</rtexprvalue>
        </attribute>
        <attribute>
            <name>headTextVal</name>
            <required>false</required>
            <rtexprvalue>flase</rtexprvalue>
        </attribute>
        <attribute>
            <name>selectedval</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>

select的测试

<p:select  items="${stus }" textval="sname" textKey="sid"></p:select>
<p:select headTextKey="-1" headTextVal="===请选择学生===" items="${stus }" textval="sname" textKey="sid"></p:select>

第一种显示的

第二种的默认显示的第一个为你输入的值,今天的技术分享就到这里

 

posted @ 2019-06-17 21:56  youshutup  阅读(218)  评论(0编辑  收藏  举报