在项目中我们肯能会遇到一些EL表达式不能满足我们的需求,这时
我们可以利用自定义表达式来完成自己所需要的功能
下面是简单介绍一个日期的处理EL表达式,配置文件的详细介绍
1,首先我们要在项目中建立一个.tld文件
文件内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.1</tlib-version>
<short-name>cust</short-name>
<!--注意此uri在引用的时候要与其保持一致-->
<uri>/cust-tags</uri>
<!-- 配置EL表达式的function -->
<function>
<!--标签名称-->
<name>fmtDate</name>
<!--标签处理类-->
<function-class>com.DateUtils</function-class>
<!--标签处理方法-->
<function-signature>java.lang.String fmtDate(java.util.Date)</function-signature>
</function>
<function>
<name>fmtDateTime</name>
<function-class>com.DateUtils</function-class>
<function-signature>java.lang.String fmtDateTime(java.util.Date)</function-signature>
</function>
</taglib>
2, 然后编写处理类
public class DateUtils {
public static String fmtDate(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(date);
}
public static String fmtDateTime(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(date);
}
}
3,然后页面引用
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/cust-tags" prefix="my"%>//注意此处的uri和.tld文件中的uri保持一致,“my”就是相当于一个别名
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<html>
<head>
</head>
<body>
<form action="" method="post">
<table >
<tr>
<td>开始时间</td>
<td><input class="text" name="startDate" value="${my:fmtDate(startDate)}" readonly/></td>
<td>结束时间</td>
<td><input class="text" name="endDate" value="${my:fmtDate(endDate)}" readonly/></td>
</tr>
</table>
</form>
</body>
</html>
---------------------------------------------------------------------------------------------------
下面介绍一下自定义jsp中的标签,
由于下面定义了好几种标签建议大家
一个自定义标签请先看这个标签的配置,然后看处理类,然后看jsp
1,首先建立一个.tld文件
文件内容如下:
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.1</tlib-version>
<short-name>cust</short-name>
<uri>/cust-tags</uri>
<!--1,生成一个表格,标签的属性有text,percent,width,看完配置,请大家看下面的处理类-->
<tag>
<!--标签名字-->
<name>navigation</name>
<!--标签处理类-->
<tag-class>com.NavigateTag</tag-class>
<!--tag标签中的内容
例:<my:navigation>标签体</my:navigation>
(1)empty:表示没有标签体
(2)JSP:表示标签体可以包含JSP代码
(3)scriptless:表示标签体可以包含EL表达式
和JSP动作元素,但不能包含JSP的脚本元
(4)tagdependent:表示标签体交由标签本身去解析处理。
即在标签体中所写的任何代码都会原封不动地传给标签处理器-->
<body-content>empty</body-content>
<!--标签的属性,就像input标签的type,name属性一样
有几个属性,配置几个Attribute就行-->
<attribute>
<!--属性的名字-->
<name>percent</name>
<!--是否是必填属性-->
<required>false</required>
<!--是否支持运行时取值,下面会详细介绍-->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>width</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>text</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<!--2,checkBox的默认选中-->
<tag>
<name>checked</name>
<tag-class>com.MultiCheckTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>curVal</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>list</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>compare</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>text</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<!--3,错误信息的展示-->
<tag>
<!-- 标签名字 -->
<name>errInfo</name>
<!-- 标签处理类 -->
<tag-class>com.ErrInfoTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>key</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
<!--4,隐藏一些按钮,或者特殊权限才会显示出来的内容,这里是一个权限,
首先页面上在标签内action属性表示这个动作所要执行的action,然后处理类中取出
Seesion中的权限列表,两者比较如果包含就代表有权限,就会展示内容,否则跳过-->
<tag>
<name>privShow</name>
<tag-class>net.beifeng.mobile_scm.web.PrivShowTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>action</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
2,标签的处理类
(1)生成一个table表格
public class NavigateTag extends SimpleTagSupport {
//这里的字段与配置文件中配置的属性一致,设置set方法,保证值可以传入
private int percent = 100;
private int width = 1000;
private String text;
private String widthType = "percent";
public void setPercent(int percent) {
this.percent = percent;
}
public void setText(String text) {
this.text = text;
}
public void setWidth(int width) {
this.widthType = "width";
this.width = width;
}
@Override
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
String tableWidth = this.widthType.equals("percent") ? (percent + "%")
: width + "";
out.print("<table width='" + tableWidth
+ "' border='0' cellspacing='0'"
+ " cellpadding='0' align='center'><tr>");
out.print("<td class='navTd1'></td>");
out.print("<td class='navTd2'>" + text + "</td>");
out.print("<td class='navTd3'></td></tr></table>");
}
}
(2)checkbox的选中
public class MultiCheckTag extends SimpleTagSupport {
private Object curVal;
private Object[] list;
private Object compare;
private String text = "checked";
public void setCurVal(Object curVal) {
this.curVal = curVal;
}
public void setList(Object[] list) {
this.list = list;
}
public void setText(String text) {
this.text = text;
}
public void setCompare(Object compare) {
this.compare = compare;
}
@Override
public void doTag() throws JspException, IOException {
if (list != null && list.length > 0) {
for (int i = 0; i < list.length; i++) {
if (curVal.equals(list[i])) {
getJspContext().getOut().print(" " + text + " ");
break;
}
}
} else if (compare != null) {
if (curVal.equals(compare)) {
getJspContext().getOut().print(" " + text + " ");
}
}
}
}
(3)错误信息展示(errMap是由后端发送到前台的参数,是一个map集合,key与标签的属性中的key值一致,然后value里面记录着错误信息,在这里取出,然后展示在页面上)
public class ErrInfoTag extends TagSupport {
private static final long serialVersionUID = -6965422265190706575L;
private String key;
public void setKey(String key) {
this.key = key;
}
@SuppressWarnings("unchecked")
@Override
public int doStartTag() throws JspException {
Map<String, String> errMap = (Map<String, String>) this.pageContext
.getRequest().getAttribute("errMap");
if (errMap != null) {
String errMess = errMap.get(key);
if (errMess != null) {
try {
this.pageContext.getOut().print(
"<span style='color:red'>" + errMess + "</span>");
} catch (IOException e) {
throw new JspException(e);
}
}
}
return SKIP_BODY;
}
}
(4)html内容是否显示出来
public class PrivShowTag extends TagSupport {
private String action;
@Override
public int doStartTag() throws JspException {
// TODO Auto-generated method stub
if(action != null){
Set<String> actionList = (Set<String>)this.pageContext.getSession()
.getAttribute("actionList");
if(actionList.contains(action)){
//执行包含的标签体
return EVAL_BODY_INCLUDE;
} else {
//跳过标签体
return SKIP_BODY;
}
}
return super.doStartTag();
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
}
3,jsp页面的引用
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/cust-tags" prefix="my"%>//注意此处的uri和.tld文件中的uri保持一致,“my”就是相当于一个别名
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<html>
<head>
</head>
<body>
<my:navigation text="测试自定义标签1---navigation" percent="90"/>
<!--2,测试默认选中,值自己改变-->
<c:forEach items="${roleList}" var="role">
<input type="checkbox" name="acc.IdList" value="${role.Id}"
<my:checked curVal="${role.Id}" list="${acc.IdList}"/>
/>${role.roleName}
</c:forEach>
<!--3,错误信息展示,注意key属性的值与map集合中的key保持一致-->
<my:errInfo key="nullRole"/>
<!--4,设置一段html是否展示,符合条件展示,不符合条件不展示-->
<my:privShow action="mobStockIn_check.do">
<span style="color:gray">审核</span>
</my:privShow>
</body>
</html>
----------------------------------------------------------------------------------------
关于自定义标签更详细的介绍,参考一下网站:http://blog.csdn.net/qq_33396462/article/details/52237713
自定义jsp标签和El表达式
最新推荐文章于 2019-03-21 23:18:00 发布