Tld文件生成器
来源:互联网 发布:淘宝推荐算法 编辑:程序博客网 时间:2024/06/05 07:11
package org.ts.taglib.util;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set;import javax.servlet.jsp.tagext.BodyTagSupport;import javax.servlet.jsp.tagext.TagSupport;/** * Tld文件生成器 * @author 陈双 * @date 2012-09-23 * @mail chenshuang_com@sina.com */public class TldFileGenerator {public static final Integer REQUIRED_FIELD = 1;//必须字段public static final Integer P_FIELD = 0;//非必须字段/* * 存放不希望被添加到tld文件中的属性 */private static List<String> noWantDefinedFields = new ArrayList<String>();/* * 存放必须设置的属性 */private static Map<String,List<String>> requiredFields = new HashMap<String,List<String>>();/** * 批量设置不想被添加到tld文件中的属性 * @author xiexj * @param noWantDefinedFields */public static void setNoWantDefinedFields(List<String> noWantDefinedFields){for(int i=0;noWantDefinedFields!=null&&i<noWantDefinedFields.size();i++){TldFileGenerator.noWantDefinedFields.add(noWantDefinedFields.get(i));}}/** * 批量设置必须填写的属性 * @author xiexj * @param requiredFields */public static void setRequiredFields(String className,List<String> requiredFields){TldFileGenerator.requiredFields.put(className, requiredFields);}/** * 生成Tld文件 * @author xiexj * @param fileName 文件名 * @param fileCreatePath 保存路径 * @param shortName tag shortname * @param tagObjMap 以tag的name为键,类路径为值的哈希表 */public static void createTld(String fileName,String fileCreatePath,String shortName,Map<String,String> tagObjMap){initNoWantDefinedField();StringBuffer sgb = createTagFileHeader(shortName);sgb = createTagFileBody(sgb, tagObjMap);sgb = createTagFileFooter(sgb);fileOutput(fileName, fileCreatePath, sgb);}/* * 输出tld文件 * @param fileName * @param fileCreatePath * @param tagFile */private static void fileOutput(String fileName,String fileCreatePath,StringBuffer tagFile){BufferedOutputStream bos = null;try{bos = new BufferedOutputStream(new FileOutputStream(new File(fileCreatePath+fileName+".tld")));bos.write(tagFile.toString().getBytes());}catch(IOException e){e.printStackTrace();}finally{try {bos.close();} catch (IOException e) {}}}/** * 得到需要添加到标签库中的属性 * 获取当前对象以及父类的属性 * key为处理方式 value为属性列表 */protected static Map<Integer,Set<String>> getTagDefineFields(Object obj,Map<Integer,Set<String>> fieldNameMap){Field[] fields = null;List<Field> list=new ArrayList<Field>();getFields(obj.getClass(), list);fields=list.toArray(new Field[list.size()]);if(fields!=null&&fields.length>0){List<String> requiredField=requiredFields.get(obj.getClass().getName());Map<Integer,Set<String>> map = fieldNameMap;if(map==null) map = new HashMap<Integer,Set<String>>();for(int i=0;i<fields.length;i++){fields[i].setAccessible(true);String fieldName = fields[i].getName();if(noWantDefinedFields.contains(fieldName)) continue;if(requiredField.contains(fieldName)){Set<String> rfList = map.get(TldFileGenerator.REQUIRED_FIELD);if(rfList==null){rfList = new HashSet<String>();map.put(TldFileGenerator.REQUIRED_FIELD, rfList);}rfList.add(fieldName);}else{Set<String> pfList = map.get(TldFileGenerator.P_FIELD);if(pfList==null){pfList = new HashSet<String>();map.put(TldFileGenerator.P_FIELD, pfList);}pfList.add(fieldName);}}return map;}return fieldNameMap;}/** * 得到所有的字段包括父类 * @param clz * @param fields */protected static void getFields(Class clz,List<Field> fields){if(clz==BodyTagSupport.class||clz== TagSupport.class){return;}else{Field[] field=clz.getDeclaredFields();for(Field f:field){fields.add(f);}getFields(clz.getSuperclass(),fields);}}/** * 得到该标签对象的所有要添加的属性 * @param obj * @return */protected static Map<Integer,Set<String>> getTagObjAllFields(Object obj){return getTagDefineFields(obj, null);}/** * 创建文件体 */private static StringBuffer createTagFileBody(StringBuffer sgf,Map<String,String> tagObjMap){Set<String> keySet = tagObjMap.keySet();for(String name : keySet){String clazz = tagObjMap.get(name);try {Object obj = Class.forName(clazz).newInstance();Map<Integer,Set<String>> fieldsMap = getTagObjAllFields(obj);if(fieldsMap!=null){sgf.append("\t<tag>");sgf.append("\n");sgf.append("\t\t<name>"+name+"</name>");sgf.append("\n");sgf.append("\t\t<tagclass>"+clazz+"</tagclass>");sgf.append("\n");Set<String> fields = fieldsMap.get(TldFileGenerator.REQUIRED_FIELD);if(fields!=null&&fields.size()>0){for(String attr : fields){sgf.append("\t\t<attribute>");sgf.append("\n");sgf.append("\t\t\t<name>"+attr+"</name>");sgf.append("\n");sgf.append("\t\t\t<required>true</required>");sgf.append("\n");sgf.append("\t\t\t<rtexprvalue>false</rtexprvalue>");sgf.append("\n");sgf.append("\t\t</attribute>");sgf.append("\n");}}fields = fieldsMap.get(TldFileGenerator.P_FIELD);if(fields!=null&&fields.size()>0){for(String attr : fields){sgf.append("\t\t<attribute>");sgf.append("\n");sgf.append("\t\t\t<name>"+attr+"</name>");sgf.append("\n");sgf.append("\t\t\t<required>false</required>");sgf.append("\n");sgf.append("\t\t\t<rtexprvalue>false</rtexprvalue>");sgf.append("\n");sgf.append("\t\t</attribute>");sgf.append("\n");}}sgf.append("\t</tag>");sgf.append("\n");sgf.append("\n");}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}return sgf;}/** * 创建头部内容 * @return */protected static StringBuffer createTagFileHeader(String shortName){StringBuffer sgb = new StringBuffer();sgb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");sgb.append("\n");sgb.append("<!DOCTYPE taglib PUBLIC \"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN\"");sgb.append("\n");sgb.append("\"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd\">");sgb.append("\n\n");sgb.append("<taglib>");sgb.append("\n");sgb.append("\t<tlibversion>1.0</tlibversion>");sgb.append("\n");sgb.append("\t<jspversion>1.1</jspversion>");sgb.append("\n");sgb.append("\t<shortname>"+shortName+"</shortname>");sgb.append("\n");return sgb;}/** * 创建尾部内容 * @param sgb * @return */protected static StringBuffer createTagFileFooter(StringBuffer sgb){sgb.append("</taglib>");return sgb;}/** * 初始化不想被添加到tld文件的属性 */protected static void initNoWantDefinedField(){noWantDefinedFields.add("serialVersionUID");}public static void main(String[] args) {//初始化String classPrefix = "org.ts.taglib.html.";//包名称Map<String,String> tagObjMap = new HashMap<String,String>();//文本List<String> requiredFieldOfTextTag = new ArrayList<String>();//必须字段requiredFieldOfTextTag.add("label");requiredFieldOfTextTag.add("name");setRequiredFields(classPrefix+"TextTag",requiredFieldOfTextTag);//文本域List<String> requiredFieldOfTextareaTag = new ArrayList<String>();//必须字段requiredFieldOfTextareaTag.add("label");requiredFieldOfTextareaTag.add("name");requiredFieldOfTextareaTag.add("cols");requiredFieldOfTextareaTag.add("rows");setRequiredFields(classPrefix+"TextareaTag",requiredFieldOfTextareaTag);//单选按钮List<String> requiredFieldOfRadioTag = new ArrayList<String>();//必须字段requiredFieldOfRadioTag.add("label");requiredFieldOfRadioTag.add("name");requiredFieldOfRadioTag.add("value");setRequiredFields(classPrefix+"RadioTag",requiredFieldOfRadioTag);//密码 List<String> requiredFieldOfPasswordTag = new ArrayList<String>();//必须字段requiredFieldOfPasswordTag.add("label");requiredFieldOfPasswordTag.add("name");setRequiredFields(classPrefix+"PasswordTag",requiredFieldOfPasswordTag);//JAVASCRIPT List<String> requiredFieldOfJavaScriptTag = new ArrayList<String>();//必须字段requiredFieldOfJavaScriptTag.add("name");setRequiredFields(classPrefix+"JavaScriptTag",requiredFieldOfJavaScriptTag);//图片List<String> requiredFieldOfImgTag = new ArrayList<String>();//必须字段requiredFieldOfImgTag.add("src");requiredFieldOfImgTag.add("name");setRequiredFields(classPrefix+"ImgTag",requiredFieldOfImgTag);//文件List<String> requiredFieldOfFileTag = new ArrayList<String>();//必须字段requiredFieldOfFileTag.add("label");requiredFieldOfFileTag.add("name");setRequiredFields(classPrefix+"FileTag",requiredFieldOfFileTag);//日期List<String> requiredFieldOfDatePickerTag = new ArrayList<String>();//必须字段requiredFieldOfDatePickerTag.add("label");requiredFieldOfDatePickerTag.add("name");setRequiredFields(classPrefix+"DatePickerTag",requiredFieldOfDatePickerTag);//下拉列表List<String> requiredFieldOfComboxTag = new ArrayList<String>();//必须字段requiredFieldOfComboxTag.add("label");requiredFieldOfComboxTag.add("name");requiredFieldOfComboxTag.add("data");setRequiredFields(classPrefix+"ComboxTag",requiredFieldOfComboxTag);//复选框List<String> requiredFieldOfCheckboxTag = new ArrayList<String>();//必须字段requiredFieldOfCheckboxTag.add("label");requiredFieldOfCheckboxTag.add("name");requiredFieldOfCheckboxTag.add("value");setRequiredFields(classPrefix+"CheckboxTag",requiredFieldOfCheckboxTag);//按钮List<String> requiredFieldOfButtonTag = new ArrayList<String>();//必须字段requiredFieldOfButtonTag.add("label");requiredFieldOfButtonTag.add("name");setRequiredFields(classPrefix+"ButtonTag",requiredFieldOfButtonTag);//树List<String> requiredFieldOfTreeTag = new ArrayList<String>();//必须字段requiredFieldOfTreeTag.add("path");requiredFieldOfTreeTag.add("name");requiredFieldOfTreeTag.add("nodes");setRequiredFields(classPrefix+"TreeTag",requiredFieldOfTreeTag);//表格List<String> requiredFieldOfTableTag = new ArrayList<String>();//必须字段requiredFieldOfTableTag.add("name");requiredFieldOfTableTag.add("data");requiredFieldOfTableTag.add("multiple");setRequiredFields(classPrefix+"TableTag",requiredFieldOfTableTag);//可编辑的表格List<String> requiredFieldOfEditTableTag = new ArrayList<String>();//必须字段requiredFieldOfEditTableTag.add("name");requiredFieldOfEditTableTag.add("data");setRequiredFields(classPrefix+"EditTableTag",requiredFieldOfEditTableTag);//列List<String> requiredFieldOfColumnTag = new ArrayList<String>();//必须字段requiredFieldOfColumnTag.add("name");requiredFieldOfColumnTag.add("lable");requiredFieldOfColumnTag.add("type");requiredFieldOfColumnTag.add("data");setRequiredFields(classPrefix+"ColumnTag",requiredFieldOfColumnTag);//TSTD.tld filetagObjMap.put("text", classPrefix+"TextTag");tagObjMap.put("textarea", classPrefix+"TextareaTag");tagObjMap.put("radio", classPrefix+"RadioTag");tagObjMap.put("password", classPrefix+"PasswordTag");tagObjMap.put("javascript", classPrefix+"JavaScriptTag");tagObjMap.put("img", classPrefix+"ImgTag");tagObjMap.put("file", classPrefix+"FileTag");tagObjMap.put("date", classPrefix+"DatePickerTag");tagObjMap.put("combox", classPrefix+"ComboxTag");tagObjMap.put("checkbox", classPrefix+"CheckboxTag");tagObjMap.put("button", classPrefix+"ButtonTag");tagObjMap.put("tree", classPrefix+"TreeTag");tagObjMap.put("table", classPrefix+"TableTag");tagObjMap.put("editTable", classPrefix+"EditTableTag");tagObjMap.put("column", classPrefix+"ColumnTag");createTld("TSTD", "f:\\", "tstd", tagObjMap);}}
- Tld文件生成器
- struts-html.tld 等等tld文件
- TLD文件配置详解
- JSP中的Tld文件
- myfn.tld文件错误
- 自定义标签文件--tld注意事项
- tld标签文件配置问题
- 标签库描述文件TLD
- 项目中tld文件使用
- el自定义方法tld文件
- TLD
- TLD
- tld
- TLD
- TLD
- TLD
- struts-bean.tld,struts-html.tld,struts-logic.tld 文件的作用
- JSP中的TAG文件和TLD文件
- 非递归中序遍历二叉树
- Java连接数据库(3)
- commons-configuration.jar读取资源文件
- http://picano.blog.163.com/blog/static/3108297620101112114513648/
- 10个最新的开发者工具
- Tld文件生成器
- 七夕感怀
- 电脑报专访微软亚洲研究院院长洪小文
- java static 代码块的应用
- linux 进程管理
- 摩根斯坦利2013年机试题(一) 嵌套类
- TreeSet类的排序问题
- PWM
- 摆脱浏览器束缚的一项灵活http加密技术