面上顯示的字典數據,使用自定義標籤提供了很大的方便。
自定義標籤需要三個部件,一個是數據層,查詢出數據。第二個是標籤的配置文件,第三個就是
在jsp頁面上引用了。
下面是我在一個例子:主要是從jsp頁面上傳遞值到後臺,然後將值作爲參數,在redis中查詢出
對應的值,然後返回到前臺。
public class RedisTag extends BodyTagSupport{
private static final long serialVersionUID = 1L;
//對應redis中的key
private String redisKey;
//對應redis中的field
private String redisField;
public String getRedisKey() {
return redisKey;
}
public void setRedisKey(String redisKey) {
this.redisKey = redisKey;
}
public String getRedisField() {
return redisField;
}
public void setRedisField(String redisField) {
this.redisField = redisField;
}
@Override
public int doStartTag() throws JspException {
return BodyTagSupport.EVAL_BODY_INCLUDE;
}
//從前臺傳過來3個值,分別爲需要輸出的標籤,key值和field值,field爲空則返回一個
map集合
@Override
public int doEndTag() throws JspException {
//定義一個輸出到jsp的對象
JspWriter out=this.pageContext.getOut();
try{
//從redis取出數據,兩種情況,一種是沒有field,則得到的是一個map集合,
一種是有field,返回的是一個字符串數據
if(StringUtils.isNotEmpty(redisField)){
Cache cache=RedisFactory.getRedisBean(RedisType.VALUE);
//將redisField拼接起來
redisField="value:"+redisField;
String value=cache.getKeyValue(redisKey, redisField);
out=this.pageContext.getOut();
//輸出值到jsp頁面
out.print(value);
}else{
Cache cache=RedisFactory.getRedisBean(RedisType.MAP);
@SuppressWarnings("unchecked")
Map<String, String> redisMap=(Map<String, String>)
cache.getKeyMap(redisKey);
//循環遍歷map集合
for(String s:redisMap.keySet()){
out.print("<option value="+s.substring(s.indexOf
(":")+1)+">"+redisMap.get(s)+"</option>");
}
}
}catch(Exception e){
LogFactory.getLog().info(e.getMessage());
}
return BodyTagSupport.SKIP_BODY;
}
}
自定義標籤的配置文件(應該位於WEB-INF下的tags文件夾下面)
<?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>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>redis</short-name>
<!-- backGroundTag -->
<uri>http://www.wmx.tag/redis</uri>
<tag>
<name>getValue</name>
<tag-class>com.sanlen.util.RedisTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>redisKey</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue><!-- 是否支持惡劣表達式 -->
<type>java.lang.String</type>
</attribute>
<attribute>
<name>redisField</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue><!-- 是否支持惡劣表達式 -->
<type>java.lang.String</type>
</attribute>
</tag>
</taglib>
前臺的jsp頁面使用:
<%@taglib uri="http://www.wmx.tag/redis" prefix="redis"%>
<p>
<!--此處傳遞的redisKey會傳遞到數據層中,然後整個返回一個value值-->
<redis:getValue redisKey="dc_dictionary:dictionary_id:101" redisField="vulue:
${dataSource.type}"></redis:getValue>
</p>