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

放入ServletContext步骤
 
public void init ()throws ServletException {
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
ServletContext servletContext = webApplicationContext.getServletContext();
Properties prop = new Properties();
InputStream in = null;
try {
//读取配置文件
in = DictionaryCacheListener.class.getClassLoader().getResourceAsStream("codeutil.properties");
prop.load(in);
String property = prop.getProperty("syscode");//获取配置
String ctx = prop.getProperty("ctx");
if (StringUtils.isEmpty(ctx)) {
ctx = servletContext.getContextPath();
}
servletContext.setAttribute("ctx", ctx);
Map map = new HashMap();
map.put("data", property);
AjaxPageResponse ajaxPageResponse = EsbUtil.call(ESBService.common.GETSYSCODE, map);
List list = ajaxPageResponse.getData();
String result = JSON.toJSONString(list.get(0));
ObjectMapper mapper = new ObjectMapper();
Map<String,List> data = mapper.readValue(result, Map.class);
servletContext.setAttribute("code", data);//放入code data
in.close();
} catch (Exception e) {
logger.error("获取系统编码出错",e);
}finally{
if ( null != in) {
try {
in.close();
} catch (IOException e) {
logger.error("资源关闭失败",e);
}
}
}
} }

写成tag需要的类文件CondeTag

public class CodeTag extends SimpleTagSupport{
//编码名称
private String sysCode;
//编码值 (非必填)
private String value;
/*
* 忽略不显示(编码值) 当该值不为空时 对应的编码字段不出现
*/
private String ignore;
/*
* id属性
*/
private String id;
/*
* name 属性
*/
private String name;
/*
* 下拉框是否必填
*/
private String required;
/*
* 标签类型
*/
private String type;
/*
* 是否不可编辑
*/
private String disabled;
/*
* 过滤器
*/
private String filter;
/*
* class 样式
*/
private String cssclass; /*
* bootstrap
*/
private String bootstrap; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getCssclass() {
return cssclass;
} public void setCssclass(String cssclass) {
this.cssclass = cssclass;
} public String getFilter() {
return filter;
} public void setFilter(String filter) {
this.filter = filter;
} public String getDisabled() {
return disabled;
} public void setDisabled(String disabled) {
this.disabled = disabled;
} public String getType() {
return type;
} public void setType(String type) {
this.type = type;
} public String getRequired() {
return required;
} public void setRequired(String required) {
this.required = required;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getIgnore() {
return ignore;
} public void setIgnore(String ignore) {
this.ignore = ignore;
} public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
} public String getSysCode() {
return sysCode;
} public void setSysCode(String sysCode) {
this.sysCode = sysCode;
} public String getBootstrap() {
return bootstrap;
} public void setBootstrap(String bootstrap) {
this.bootstrap = bootstrap;
} @Override
public void doTag() throws JspException, IOException {
String json = null;
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
ServletContext servletContext = webApplicationContext.getServletContext();
Object attribute = servletContext.getAttribute("code");//将servletContext里面的code取出来???
Map<String, String> map = (Map<String, String>)attribute;
this.sysCode=sysCode.toLowerCase();//避免出现大小写 统一处理
json = map.get(sysCode);//将key为syscode的取出来封装成一个json
List<Map<String, String>> list = (List) JSONArray.parseArray(json, new HashMap<String,String>().getClass());
JspWriter out = getJspContext().getOut();
if (!StringUtils.isEmpty(type)) {
//标签
StringBuilder stringBuilder = new StringBuilder();
if ("select".equals(type)) {
//下拉框
stringBuilder.append("<select name=").append('"').append(name).append('"');
//id
if (!StringUtils.isEmpty(id)) {
stringBuilder.append(" id ='").append(id+"'");
}
//class 样式
if (!StringUtils.isEmpty(cssclass)) {
stringBuilder.append(" class='").append(cssclass+"'");
}
//添加是否必填校验
if (CodeUtil.YESNO.YESNO_YES.equals(required)) {
stringBuilder.append(" lay-verify='required'");
//兼容bootstrap
stringBuilder.append(" datatype='*'");
}
//添加是否可以编辑
if (CodeUtil.YESNO.YESNO_YES.equals(disabled)) {
stringBuilder.append(" disabled='disabled'");
}
//添加过滤器方法
if (!StringUtils.isEmpty(filter)) {
stringBuilder.append(" lay-filter='").append(filter+"'");
}
stringBuilder.append(">");
stringBuilder.append("<option value=''>请选择</option>");
//List<Map<String, String>> list = (List) JSONArray .parseArray(json, new HashMap<String,String>().getClass());
for (int i = 0; i < list.size(); i++) {
boolean flag = false;
if (!StringUtils.isEmpty(ignore)) {
String[] strs = ignore.split(",");
for(String s:strs) {
if (s.equals(list.get(i).get("codevalue"))) {
flag=true;
}
}
}
if (flag) {
continue;//是过滤内容就不执行下面的代码而是重头来一遍
}
stringBuilder.append("<option value='").append(list.get(i).get("codevalue")).append("'");
if (list.get(i).get("codevalue").equals(value)) {
stringBuilder.append(" selected='selected'");
}
stringBuilder.append(">").append(list.get(i).get("codename")).append("</option>");
}
stringBuilder.append("<select>");
}else if ("radio".equals(type)) {
//单选框
//List<Map<String, String>> list = (List) JSONArray .parseArray(json, new HashMap<String,String>().getClass());
for (int i = 0; i < list.size(); i++) {
if (!StringUtils.isEmpty(ignore) && ignore.equals(list.get(i).get("codevalue"))) {
continue;
}
if (CodeUtil.YESNO.YESNO_YES.equals(disabled)) {
stringBuilder.append("<label for='").append(name+"_"+i).append("'>");
stringBuilder.append("<input type='radio' name='").append(name+"' ").append("value='").append(list.get(i).get("codevalue")+"'");
stringBuilder.append(" title='").append(list.get(i).get("codename")+"'").append(" disabled='disabled'");
stringBuilder.append(" id='").append(name+"_"+i+"' ");
}else {
stringBuilder.append("<label for='").append(name+"_"+i).append("'>");
stringBuilder.append("<input type='radio' name='").append(name+"' ").append("value='").append(list.get(i).get("codevalue")+"'");
stringBuilder.append(" title='").append(list.get(i).get("codename")+"'");
stringBuilder.append(" id='").append(name+"_"+i+"' ");
}
if (list.get(i).get("codevalue").equals(value)) {
stringBuilder.append(" checked=''");
}
//为避免空值提交 默认第一个选中
if (StringUtils.isEmpty(value) && i==0) {
stringBuilder.append("checked=''");
}
if (!StringUtils.isEmpty(filter)) {
stringBuilder.append(" lay-filter='").append(filter+"'");
}
if (!StringUtils.isEmpty(cssclass)) {
stringBuilder.append(" class='").append(cssclass+"'");
}
stringBuilder.append(" >");
if(CodeUtil.YESNO.YESNO_YES.equals(bootstrap)){
//添加单选框的名称(兼容bootstrap)
stringBuilder.append("<span>");
stringBuilder.append(list.get(i).get("codename"));
stringBuilder.append("</span>");
}
stringBuilder.append("</label>");
} }else if("checkbox".equals(type)){//复选框没有做诶
//复选框 }
out.write(stringBuilder.toString());
}else {
//返回列表数据字典
if (StringUtils.isEmpty(value)) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("<script>");
stringBuilder.append(" var data_").append(sysCode).append("=");
stringBuilder.append(json);
stringBuilder.append(";");
stringBuilder.append("function ");
stringBuilder.append(sysCode);
stringBuilder.append("(value){");
stringBuilder.append("for( var i=0;i<data_").append(sysCode).append(".length;i++){");
stringBuilder.append("if(value==data_").append(sysCode).append("[i].codevalue){");
stringBuilder.append("return data_").append(sysCode).append("[i].codename;");
stringBuilder.append("}");
stringBuilder.append("}");
stringBuilder.append("}");
stringBuilder.append("</script>");
out.write(stringBuilder.toString());
}else {
/**
* 定义 str 为 "" 主要在于JspWriter.out() null时会报空指针异常
* JspWriter.print() 可以避免空指针 但是当为null 时会输出为'null'字符串
*/
String str = "";
//返回对应字符编码
//List<Map<String, String>> list = (List) JSONArray .parseArray(json, new HashMap<String,String>().getClass());
for (int i = 0; i < list.size(); i++) {
Map<String, String> map2 = list.get(i);
if (value.equals(map2.get("codevalue"))) {
if (!value.equals(ignore)) {
str = map2.get("codename");
}
}
}
out.write(str);
}
}
} }

JSP tag的封装

<?xml version="1.0" encoding="GBK"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>syscode</short-name>
<!-- 这个属性非常重要,它指定该标签库的 URI,相当于指定该标签库的唯一标识。如上粗体字代码所示,JSP 页面中使用标签库时就是根据该 URI 属性来定位标签库的 -->
<uri>http://www.ylzinfo.com/syscodelib</uri>
<!-- 定义第一个标签 -->
<tag>
<!-- 定义标签名 该标签库的名称,这个属性很重要,JSP 页面中就是根据该名称来使用此标签的-->
<name>sysCode</name>
<!-- 定义标签处理类 指定标签的处理类,毋庸置疑,这个属性非常重要,指定了标签由哪个 Java 类来处理 -->
<tag-class>com.ylzinfo.tag.CodeTag</tag-class>
<!-- body-content:这个属性也很重要,它指定标签体内容。该元素的值可以是如下几个:
tagdependent:指定标签处理类自己负责处理标签体。
empty:指定该标签只能作用空标签使用。
scriptless:指定该标签的标签体可以是静态 HTML 元素,表达式语言,但不允许出现 JSP 脚本。
JSP:指定该标签的标签体可以使用 JSP 脚本。 -->
<body-content>empty</body-content>
<attribute>
<description>编码名称</description>
<name>sysCode</name>
<required>true</required>
</attribute>
<!-- 值 -->
<attribute>
<description>编码值</description>
<name>value</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 忽略syscode codevalue 的值 过滤 不显示 -->
<attribute>
<description>忽略值</description>
<name>ignore</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 控件类型 下拉 单选 多选 -->
<attribute>
<description>控件类型下拉、单选、多选</description>
<name>type</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 控件id值 -->
<attribute>
<description>控件id</description>
<name>id</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 控件name值 -->
<attribute>
<description>控件name属性</description>
<name>name</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 是否必填 -->
<attribute>
<description>是否必填</description>
<name>required</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 是否为bootstrap(兼容layerui) -->
<attribute>
<description>是否bootstrap</description>
<name>bootstrap</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 是否只读不可编辑 -->
<attribute>
<description>是否不可编辑</description>
<name>disabled</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 过滤器 -->
<attribute>
<name>filter</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- class样式 -->
<attribute>
<description>控件class属性</description>
<name>cssclass</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute> </tag>
</taglib>

一个简单的使用

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

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. 分离vue组件内部css

    当我们使用vue组件的时候,使用webpack打包的时候,默认会把vue组件内部的css打包到页面上,但是打包到页面上很丑陋,所以我们希望可以把vue组件内部的css抽离到css文件中,使用vue-s ...

  2. apply、call

    call(),apply() 1.每个函数都包含两个非继承而来的方法:call()和apply() 2.在特定的作用域内调用函数,等于设置函数体内的this对象,以扩充函数赖以运行的作用域 3.app ...

  3. jquery选择器和基本操作

    定义:jQuery 对象就是通过jQuery包装DOM对象后产生的对象.jQuery 对象是 jQuery 独有的. 如果一个对象是 jQuery 对象, 那么它就可以使用 jQuery 里的方法: ...

  4. Linux在shell中输入历史命令

    在Linux的shell中,经常输入的命令有很多雷同,甚至是一样的, 如果是长命令,再次敲一遍效率真的是很低, 不过可以通过Ctl+r,  查找history中以前输入的命令,很是好用. 按Ctrl+ ...

  5. php入门知识储备

    知识结构 开发环境 能够搭建开发环境(一键安装包也算) 知道开发环境中包含哪些软件 知道每种软件的用处 知道每种软件的配置文件(配置项可以慢慢体会) HTML 知道什么是标签.属性 了解基本的HTML ...

  6. 三、持久层框架(Hibernate)

    一.Hibernate处理关系 关系主要有三种:1.多对一 2.一对多 3.多对多 1.多对一 一个Product对应一个Category,一个Category对应多个Product(一个产品对应一个 ...

  7. 解决VS Code保存时候自动格式化

    VS code 保存会自动格式化.以前都是alt+shift+F格式化的,现在一保存就格式化 解决方式:找到你的VScode扩展,把JS-CS-HTML Formatter这个插件禁用就可以解决

  8. burpsuite拦截https数据包(Firefox)

    1.配置浏览器对http/https都使用burpsuite代理 http和https是分开的,对http使用了代理并不代表对https也使用了代理,要配置浏览器让其对https也使用同样的代理. 当 ...

  9. Web应用的统一异常处理(二十四)

    我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况.Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来 ...

  10. memory prefix mini mono multi out _m 5

      1● mini 小 迷你   2● mono 单一 ,单   3● multi 多