首先用到了ServletContext,全局容器的概念,之前不知道哪里有用,现在用到,这里解析的是一个sysCode的TAG,用于下拉框等选项的时候自动显示要选的内容。大致思路是,利用前一篇所说到的ESB服务器,先去注册一个获取sysCode的服务,然后存进ServletContext,其他模块使用的时候(CodeTag)直接在容器里面获取即可.

放入ServletContext步骤
 
  1. public void init ()throws ServletException {
  2. WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
  3. ServletContext servletContext = webApplicationContext.getServletContext();
  4. Properties prop = new Properties();
  5. InputStream in = null;
  6. try {
  7. //读取配置文件
  8. in = DictionaryCacheListener.class.getClassLoader().getResourceAsStream("codeutil.properties");
  9. prop.load(in);
  10. String property = prop.getProperty("syscode");//获取配置
  11. String ctx = prop.getProperty("ctx");
  12. if (StringUtils.isEmpty(ctx)) {
  13. ctx = servletContext.getContextPath();
  14. }
  15. servletContext.setAttribute("ctx", ctx);
  16. Map map = new HashMap();
  17. map.put("data", property);
  18. AjaxPageResponse ajaxPageResponse = EsbUtil.call(ESBService.common.GETSYSCODE, map);
  19. List list = ajaxPageResponse.getData();
  20. String result = JSON.toJSONString(list.get(0));
  21. ObjectMapper mapper = new ObjectMapper();
  22. Map<String,List> data = mapper.readValue(result, Map.class);
  23. servletContext.setAttribute("code", data);//放入code data
  24. in.close();
  25. } catch (Exception e) {
  26. logger.error("获取系统编码出错",e);
  27. }finally{
  28. if ( null != in) {
  29. try {
  30. in.close();
  31. } catch (IOException e) {
  32. logger.error("资源关闭失败",e);
  33. }
  34. }
  35. }
  36. }
  37.  
  38. }

写成tag需要的类文件CondeTag

  1. public class CodeTag extends SimpleTagSupport{
  2. //编码名称
  3. private String sysCode;
  4. //编码值 (非必填)
  5. private String value;
  6. /*
  7. * 忽略不显示(编码值) 当该值不为空时 对应的编码字段不出现
  8. */
  9. private String ignore;
  10. /*
  11. * id属性
  12. */
  13. private String id;
  14. /*
  15. * name 属性
  16. */
  17. private String name;
  18. /*
  19. * 下拉框是否必填
  20. */
  21. private String required;
  22. /*
  23. * 标签类型
  24. */
  25. private String type;
  26. /*
  27. * 是否不可编辑
  28. */
  29. private String disabled;
  30. /*
  31. * 过滤器
  32. */
  33. private String filter;
  34. /*
  35. * class 样式
  36. */
  37. private String cssclass;
  38.  
  39. /*
  40. * bootstrap
  41. */
  42. private String bootstrap;
  43.  
  44. public String getId() {
  45. return id;
  46. }
  47.  
  48. public void setId(String id) {
  49. this.id = id;
  50. }
  51.  
  52. public String getCssclass() {
  53. return cssclass;
  54. }
  55.  
  56. public void setCssclass(String cssclass) {
  57. this.cssclass = cssclass;
  58. }
  59.  
  60. public String getFilter() {
  61. return filter;
  62. }
  63.  
  64. public void setFilter(String filter) {
  65. this.filter = filter;
  66. }
  67.  
  68. public String getDisabled() {
  69. return disabled;
  70. }
  71.  
  72. public void setDisabled(String disabled) {
  73. this.disabled = disabled;
  74. }
  75.  
  76. public String getType() {
  77. return type;
  78. }
  79.  
  80. public void setType(String type) {
  81. this.type = type;
  82. }
  83.  
  84. public String getRequired() {
  85. return required;
  86. }
  87.  
  88. public void setRequired(String required) {
  89. this.required = required;
  90. }
  91.  
  92. public String getName() {
  93. return name;
  94. }
  95.  
  96. public void setName(String name) {
  97. this.name = name;
  98. }
  99.  
  100. public String getIgnore() {
  101. return ignore;
  102. }
  103.  
  104. public void setIgnore(String ignore) {
  105. this.ignore = ignore;
  106. }
  107.  
  108. public String getValue() {
  109. return value;
  110. }
  111.  
  112. public void setValue(String value) {
  113. this.value = value;
  114. }
  115.  
  116. public String getSysCode() {
  117. return sysCode;
  118. }
  119.  
  120. public void setSysCode(String sysCode) {
  121. this.sysCode = sysCode;
  122. }
  123.  
  124. public String getBootstrap() {
  125. return bootstrap;
  126. }
  127.  
  128. public void setBootstrap(String bootstrap) {
  129. this.bootstrap = bootstrap;
  130. }
  131.  
  132. @Override
  133. public void doTag() throws JspException, IOException {
  134. String json = null;
  135. WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
  136. ServletContext servletContext = webApplicationContext.getServletContext();
  137. Object attribute = servletContext.getAttribute("code");//将servletContext里面的code取出来???
  138. Map<String, String> map = (Map<String, String>)attribute;
  139. this.sysCode=sysCode.toLowerCase();//避免出现大小写 统一处理
  140. json = map.get(sysCode);//将key为syscode的取出来封装成一个json
  141. List<Map<String, String>> list = (List) JSONArray.parseArray(json, new HashMap<String,String>().getClass());
  142. JspWriter out = getJspContext().getOut();
  143. if (!StringUtils.isEmpty(type)) {
  144. //标签
  145. StringBuilder stringBuilder = new StringBuilder();
  146. if ("select".equals(type)) {
  147. //下拉框
  148. stringBuilder.append("<select name=").append('"').append(name).append('"');
  149. //id
  150. if (!StringUtils.isEmpty(id)) {
  151. stringBuilder.append(" id ='").append(id+"'");
  152. }
  153. //class 样式
  154. if (!StringUtils.isEmpty(cssclass)) {
  155. stringBuilder.append(" class='").append(cssclass+"'");
  156. }
  157. //添加是否必填校验
  158. if (CodeUtil.YESNO.YESNO_YES.equals(required)) {
  159. stringBuilder.append(" lay-verify='required'");
  160. //兼容bootstrap
  161. stringBuilder.append(" datatype='*'");
  162. }
  163. //添加是否可以编辑
  164. if (CodeUtil.YESNO.YESNO_YES.equals(disabled)) {
  165. stringBuilder.append(" disabled='disabled'");
  166. }
  167. //添加过滤器方法
  168. if (!StringUtils.isEmpty(filter)) {
  169. stringBuilder.append(" lay-filter='").append(filter+"'");
  170. }
  171. stringBuilder.append(">");
  172. stringBuilder.append("<option value=''>请选择</option>");
  173. //List<Map<String, String>> list = (List) JSONArray .parseArray(json, new HashMap<String,String>().getClass());
  174. for (int i = 0; i < list.size(); i++) {
  175. boolean flag = false;
  176. if (!StringUtils.isEmpty(ignore)) {
  177. String[] strs = ignore.split(",");
  178. for(String s:strs) {
  179. if (s.equals(list.get(i).get("codevalue"))) {
  180. flag=true;
  181. }
  182. }
  183. }
  184. if (flag) {
  185. continue;//是过滤内容就不执行下面的代码而是重头来一遍
  186. }
  187. stringBuilder.append("<option value='").append(list.get(i).get("codevalue")).append("'");
  188. if (list.get(i).get("codevalue").equals(value)) {
  189. stringBuilder.append(" selected='selected'");
  190. }
  191. stringBuilder.append(">").append(list.get(i).get("codename")).append("</option>");
  192. }
  193. stringBuilder.append("<select>");
  194. }else if ("radio".equals(type)) {
  195. //单选框
  196. //List<Map<String, String>> list = (List) JSONArray .parseArray(json, new HashMap<String,String>().getClass());
  197. for (int i = 0; i < list.size(); i++) {
  198. if (!StringUtils.isEmpty(ignore) && ignore.equals(list.get(i).get("codevalue"))) {
  199. continue;
  200. }
  201. if (CodeUtil.YESNO.YESNO_YES.equals(disabled)) {
  202. stringBuilder.append("<label for='").append(name+"_"+i).append("'>");
  203. stringBuilder.append("<input type='radio' name='").append(name+"' ").append("value='").append(list.get(i).get("codevalue")+"'");
  204. stringBuilder.append(" title='").append(list.get(i).get("codename")+"'").append(" disabled='disabled'");
  205. stringBuilder.append(" id='").append(name+"_"+i+"' ");
  206. }else {
  207. stringBuilder.append("<label for='").append(name+"_"+i).append("'>");
  208. stringBuilder.append("<input type='radio' name='").append(name+"' ").append("value='").append(list.get(i).get("codevalue")+"'");
  209. stringBuilder.append(" title='").append(list.get(i).get("codename")+"'");
  210. stringBuilder.append(" id='").append(name+"_"+i+"' ");
  211. }
  212. if (list.get(i).get("codevalue").equals(value)) {
  213. stringBuilder.append(" checked=''");
  214. }
  215. //为避免空值提交 默认第一个选中
  216. if (StringUtils.isEmpty(value) && i==0) {
  217. stringBuilder.append("checked=''");
  218. }
  219. if (!StringUtils.isEmpty(filter)) {
  220. stringBuilder.append(" lay-filter='").append(filter+"'");
  221. }
  222. if (!StringUtils.isEmpty(cssclass)) {
  223. stringBuilder.append(" class='").append(cssclass+"'");
  224. }
  225. stringBuilder.append(" >");
  226. if(CodeUtil.YESNO.YESNO_YES.equals(bootstrap)){
  227. //添加单选框的名称(兼容bootstrap)
  228. stringBuilder.append("<span>");
  229. stringBuilder.append(list.get(i).get("codename"));
  230. stringBuilder.append("</span>");
  231. }
  232. stringBuilder.append("</label>");
  233. }
  234.  
  235. }else if("checkbox".equals(type)){//复选框没有做诶
  236. //复选框
  237.  
  238. }
  239. out.write(stringBuilder.toString());
  240. }else {
  241. //返回列表数据字典
  242. if (StringUtils.isEmpty(value)) {
  243. StringBuilder stringBuilder = new StringBuilder();
  244. stringBuilder.append("<script>");
  245. stringBuilder.append(" var data_").append(sysCode).append("=");
  246. stringBuilder.append(json);
  247. stringBuilder.append(";");
  248. stringBuilder.append("function ");
  249. stringBuilder.append(sysCode);
  250. stringBuilder.append("(value){");
  251. stringBuilder.append("for( var i=0;i<data_").append(sysCode).append(".length;i++){");
  252. stringBuilder.append("if(value==data_").append(sysCode).append("[i].codevalue){");
  253. stringBuilder.append("return data_").append(sysCode).append("[i].codename;");
  254. stringBuilder.append("}");
  255. stringBuilder.append("}");
  256. stringBuilder.append("}");
  257. stringBuilder.append("</script>");
  258. out.write(stringBuilder.toString());
  259. }else {
  260. /**
  261. * 定义 str 为 "" 主要在于JspWriter.out() null时会报空指针异常
  262. * JspWriter.print() 可以避免空指针 但是当为null 时会输出为'null'字符串
  263. */
  264. String str = "";
  265. //返回对应字符编码
  266. //List<Map<String, String>> list = (List) JSONArray .parseArray(json, new HashMap<String,String>().getClass());
  267. for (int i = 0; i < list.size(); i++) {
  268. Map<String, String> map2 = list.get(i);
  269. if (value.equals(map2.get("codevalue"))) {
  270. if (!value.equals(ignore)) {
  271. str = map2.get("codename");
  272. }
  273. }
  274. }
  275. out.write(str);
  276. }
  277. }
  278. }
  279.  
  280. }

JSP tag的封装

  1. <?xml version="1.0" encoding="GBK"?>
  2. <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
  5. version="2.0">
  6. <tlib-version>1.0</tlib-version>
  7. <short-name>syscode</short-name>
  8. <!-- 这个属性非常重要,它指定该标签库的 URI,相当于指定该标签库的唯一标识。如上粗体字代码所示,JSP 页面中使用标签库时就是根据该 URI 属性来定位标签库的 -->
  9. <uri>http://www.ylzinfo.com/syscodelib</uri>
  10. <!-- 定义第一个标签 -->
  11. <tag>
  12. <!-- 定义标签名 该标签库的名称,这个属性很重要,JSP 页面中就是根据该名称来使用此标签的-->
  13. <name>sysCode</name>
  14. <!-- 定义标签处理类 指定标签的处理类,毋庸置疑,这个属性非常重要,指定了标签由哪个 Java 类来处理 -->
  15. <tag-class>com.ylzinfo.tag.CodeTag</tag-class>
  16. <!-- body-content:这个属性也很重要,它指定标签体内容。该元素的值可以是如下几个:
  17. tagdependent:指定标签处理类自己负责处理标签体。
  18. empty:指定该标签只能作用空标签使用。
  19. scriptless:指定该标签的标签体可以是静态 HTML 元素,表达式语言,但不允许出现 JSP 脚本。
  20. JSP:指定该标签的标签体可以使用 JSP 脚本。 -->
  21. <body-content>empty</body-content>
  22. <attribute>
  23. <description>编码名称</description>
  24. <name>sysCode</name>
  25. <required>true</required>
  26. </attribute>
  27. <!-- 值 -->
  28. <attribute>
  29. <description>编码值</description>
  30. <name>value</name>
  31. <required>false</required>
  32. <rtexprvalue>true</rtexprvalue>
  33. </attribute>
  34. <!-- 忽略syscode codevalue 的值 过滤 不显示 -->
  35. <attribute>
  36. <description>忽略值</description>
  37. <name>ignore</name>
  38. <required>false</required>
  39. <rtexprvalue>true</rtexprvalue>
  40. </attribute>
  41. <!-- 控件类型 下拉 单选 多选 -->
  42. <attribute>
  43. <description>控件类型下拉、单选、多选</description>
  44. <name>type</name>
  45. <required>false</required>
  46. <rtexprvalue>true</rtexprvalue>
  47. </attribute>
  48. <!-- 控件id值 -->
  49. <attribute>
  50. <description>控件id</description>
  51. <name>id</name>
  52. <required>false</required>
  53. <rtexprvalue>true</rtexprvalue>
  54. </attribute>
  55. <!-- 控件name值 -->
  56. <attribute>
  57. <description>控件name属性</description>
  58. <name>name</name>
  59. <required>false</required>
  60. <rtexprvalue>true</rtexprvalue>
  61. </attribute>
  62. <!-- 是否必填 -->
  63. <attribute>
  64. <description>是否必填</description>
  65. <name>required</name>
  66. <required>false</required>
  67. <rtexprvalue>true</rtexprvalue>
  68. </attribute>
  69. <!-- 是否为bootstrap(兼容layerui) -->
  70. <attribute>
  71. <description>是否bootstrap</description>
  72. <name>bootstrap</name>
  73. <required>false</required>
  74. <rtexprvalue>true</rtexprvalue>
  75. </attribute>
  76. <!-- 是否只读不可编辑 -->
  77. <attribute>
  78. <description>是否不可编辑</description>
  79. <name>disabled</name>
  80. <required>false</required>
  81. <rtexprvalue>true</rtexprvalue>
  82. </attribute>
  83. <!-- 过滤器 -->
  84. <attribute>
  85. <name>filter</name>
  86. <required>false</required>
  87. <rtexprvalue>true</rtexprvalue>
  88. </attribute>
  89. <!-- class样式 -->
  90. <attribute>
  91. <description>控件class属性</description>
  92. <name>cssclass</name>
  93. <required>false</required>
  94. <rtexprvalue>true</rtexprvalue>
  95. </attribute>
  96.  
  97. </tag>
  98. </taglib>

一个简单的使用

  1. <syscode:sysCode sysCode="aac004"/>
  2. <syscode:sysCode sysCode="bysjs_status"/>
  3. <syscode:sysCode sysCode="EDULEVEL"/>
  4. <!--jsp文件开头就写上,用于查看code,方便调试-->
  5.  
  6. <syscode:sysCode sysCode="bysjs_status" type="select" name="status" id="status" cssclass="form-control selectpicker"/>
  7. <!--具体使用-->

ylz框架外网之JSP 自定义TAG的更多相关文章

  1. Jsp 自定义tag标签

    1转自:https://blog.csdn.net/yusimiao/article/details/46835617 Jsp自定义tag标签 自定义tag标签的好处 程序员可以自定一些特定功能的标记 ...

  2. YLZ开发外网前端

    YLZ外网前端使用的是boottstrap和layer和validform等插件 表格是用boottstrap的tablle加上框架人员开发的ajaxpageresponse进行协调开发 弹窗使用的l ...

  3. JSP自定义tag控件标签

    JSP支持自定tag的方法,那就是直接讲JSP代码保存成*.tag或者*.tagx的标签定义文件.tag和tagx文件不仅支持经典jsp代码,各种标签模版代码,还支持xml样式的jsp指令代码. 按照 ...

  4. JSP自定义tag

    前端需要调用后端的配置,想起velocity-tools.然而jsp的话,目前只能想到tag和EL表达式了. Tag相当好写,jsp2.0提供了简化写法: 编写一个java类: public clas ...

  5. JSTL+EL表达式+JSP自定义框架案例

    不会框架不要紧,我带你自定义框架 前言:这标题说的有点大了,当一回标题党,之前在学JSP的时候提到了JSTL和EL表达式,由于一直钟情于Servlet,迟迟没有更新别的,这回算是跳出来了.这回放个大招 ...

  6. jsp如何自定义tag的标签库?

    虽然和上一次的使用自定义的tld标签简化jsp的繁琐操作的有点不同,但是目的也是一致的.自定义tag比较简单. 1.新建tag标签 在WEB-INF目录下新建一个tags的文件夹,是自定义tag标签的 ...

  7. 自定义标签 与 JSTL(JSP Standard Tag Library)

    1.自定义标签 [理解]     [1]简介            > 在JSP2.0以后,在jsp页面中不建议使用脚本片段<% %>和JSP表达式<%= %>     ...

  8. JSP自定义标签之Hello Costom tag小例子

    1.项目结构 2.实现自定义tag所需依赖 <dependency> <groupId>javax.servlet</groupId> <artifactId ...

  9. 总想自己动动手系列·1·本地和外网(Liunx服务器上部署的web项目)按照自定义的报文格式进行交互(准备篇)

    一.准备工作 (1)有一台属于自己的云服务器,并成功部署和发布一个web项目(当然,本质上来说Java-Project也没问题),通过外网IP可以正常访问该web项目. 需要说明的是:任何web项目, ...

随机推荐

  1. 将本地项目推送至gitee或者github

    将本地项目推送到Git github上的版本和本地版本冲突的解决方法 初始化项目时,在git中新建项目. 在Github中创建了一个Repository之后,会给你列出如何将自己本地项目Push到Gi ...

  2. ajax实现给JavaScript中全局变量赋值(转)

    原文地址:ajax实现给JavaScript中全局变量赋值 问题简化: <script type="text/javascript"> var a=1 ; functi ...

  3. 部署项目到linux中报Spring MVC报异常:org.springframework.web.util.NestedServletException: Request processing failed

    @RequestMapping(value = "/security/login", method = RequestMethod.POST) public ModelAndVie ...

  4. Python爬虫关于多层嵌套iframe的解决

    近期由于公司资源需要,我爬取了一个视频网站,结果以为一个很容易的小爬虫,却步步是坑啊,费了一天终于都解决了(太菜了!!!). 前面导航页的爬虫就不多说了,无非就是webdriver和PhantomJS ...

  5. 用mobiscroll.js如何简单使用日期控件

    首先,可以到官网学习,地址:https://docs.mobiscroll.com 第一步:引用js.css样式 1)mobiscroll.css 2)mobiscroll_date.css 3)jq ...

  6. Easyui的datagrid的editor(行编辑器)如何扩展datetimebox类型

    在easyui的datagrid扩展方法中添加这样的时间日期(datetimebox)代码块 放在   $.extend($.fn.datagrid.defaults.editors,{datetim ...

  7. git merge branch

    git branch   look at your branches git branch newbranch git checkout newbrach do something git check ...

  8. Daily record-July

    July11. Nonsense! 胡说八道!2. Who cares! 谁管你呀!3. It's on me.. 我来付.4. It's a deal. 一言为定.5. I've done my b ...

  9. 服务消费和负载(Ribbon)

    使用RestTemplate调用服务 在上一篇教程中,我们是这样调用服务的,先通过 LoadBalancerClient 选取出对应的服务,然后使用 RestTemplate 进行远程调用. Load ...

  10. 普通程序员,三年成为年薪70w架构师,只因做到了这些

    每个程序员.或者说每个工作者都应该有自己的职业规划,如果你不是富二代,不是官二代,也没有职业规划,希望你可以思考一下自己的将来.今天给大家分享的是一篇来自阿里Java架构师对普通程序员的职业建议,希望 ...