`
hezhaomeng
  • 浏览: 9211 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

关于自定义标签的应用

    博客分类:
  • web
 
阅读更多

关于自定义标签的使用 在我开始接触的时候 只是对其基本用法有了一个大概的了解 ,但是真到实际应用中我发现,那可不能同日而语 ,就目前我做的应用是做一个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=''>&nbsp;&nbsp;</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范围中的全部代码了

写的有点乱 但是还能看清逻辑

有什么建议欢迎提出呢 会灰常感激的

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics