1.在自定义标记中出现的属性,是否必须在处理类定义相应的成员变量,
并定义相应的set,get函数。
2.set,get函数的命名是否遵循:set/get+属性名?
2.处理类实例化时给成员变量赋值,是否按照2.中所说名称选择相应set/get函数给相应成员变量赋值。
3.定义成员变量时,是否变量名必须与属性名相同。如成员变量为paramName,属性为name,可否?
4.成员变量是否可以根据属性经过变换赋值。如以下代码可否?
<mytag:student name="xiaowang">public class studentTag extends TagSupport {
  private String paramName;
  
  public void setName(String n){
    this.paramName=n+"AAA";
  }  public String getName(){
    return this.paramName;
  }
}

解决方案 »

  1.   

    没有人知道吗.
    还是我自己回答吧,经过测试和考虑,我的想法如下:
    1.在处理类中必须定义和属性相对应的setter方法,getter方法可以没有,如果用不到的话.
    2.setter/getter方法的命名遵循:set/get+属性名(属性名首字母大写)
    3.处理类正是按照2.的规则选择相应setter/getter方法.
    4.定义成员变量与属性名不必相同.关键是在setter/getter方法中将二者发生关系.
    5.在setter/getter方法中成员变量当然可以由属性经过运算后得到值.如以下代码是可以的:
    自定义标记:<mytag:student name="xiaowang">
    处理理类:
    public class studentTag extends TagSupport {
      private String paramName;
      
      public void setName(String n){
        this.paramName=n+"AAA";
      }  public String getName(){
        return this.paramName;
      }
    }
      

  2.   

    1.在自定义标记中出现的属性,是否必须在处理类定义相应的成员变量,
    并定义相应的set,get函数。
    答:是的 .2.setter/getter方法的命名遵循:set/get+属性名(属性名首字母大写)
    答:没错.3.处理类正是按照2.的规则选择相应setter/getter方法
    答:对.4.定义成员变量与属性名不必相同.关键是在setter/getter方法中将二者发生关系.
    答:变量名最好要跟属性名一样.自定义的Tag类,tld文件的<attribute><name>属性名</name>要一样
    5.这个类要重写
    public int doStartTag() throws JspException {}  这个方法
    例子:package test.myprj.book.dao;import java.sql.*;import javax.servlet.jsp.*;
    import javax.servlet.jsp.tagext.*;import myprj.db.*;
    import java.io.*;public class BookTag extends BodyTagSupport {
        //书名
        private String name;
        //表名
        private String tablename;
        //书的编号
        private String publishcode;
        //所传递的值即(编号所传进的值)
        private String value;    public BookTag() {
        }    /**
         * Process the start tag for this instance.
         *
         * @return EVAL_BODY_INCLUDE if the tag wants to process body, SKIP_BODY
         *   if it does not want to process it.
         * @throws JspException if an error occurred while processing this tag
         * @todo Implement this javax.servlet.jsp.tagext.Tag method
         */
        public int doStartTag() throws JspException {
            JspWriter out = this.pageContext.getOut();
            DBConn conn = new DBConn();
            String namevalue = null;
            String StrSQL = "select " + name + " from " + tablename + " where " +
                            publishcode + " =? ";
            try {
                java.sql.PreparedStatement ps = conn.getConn().prepareStatement(
                        StrSQL);
                ps.setString(1, value);
                java.sql.ResultSet rs = ps.executeQuery();
                rs.next();
                namevalue = rs.getString(1);
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            try {
                out.print(namevalue);
            } catch (IOException ex1) {
                throw new JspException(ex1);
            }        return 0;
        }    public String getName() {
            return name;
        }    public String getPublishcode() {
            return publishcode;
        }    public String getTablename() {
            return tablename;
        }    public String getValue() {
            return value;
        }    public void setName(String name) {
            this.name = name;
        }    public void setPublishcode(String publishcode) {
            this.publishcode = publishcode;
        }    public void setTablename(String tablename) {
            this.tablename = tablename;
        }    public void setValue(String value) {
            this.value = value;
        }
    }booktld.tld
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
    <taglib>
    <tlibversion>1.0</tlibversion>
    <jspversion>1.1</jspversion>
    <shortname>logic</shortname>
    <uri>http://jakarta.apache.org/struts/tags-logic</uri>
    <tag>
    <name>showpubname</name>
    <tagclass>test.myprj.book.dao.BookTag</tagclass>
    <bodycontent>Jsp</bodycontent>
    <attribute>
    <name>publishcode</name>
    <required>true</required>
    <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
    <name>tablename</name>
    <required>true</required>
    <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
    <name>value</name>
    <required>true</required>
    <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
    <name>name</name>
    <required>true</required>
    <rtexprvalue>true</rtexprvalue>
    </attribute>
    </tag>
    </taglib>
      

  3.   

    selectbook.jsp<%@ page contentType="text/html; charset=GBK" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
    <%@ taglib  uri="/WEB-INF/booktld.tld" prefix="t629" %>
    <html>
    <head>
    <title>
    bookselect
    </title>
    </head>
    <body bgcolor="#ffffff">
    <h1>&nbsp;</h1>
    <table width="760" border="1">
      <tr>
        <td>书籍编号</td>
        <td>书名</td>
        <td>简介</td>
        <td>出版社编号</td>
        <td>出版社名称</td>
      </tr>  <c:forEach items="${at}" var="item">  <tr>
        <td>${item.code}&nbsp;</td>
        <td>${item.name}&nbsp;</td>
        <td>${item.descr}&nbsp;</td>
        <td>${item.publishcode}&nbsp;</td>
        <td><t629:showpubname name="name" tablename="publish" publishcode="publishcode"  value="${item.publishcode}" /></td>
      </tr>
        </c:forEach>
    </table>
    </body>
    </html>
      

  4.   

    谢谢标记处理类是要继承TagSupport并重写doStartTag(),doEndTag().上面我只是关心属性和成员变量所以略掉了后面的代码.还有
    <c:forEach items="${at}" var="item">  <tr>
        <td>${item.code}&nbsp;</td>
        <td>${item.name}&nbsp;</td>
        <td>${item.descr}&nbsp;</td>
        <td>${item.publishcode}&nbsp;</td>
    ......
    以上代码中的${...}是什么意思呢?
      

  5.   

    这个是EL表达式.有了这个就不用javascript<% %>来写.直接调用.你可以去查下相关资料