关于自定义标签的使用 在我开始接触的时候 只是对其基本用法有了一个大概的了解 ,但是真到实际应用中我发现,那可不能同日而语 ,就目前我做的应用是做一个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范围中的全部代码了
写的有点乱 但是还能看清逻辑
有什么建议欢迎提出呢 会灰常感激的
?
?