ylz框架外网之JSP 自定义TAG

时间:2023-03-09 05:53:27
ylz框架外网之JSP 自定义TAG

首先用到了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"/>
<!--具体使用-->