我写了一个java自定义标签,可不知道为什么不能用EL表达式

xihuanni0509 2010-12-03 02:57:23


package com.tag;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;


public class PageTag extends TagSupport {

private Object pageSize;//每页显示的记录数
private Object currentIndex;//当前页
private Object maxPage;//总页数
private Object hrefActionName;//要链接到的action
private Object maxCount;//总记录数
private Object list;//页数编号

public int doStartTag() throws JspException {
HttpServletRequest request;
// 是TagSupport类中定义的一个属性,它是javax.servlet.jsp.PageContext的对象
request = (HttpServletRequest) pageContext.getRequest();
JspWriter out = pageContext.getOut();
StringBuffer sbOut = new StringBuffer();
sbOut.append("<div class='container'><ul class='list'><li>每页显示 "+getPageSize().toString()+" 条数据</li><li>当前页面 "+getCurrentIndex().toString()+"/"+getMaxPage().toString()+" </li>");
if(getMaxPage().toString().equals("0")||getMaxPage().toString().equals("1")){//总共只有一页
sbOut.append("<li>首页</li><li>上一页</li><li>下一页</li><li>尾页</li>");
}else if(getCurrentIndex().toString().equals("1")){//当前页为第一页
sbOut.append("<li>首页</li><li>上一页</li><li><a href='"+getHrefActionName().toString()+"?currentIndex="+(Integer.parseInt(getCurrentIndex().toString())+1)+"'>下一页</a></li><li><a href='"+getHrefActionName().toString()+"?currentIndex="+getMaxPage().toString()+"'>尾页</a></li>");
}else if(getCurrentIndex().toString().equals(getMaxPage().toString())){//当关页为最后一页
sbOut.append("<li><a href='"+getHrefActionName().toString()+"?currentIndex=1'>首页</a></li><li><a href='"+getHrefActionName().toString()+"?currentIndex="+(Integer.parseInt(getCurrentIndex().toString())-1)+"'>上一页</a></li><li>下一页</li><li>尾页</li>");
}else{//显示所有链接(首页,上一页,下一页,尾页)
sbOut.append("<li><a href='"+getHrefActionName().toString()+"?currentIndex=1'>首页</a></li><li><a href='"+getHrefActionName().toString()+"?currentIndex="+(Integer.parseInt(getCurrentIndex().toString())-1)+"'>上一页</a></li><li><a href='"+getHrefActionName().toString()+"?currentIndex="+(Integer.parseInt(getCurrentIndex().toString())+1)+"'>下一页</a></li><li><a href='"+getHrefActionName().toString()+"?currentIndex="+getMaxPage().toString()+"'>尾页</a></li>");
}
sbOut.append("<li>共 "+getMaxCount().toString()+" 条记录</li><li class='seach'>转到 <select name='pagelist' onchange='turnPage()'>");
String[] strList = list.toString().split(",");
for(int i=0;i<strList.length;i++){
if(strList[i].equals(getCurrentIndex().toString())){
sbOut.append("<option style='color:#666666' selected='selected' value='"+strList[i]+"'>"+strList[i]+"</option>");
}else{
sbOut.append("<option style='color:#666666' value='"+strList[i]+"'>"+strList[i]+"</option>");
}
}
sbOut.append("</select></li></div>");
System.out.println(sbOut.toString());
try {
//out.print("pageSize "+getPageSize()+" currentIndex "+getCurrentIndex());
//out.print("<li><a href='#'>首页</a></li><li><a href='#'>上一页</a></li><li><a href='#'>下一页</a></li><li><a href='#'>尾页</a></li><li>共 200 条记录</li><li class='seach'>转到<select name='pagelist'><option style='color:#666666'>1</option><option style='color:#666666'>2</option></select></li></div>");
out.print(sbOut.toString());
}catch(IOException e)
{
e.printStackTrace();
}
// doStartTag() 方法返回 SKIP_BODY 。当然其原因是我们的简单日期标记没有正文。
return Tag.SKIP_BODY;
}

//ExpressionEvaluatorManager.evaluate( "pageSize", pageSize.toObject(), Object.class, this, pageContext);
public Object getPageSize() {
return pageSize;
}
public void setPageSize(Object pageSize) {
try {
this.pageSize = ExpressionEvaluatorManager.evaluate("pageSize", pageSize.toString(), Object.class, this, pageContext);
} catch (JspException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
}
public Object getCurrentIndex() {
return currentIndex;
}
public void setCurrentIndex(Object currentIndex) {
try {
this.currentIndex = ExpressionEvaluatorManager.evaluate("currentIndex", currentIndex.toString(), Object.class, this, pageContext);
} catch (JspException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
}
public Object getMaxPage() {
return maxPage;
}
public void setMaxPage(Object maxPage) {
try {
this.maxPage = ExpressionEvaluatorManager.evaluate("maxPage", maxPage.toString(), Object.class, this, pageContext);
} catch (JspException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
}
public Object getHrefActionName() {
return hrefActionName;
}
public void setHrefActionName(Object hrefActionName) {
try {
this.hrefActionName = ExpressionEvaluatorManager.evaluate("hrefActionName", hrefActionName.toString(), Object.class, this, pageContext);
} catch (JspException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
}
public Object getMaxCount() {
return maxCount;
}
public void setMaxCount(Object maxCount) {
try {
this.maxCount = ExpressionEvaluatorManager.evaluate("maxCount", maxCount.toString(), Object.class, this, pageContext);
} catch (JspException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
}
public Object getList() {
return list;
}
public void setList(Object list) {
try {
this.list = ExpressionEvaluatorManager.evaluate("list", list.toString(), Object.class, this, pageContext);
} catch (JspException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
}



}




...全文
408 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xihuanni0509 2010-12-06
  • 打赏
  • 举报
回复

<attribute>
<!--当前页-->
<name>currentIndex</name>
<type>java.lang.Object</type>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>

找到问题所在了,错的地方是这里,谢谢大家的帮助!
xihuanni0509 2010-12-04
  • 打赏
  • 举报
回复

private Object pageSize;//每页显示的记录数


<attribute>
<!--当前页-->
<name>currentIndex</name>
<type>Object</type>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>



<body>
This is my JSP page. <br>
<%
Integer str = 1;
request.setAttribute("str",str);
%>
<p:page currentIndex="${str}" hrefActionName="aa" list="1,2,3,4,5" maxCount="45" maxPage="5" pageSize="10"/>
</body>

我都改了,都改成了Object 或者String 试了一下,不守还是报错
org.apache.jasper.JasperException: /index.jsp(83,2) Unknown attribute type (Object) for attribute currentIndex.

网上是这么说的

如何在Java自定义标签中让自定义的标签属性正确接收EL表达式对象

我们在项目开发中为了更方便灵活的使用Java自定义标签,往往需要让自定义的标签属性接收一些EL表达式对象,所幸的是apache为我们提供了简单的实现方式。
需要的jar包:
jstl.jar
standard.jar
其实这两个包就是我们在使用jstl时所需的两个包。
要接收EL表达式对象,首先得在标签的实现类文件中将这个属性的对象类型设置为Object类型,在set、get方法中,set方法需要引入apache的类:
import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;
这个类中有一个evaluate 方法,当el表达式作为参数传入时,调用这个方法,在tag内即可自动把el表达式转化成所需要的对象。
你只需在set方法里如下调用:
public void setValue(Object value)throws JspException
{
this.value = ExpressionEvaluatorManager.evaluate(
"value", value.toString(), Object.class, this, pageContext);
}

ExpressionEvaluatorManager.evaluate有四个参数。
第一个表示tag的名字,在取el表达式出错时使用。一般和属性名字相同。
第二个要求字符串,通常简单调用输入对象的toString方法。
第三个是类,通常用Object.class。
第四个用this即可,
第五个是pageContext变量。

在tld文件中该标签属性的rtexprvalue得设置为true,表示是否支持运行时表达式取值。



仲兴轩 2010-12-03
  • 打赏
  • 举报
回复
<attribute>
<!--当前页-->
<name>currentIndex</name>
<type>Integer</type>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>

你这里自定义的类型是Integer呀,

呵呵,用Integer呢,
仲兴轩 2010-12-03
  • 打赏
  • 举报
回复
<p:page currentIndex="${str}" hrefActionName="ddd" list="1,2,3" maxCount="25" maxPage="3" pageSize="10"/>

没用过这标签,不知道啥意思来着的,

不过,看你出的错,应该就是类型转换的问题咯,

currentIndex--相信这里应该要传的是数字类型咯,

试试用
<%
Long str = "10";

%>

再用<%=str %>,
xql80329 2010-12-03
  • 打赏
  • 举报
回复
<type>Integer</type>
xql80329 2010-12-03
  • 打赏
  • 举报
回复
才看明白 ,是因为你
<%
String str = "10";
request.setAttribute("str",str);
%>

由于你页面的str 是String的 而你需要的是整形的。没有进行转换。
xql80329 2010-12-03
  • 打赏
  • 举报
回复
你所有属性都是OBJECT 。我觉得是泛型引起的错。再现测试一下你再标签放具体值可以用么?
xihuanni0509 2010-12-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhongxingxuan 的回复:]
直接用10不是更好,呵呵,或者<%=str %>咯,

要么再加上这个再用EL
<%@ page isELIgnored="false" %>
[/Quote]
首先表示感谢,不过我试了你说的用<%=str %>或加<%@ page isELIgnored="false" %>
不过不行,还是报上面那个错
xihuanni0509 2010-12-03
  • 打赏
  • 举报
回复

<body>
This is my JSP page. <br>
<%
String str = "10";
request.setAttribute("str",str);
%>

<p:page currentIndex="${str}" hrefActionName="ddd" list="1,2,3" maxCount="25" maxPage="3" pageSize="10"/>
</body>

我贴这个是想说明如果我用${}的话就话报错,如果直接写成
<p:page currentIndex="10" hrefActionName="ddd" list="1,2,3" maxCount="25" maxPage="3" pageSize="10"/>
就能正常使显示


plghqr 2010-12-03
  • 打赏
  • 举报
回复
<attribute>
<description>根据mnId,得到formCode</description>
<name>mnId</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
其中的<rtexprvalue>true</rtexprvalue>
仲兴轩 2010-12-03
  • 打赏
  • 举报
回复
直接用10不是更好,呵呵,或者<%=str %>咯,

要么再加上这个再用EL
<%@ page isELIgnored="false" %>
abc130314 2010-12-03
  • 打赏
  • 举报
回复
request.setAttribute("str",10);
???
xihuanni0509 2010-12-03
  • 打赏
  • 举报
回复

<body>
This is my JSP page. <br>
<%
String str = "10";
request.setAttribute("str",str);
%>

<p:page currentIndex="${str}" hrefActionName="ddd" list="1,2,3" maxCount="25" maxPage="3" pageSize="10"/>
</body>
如果我使用${}的话,报这个错



2010-12-3 7:37:17 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet jsp threw exception
org.apache.jasper.JasperException: /index.jsp(82,4) Unknown attribute type (Integer) for attribute currentIndex.
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:236)
at org.apache.jasper.compiler.Validator$ValidateVisitor.checkXmlAttributes(Validator.java:1162)
at org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:819)
at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1507)
at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2336)
at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2386)
at org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2392)
at org.apache.jasper.compiler.Node$Root.accept(Node.java:489)
at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2336)
at org.apache.jasper.compiler.Validator.validate(Validator.java:1737)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:178)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:306)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:286)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:273)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:566)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)

xiaochengfu1 2010-12-03
  • 打赏
  • 举报
回复
太长了
xihuanni0509 2010-12-03
  • 打赏
  • 举报
回复
用了standard.jar包,各位大虾帮忙看看,错在哪了。
xihuanni0509 2010-12-03
  • 打赏
  • 举报
回复


<?xml version="1.0" encoding="UTF-8"?>
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<tag>
<name>page</name>
<tagclass>com.tag.PageTag</tagclass>
<bodycontent>empty</bodycontent>
<!-- 定义属性 -->
<attribute>
<!-- 属性名字 每页显示的记录数-->
<name>pageSize</name>
<!-- 属性类型 -->
<type>Integer</type>
<!-- 是否必须 -->
<required>true</required>
<!-- 表示是否可以使用JSP表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<!--当前页-->
<name>currentIndex</name>
<type>Integer</type>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<!-- 总页数-->
<name>maxPage</name>
<type>Integer</type>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<!-- 要链接到的action -->
<name>hrefActionName</name>
<type>Integer</type>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<!-- 总记录数 -->
<name>maxCount</name>
<type>Integer</type>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<!-- 页数编号 -->
<name>list</name>
<type>String</type>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
[code=JScript]

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧