在报表小工具助手中,有一个需求,编码列展现的还是编码,需要转换成对应的中文含义。
有几个思路:
1、直接在页面上进行判断匹配,但这种只适用于很少的编码替换,比如性别这类的。
2、想到使用自定义标签,根据自定义的规则,在标签中传入编码值,然后转化为对应的中文含义,这个可能比较通用,所以目前采取的是如此方案。
由于项目采用的是Struts2,所以导入相应的jar包,里面含有标签需要的jar。
代码实例:
1、数据库有一张编码表,关键字段如下:
codeID codeValue
编码的ID 编码的中文含义
2、JSP页面,页面上获取编码ID,需要转换成对应中文
<%@ taglib prefix="lsxy" uri="/lsxy"%>
<lsxy:Desc codeID=‘T101’ />
说明:引入自定义标签lsxy ,将需要转换的编码值传入。
3、根据页面自定义标签,定义标签结构文件 lsxy.tld 放于WEB-INF下:
lsxy.tld 内容:
<?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>Desc</name>
<tag-class>lsxy.report.taglib.LsxyDescTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>codeID</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
说明:tag-class 说明自定义标签处理的自定义类。
4、自定义类 LsxyDescTag.java.
package lsxy.report.taglib;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lsxy.report.service.LsxyDescTagService;
import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ComponentTagSupport;
import com.opensymphony.xwork2.util.ValueStack;
public class LsxyDescTag extends ComponentTagSupport {
private static final long serialVersionUID = 1L;
private String codeID;
public String getCodeID() {
return codeID;
}
public void setCodeID(String codeID) {
this.codeID = codeID;
}
@Override
public Component getBean(ValueStack valueStack, HttpServletRequest request,
HttpServletResponse response) {
return new LsxyDescTagService(valueStack);
}
@Override
protected void populateParams() {
super.populateParams();
LsxyDescTagService service = (LsxyDescTagService) getComponent();
service.setCodeID(getCodeID());
}
}
5、服务处理类:LsxyDescTagService.java:
package lsxy.report.service;
import java.io.Writer;
import lsxy.report.dao.ReportCodeDao;
import org.apache.struts2.components.Component;
import com.opensymphony.xwork2.util.ValueStack;
public class LsxyDescTagService extends Component {
private String codeID;
public String getCodeID() {
return codeID;
}
public void setCodeID(String codeID) {
this.codeID = codeID;
}
public LsxyDescTagService(ValueStack stack) {
super(stack);
}
@Override
public boolean start(Writer writer) {
ReportCodeDao dao = new ReportCodeDao();
try {
writer.write(dao.getCodeDesc(codeID).toString());
} catch (Exception e) {
e.printStackTrace();
}
return super.start(writer);
}
}