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.在处理类中必须定义和属性相对应的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;
}
}
并定义相应的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>
<%@ 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> </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} </td>
<td>${item.name} </td>
<td>${item.descr} </td>
<td>${item.publishcode} </td>
<td><t629:showpubname name="name" tablename="publish" publishcode="publishcode" value="${item.publishcode}" /></td>
</tr>
</c:forEach>
</table>
</body>
</html>
<c:forEach items="${at}" var="item"> <tr>
<td>${item.code} </td>
<td>${item.name} </td>
<td>${item.descr} </td>
<td>${item.publishcode} </td>
......
以上代码中的${...}是什么意思呢?