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);}}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 股东迟迟不交齐股本金怎么办 wps转pdf就乱了怎么办 被有用分期骗了怎么办 找不到以前有用分期的账号怎么办 打工去韩国不懂韩语怎么办? 想去韩国整容没钱怎么办 专接本没接上怎么办 抄写经文写错了怎么办 在外地修车被宰怎么办 国外汇款公司名称写错了怎么办 增值税专票没有机器编码怎么办 发票右上角的编码打不全怎么办 税票名称开错了怎么办 开票名称开错了怎么办 退休党员不交党费怎么办 cad打不出来字怎么办 用cad打不出来字怎么办 打字总打错字母怎么办 mac做ppt卡住了怎么办 mac的ppt卡住了怎么办 淘宝店铺被屏蔽了怎么办 淘宝申请售后卖家拒绝怎么办 淘宝投诉卖家入口关闭怎么办 遇见最喜欢孩子的父母怎么办 房屋备案表丢了怎么办 淘宝发布商品没有品牌怎么办 电子发票名称写错了怎么办 合同写错了划掉怎么办 进京证日期错了怎么办 买车时谈的协议与合同不一致怎么办 新车上牌找不到流水号怎么办 开票数量比入库数量少怎么办 我贷款的app忘了怎么办 网贷名字忘了怎么办 附件太大邮件发不出去怎么办 孩子出生足印单子丢了怎么办 保险名字写错了怎么办 行驶证和身份证名字不一样怎么办 上户后发现合格证和车不一样怎么办 新车上户重量不一样怎么办 医保卡和身份证名字不一样怎么办