[color=blue][size=large]我目前做的一个项目中有一个下拉框的问题。在不同页面下拉框的选项都可以在字典表中定义。
我在项目里写了一个简单的自定义下拉框。标签里选项取数据问题,代码如下。
还请各位指点下,这里面的效率问题。我这样写会不会有什么不妥的地方。尤其是执行sql那块。我是直接WebApplicationContextUtils这个类去得到jdbc的连接.这样会不会存在什么问题![/size][/color]
[code="java"]
public class DictTag extends TagSupport{
/*
* 选择框 id
/
private String id;
/
* 选择框 name
/
private String name;
/
* 选择框 通过下拉框value默认选中
/
private String selectValue;
/
* 选择框 通过下拉框文本默认选中
*/
private String selectText;
/*
* 要显示字典中组的选项
*/
private String dictGroupId;
/*
* 默认值
*/
private String defaultValue = "";
/*
* 默认文本
*/
private String defaultText = "请选择";
public String getDefaultValue() {
return defaultValue;
}
public void setDefaultValue(String defaultValue) {
this.defaultValue = defaultValue;
}
public String getDefaultText() {
return defaultText;
}
public void setDefaultText(String defaultText) {
this.defaultText = defaultText;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSelectValue() {
return selectValue;
}
public void setSelectValue(String selectValue) {
this.selectValue = selectValue;
}
public String getSelectText() {
return selectText;
}
public void setSelectText(String selectText) {
this.selectText = selectText;
}
public String getDictGroupId() {
return dictGroupId;
}
public void setDictGroupId(String dictGroupId) {
this.dictGroupId = dictGroupId;
}
/**
* 标签加载开始
*/
@Override
public int doStartTag(){
StringBuffer select = new StringBuffer();
select.append("<select");
/*
* 给select加上id
*/
if(id != null && !"".equals(id)) {
select.append(" id='")
.append(id)
.append("'");
}
/*
* 给select加上name
*/
if(name != null && !"".equals(name)) {
select.append(" name='")
.append(name)
.append("'");
}
select.append(">");
if(dictGroupId != null && !"".equals(dictGroupId)) {
/*
* 查找字典表中的选项sql
*/
String sql = "SELECT d.entry_value,d.entry_name FROM t_sys_dict d ,t_sys_dictgroup dg "
+"WHERE dg.dictgroup_id = ? AND d.dictgroup_id = dg.dictgroup_id ";
Object[] args = {Integer.valueOf(dictGroupId)};
select.append("<option value='");
select.append(defaultValue);
select.append("'>");
select.append(defaultText);
select.append("</option>");
List list = new ArrayList();
try {
/*
* 执行sql
*/
org.springframework.jdbc.core.JdbcTemplate jdbc = (org.springframework.jdbc.core.JdbcTemplate)org.springframework.web.context.support.WebApplicationContextUtils.getWebApplicationContext(this.pageContext.getServletContext()).getBean("jdbcTemplate");
list = jdbc.queryForList(sql,args);
} catch (Exception e1) {
}
if (list != null && list.size() > 0) {
for (int i=0;i<list.size();i++) {
Map map = (Map)list.get(i);
String selectStatus = "";
if(selectValue != null && !"".equals(selectValue) && selectValue.equals(map.get("entry_value").toString())) {
selectStatus = "selected='selected'";
}
if(selectText != null && !"".equals(selectText) && selectText.equals(map.get("entry_name").toString())) {
selectStatus = "selected='selected'";
}
select.append("<option value='");
select.append(map.get("entry_value"));
select.append("' ");
select.append(selectStatus);
select.append(">");
select.append(map.get("entry_name"));
select.append("</option>");
}
}
JspWriter jsp = this.pageContext.getOut();
try {
jsp.print(select.toString());
} catch (IOException e) {
e.printStackTrace();
}
} else {
select.append("<option value=''>");
select.append("无下拉选项");
select.append("</option>");
}
select.append("</select>");
return SKIP_BODY;
}
}
[/code]
简单的话可以建个hashmap,将查询出来的数据放进去,下次就在这里取,不用查数据库了,当有CUD就更新下,因为字典的内容没有需求是不会怎样变的
没什么问题,最大的问题是你每次都重新从数据库里加载数据,你可以适当的从缓存里拿数据