读书人

关于自定义标记的属性的疑问解决思路

发布时间: 2012-04-05 12:42:40 作者: rapoo

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

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;
}

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>

读书人网 >Java Web开发

热点推荐