日期:2014-05-18  浏览次数:20644 次

关于自定义标记的属性的疑问

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.在自定义标记中出现的属性,是否必须在处理类定义相应的成员变量,
并定义相应的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;