上次采用自定义标签解决了相关编码转化为相对应中文含义的需求,效果还不错,尝到了自定义标签的甜头,准备将一些下拉菜单优化下使用自定义标签来实现。
1、JSP页面:
<%@ taglib prefix="lsxy" uri="/lsxy"%>
<lsxy:Sel name="op2" codeID="CPT20348" style="width: 180px;" />
2、根据页面自定义标签,定义标签结构文件 lsxy.tld 放于WEB-INF下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>2.2.3</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>lsxy</short-name>
<uri>/lsxy</uri>
<display-name>"lsxy Tags"</display-name>
<!-- 自定义下拉菜单标签 -->
<tag>
<name>Sel</name>
<tag-class>lsxy.report.taglib.LsxySelTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>codeID</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>style</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
3、自定义类 LsxySelTag.java:
package lsxy.report.taglib;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lsxy.report.service.LsxySelTagService;
import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ComponentTagSupport;
import com.opensymphony.xwork2.util.ValueStack;
public class LsxySelTag extends ComponentTagSupport {
private static final long serialVersionUID = 1L;
private String name;
private String codeID;
private String style;
public String getCodeID() {
return codeID;
}
public void setCodeID(String codeID) {
this.codeID = codeID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStyle() {
return style;
}
public void setStyle(String style) {
this.style = style;
}
@Override
public Component getBean(ValueStack valueStack, HttpServletRequest request,
HttpServletResponse response) {
return new LsxySelTagService(valueStack);
}
@Override
protected void populateParams() {
super.populateParams();
LsxySelTagService service = (LsxySelTagService) getComponent();
service.setCodeID(getCodeID());
service.setName(getName());
service.setStyle(getStyle());
}
}
4、服务处理类LsxySelTagService.java:
package lsxy.report.service;
import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;
import java.util.Map;
import lsxy.report.dao.ReportCodeDao;
import org.apache.struts2.components.Component;
import com.opensymphony.xwork2.util.ValueStack;
public class LsxySelTagService extends Component {
private static StringBuffer html;
private String name;
private String codeID;
private String style;
public String getCodeID() {
return codeID;
}
public void setCodeID(String codeID) {
this.codeID = codeID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStyle() {
return style;
}
public void setStyle(String style) {
this.style = style;
}
public LsxySelTagService(ValueStack stack) {
super(stack);
}
@Override
public boolean start(Writer writer) {
try {
buildSelectTag();
// System.out.println("html:" + html.toString());
writer.write(html.toString());
} catch (IOException e) {
e.printStackTrace();
}
return super.start(writer);
}
/**
* 构建select
*/
public void buildSelectTag() {
html = (new StringBuffer("<select name=\"")).append(name).append("\"")
.append(" id=\"").append(name).append("\"");
if (style != null) {
html.append(" style=\"").append(style).append("\"");
}
html.append(">");
html.append(getOptions());
html.append("</select>");
}
/**
* 构建option
*
* @return
*/
@SuppressWarnings("unchecked")
private String getOptions() {
StringBuffer optionBuffer = new StringBuffer();
ReportCodeDao dao = new ReportCodeDao();
Map map = dao.getCodeMap(codeID);
for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
optionBuffer.append("<option value='").append(key).append("' ");
optionBuffer.append(" >").append((String) map.get(key)).append(
"</option>");
}
return optionBuffer.toString();
}
}