关于自定义标签的使用 在我开始接触的时候 只是对其基本用法有了一个大概的了解 ,但是真到实际应用中我发现,那可不能同日而语 ,就目前我做的应用是做一个select性质的标签,可以实现对字典数据表中数据的显示 根据 字典数据中的标示列名称 还可以设置默认选择项是哪一个,总体实现类似<select><code:codesDetail type="显示类型"selectid="${默认选中的id号}"/></select>这样一种方式去生成select列表
下面是代码 我贴下
(1)这个TagCode 就是标签的Action类
package org.aninggo.webapp.action.tag;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ComponentTagSupport;
import com.opensymphony.xwork2.util.ValueStack;
public class TagCode extends ComponentTagSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
private String type;
private Long selectid;
public Component getBean(ValueStack arg0, HttpServletRequest arg1,
HttpServletResponse arg2) {
// TODO Auto-generated method stub
return new CodeBean(arg0);
}
protected void populateParams() {
// TODO Auto-generated method stub
super.populateParams();
CodeBean code=(CodeBean)component;
code.setType(type);
code.setSelectid(selectid);
code.setContext(ServletActionContext.getServletContext());
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Long getSelectid() {
return selectid;
}
public void setSelectid(Long selectid) {
this.selectid = selectid;
}
}
(注意)我继承的是ComponentTagSupport 这个类
接下来
(2)就是那个真正处理标签的业务类了 它继承了Compent这个类
package org.aninggo.webapp.action.tag;
import java.io.IOException;
import java.io.Writer;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import org.aninggo.model.codes.Codes;
import org.apache.struts2.components.Component;
import com.opensymphony.xwork2.util.ValueStack;
public class CodeBean extends Component {
private List<Codes> codes;
private ServletContext context;
private String type;
private Long selectid;
public CodeBean(ValueStack stack) {
super(stack);
// TODO Auto-generated constructor stub
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean start(Writer writer) {
boolean result = super.start(writer);
boolean flag = true;
StringBuilder str = new StringBuilder();
if (flag) {
if (!"".equals(type) && null != type) {
Map<String, List<Codes>> map = (Map<String, List<Codes>>) context
.getAttribute("basecode");//这个数据就是从ServletContext中取出来的数据
if (!map.isEmpty()) {
codes = (List<Codes>) map.get(type);
str.append("<option value=''> </option>");
if(codes!=null){
if (codes.size() > 0) {
// str.append("<select>");
for (Codes c : codes) {
if(selectid.equals(c.getId())){
str.append("<option value=" + c.getId() + "selected=\"selected\">"
+ c.getXxdmhy() + "</option>");
}else{
str.append("<option value=" + c.getId() + ">"
+ c.getXxdmhy() + "</option>");
}
}
//str.append("</select>");
}
}
}
} else {
flag = false;
}
}
try {
writer.write(str.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
public List<Codes> getCodes() {
return codes;
}
public void setCodes(List<Codes> codes) {
this.codes = codes;
}
public ServletContext getContext() {
return context;
}
public void setContext(ServletContext context) {
this.context = context;
}
public Long getSelectid() {
return selectid;
}
public void setSelectid(Long selectid) {
this.selectid = selectid;
}
}
其实里面的业务逻辑很简单 的
但对于这样的一个字典数据的输出
最重要的还有一个就是字典表中的数据的加载
要是服务器启动的时候就把数据放入一个容器类中
我把它放在了ServletContext中了
那个保存数据的类我也贴下吧
package org.aninggo.webapp.action.servlet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import org.aninggo.model.codes.Codes;
import org.aninggo.service.codes.CodesManager;
import org.aninggo.webapp.action.BaseAction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller("info")
public class Info extends BaseAction{
/**
*
*/
private static final long serialVersionUID = 1L;
@Autowired
private CodesManager codesManager;
public static ServletContext serverContxt;
private static Map<String,List<Codes>> map=new HashMap<String, List<Codes>>();;
public void exe( ){
List<Codes> list;
List<Codes> listchid;
list=codesManager.findparent();
for(Codes code:list){
Long id=code.getId();
listchid=codesManager.findchild(id.intValue());
map.put(code.getCname().trim(),listchid);
}
serverContxt.setAttribute("basecode", map);
}
}
主要是把字典表中的数据整理到map中 放到serverContxt范围中
最后要真正执行的类是一个servlet类 在启动服务器的时候就要运行它
package org.aninggo.webapp.action.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
public class ServerContxt extends HttpServlet {
private Info info;
private WebApplicationContext applicationContext;
public void init() throws ServletException {
Info.serverContxt = getServletContext();
applicationContext = WebApplicationContextUtils
.getWebApplicationContext(getServletContext());
info = (Info) applicationContext.getBean("info");
info.exe();
}
}
这个就是一个完整的设置一个自定义标签 并且把它提前保存到一个servletcontext范围中的全部代码了
写的有点乱 但是还能看清逻辑
有什么建议欢迎提出呢 会灰常感激的