项目中多次使用到了部门选择下拉框,于是决定把此下拉框提取成一个自定义标签。自定义标签可以方便统一管理和一处修改的好处
- 步骤一:定义java的tag类,这个类继承了spring的org.springframework.web.servlet.tags.RequestContextAwareTag类。
@SuppressWarnings("serial")
public class DeptCodeTag extends RequestContextAwareTag{
@Override
protected int doStartTagInternal() throws Exception {
//这里可以获取WebApplicationContext,然后获取service,调用service方法去获取部门集合,然后放到pageContext传递到前端进行select标签的组装。
return 0;
}
}
- 步骤二:定义tld文件dept_code.tld。文件放在WEB-INF目录下,否则会报错。
<?xml version="1.0" encoding="UTF-8" ?>
<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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.1</tlib-version><!--版本号-->
<short-name>dept_Sel</short-name>
<!--后面引用的短名称-->
<uri>http://www.lancy.com/media/tag</uri>
<!--定义uri,便于后面引用定位-->
<tag>
<name>deptCode</name>
<!--名字-->
<tag-class>com.lancy.customTag.dept.DeptCodeTag</tag-class>
<!--指向步骤1中定义的java的tag类-->
<body-content>empty</body-content>
<!--使用empty即可-->
</tag>
</taglib>
- 步骤三:定义tag标签文件deptCode.tag。与tld文件放同一目录下,
<%@tag pageEncoding="utf-8" %><!--定义编码,防止乱码 -->
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!--引入c标签-->
<%@taglib prefix="deptSel" uri="http://www.lancy.com/media/tag" %>
<!-- 引入我们自定义的tld文件,定义前缀为deptSel(这个可以根据自己项目任意定义),uri值是tld文件中的uri值-->
<!-- 下面定义这个select标签需要的属性字段-->
<!--name:属性的名字,required:使用这个标签时候,本属性是否必须的;type:这个属性值的类型;
rtexprvalue:这个标签是否支持el表达式,我们设置为true,支持表达式,这样就可以在引用时候动态设置值-->
<!--重点是定义一些属性,不同的部门选择框就可以有不同的名称,取值等-->
<%@attribute name="hiddenName" required="true" rtexprvalue="true" %>
<%@attribute name="value" required="true" rtexprvalue="true" %>
<%@attribute name="name" required="true" rtexprvalue="true" %>
<%-- <deptSel:deptCode/> --%><!--引入文件2中订阅的listLevelCode,就相当于引入了步骤一中的java代码,这样我们就能访问步骤一中定义的levelCodeList对象。yq就是第三行定义的前缀,liestLevelCode就是步骤2中定义的name值-->
<select class="easyui-combotree" name="${name}" style="width:95%"
data-options="
url: _ctx+'/dept/tree',
readonly:false,
required:false,
parentField:'parentId',
textField:'deptName',
idField:'deptId',
hiddenName:'${hiddenName}',
multiple:true,
hasDownArrow:false,
cascadeCheck:false,
values:'${value}',
icons: [{
iconCls:'app-del',
handler: function(e){
$(e.data.target).combotree('clear');
}
}],
prompt:'请选择部门'
">
</select>
- 步骤四:web.xml中配置tld文件
<jsp-config>
<taglib>
<taglib-uri>http://www.lancy.com/media/tag</taglib-uri><!--这个地址就是步骤2中的uri值-->
<taglib-location>/WEB-INF/tags/dept_code.tld</taglib-location><!--这个值就是步骤2中定义的tld文件的路径-->
</taglib>
</jsp-config>
- 步骤五:jsp使用自定义标签
<%@ taglib prefix="deptSel" tagdir="/WEB-INF/tags" %><!--jsp页面引入标签-->
<deptSel:deptCode name="deptId" hiddenName="" value="${vo.deptId}"/>
<!--deptSel是步骤3中定义的别名,deptCode是tag文件的名称-->
以上就完成了一个自定义select标签,这个select标签是easyui的标签,页面加载以后会自动根据标签里的url: _ctx+’/dept/tree’ 去后台查询结果。
@RequestMapping(value="/tree",method=RequestMethod.POST)
@ResponseBody
public Object tree(HttpServletRequest request){
List<SysDept> list = sysDeptService.query(request);
return list;
}
完成,另外可以参考(http://blog.youkuaiyun.com/mos_wen/article/details/53930647),根据这个参考实现自己的