JSTL标签取值问题,配合Struts2,急用,在线等。。。。。。。。。。。

kbzl251 2009-12-13 12:19:35
JSTL标签配合Struts2.

这是action代码:

public class FindVetTotal extends ActionSupport{
private List<Vet> list;
public List<Vet> getList() {
return list;
}
public void setList(List<Vet> list) {
this.list = list;
}
public String execute(){
try{
VetDao vd = new VetDaoImpl();
SpecialityDao sd;
List<Vet> temp = vd.findVetTotal();

if(temp != null && temp.size() > 0){
sd = new SpecialityDaoImpl();
for(int i=0; i<temp.size(); i++){
sd.findSpecialityByVetId(temp.get(i));
}

this.list = temp; //赋值给成员变量,temp是我查询回来的数据
return SUCCESS; //然后跳转
}else{
this.addFieldError("error",this.getText("operation.wrong"));
return ERROR;
}
}catch(DataAccessException e){
this.addFieldError("error", this.getText("dbWrong"));
return ERROR;
}catch(ApplicationException e){
this.addFieldError("error", this.getText("systemWrong"));
return ERROR;
}

}
}


然后,我在JSP里取值就出现错误了:
严重: Servlet.service() for servlet jsp threw exception
org.apache.jasper.JasperException: /findVetTotal.jsp(23,4) According to TLD or attribute directive in tag file, attribute items does not accept any expressions
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:148)
at org.apache.jasper.compiler.Validator$ValidateVisitor.checkXmlAttributes(Validator.java:1174)
at org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:821)
at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1512)
at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2343)
at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2393)
at org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2399)
at org.apache.jasper.compiler.Node$Root.accept(Node.java:489)
at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2343)
...........

这是JSP代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="com.pet.domain.Vet"%>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>Test</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">

</head>
<body>
<c:forEach items="${list}" var="l"> //这里不是直接取得action的成员变量值吗?

<span>${l.firstName }</span><span>${l.lastName }</span>
<c:forEach items="${l.list}" var="list"> //取出来的对象里还含有一个list,在进行遍历
<span>${list.speName }</span>
</c:forEach>
<br/>
</c:forEach>
</body>
</html>

我使用的是MyEclipse7.5导入的JSTL标签,是1.2版本的。好像出现的是标签库的错误。

请大家帮我看看,刚刚开始学用Struts2,出了这问题,找了好久没找出来。
请大家帮帮忙,谢谢!
...全文
523 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjun15 2009-12-13
  • 打赏
  • 举报
回复
试试楼上的方法,楼主的变量最好能够区分开来
howsun_zh 2009-12-13
  • 打赏
  • 举报
回复
<c:forEach items="${list}" var="l">  //这里不是直接取得action的成员变量值吗? 
<span>${l.firstName } </span> <span>${l.lastName } </span>
<c:forEach items="${l.list}" var="list"> //① //取出来的对象里还含有一个list,在进行遍历
<span>${list.speName }</span> //②
</c:forEach>
<br/>
</c:forEach>


①处不能再用list了(var="list"),否则,
②处的${list.speName }程序以为request作用域中的list。

解决:把①处的var值换一个不重名的。
kgd1120 2009-12-13
  • 打赏
  • 举报
回复
我觉得上面给出的答案都不是出错的原因。

我觉得你用的struts2的版本比较老,最好告诉是哪个版本的struts2?

早期的struts2并没有把action中定义的属性保存到request中,也就是说你定义的private List <Vet> list;根本没有保存在request作用域中,struts2把action中的属性保存在ValueStack这个对象中,然后把ValueStack对象保存在request中:request.setAttribute("struts.valueStack", stack);
请看看struts2的原码:
Map extraContext;
ValueStack stack;
String timerKey;
extraContext = createContextMap(request, response, mapping, context);
stack = (ValueStack)request.getAttribute("struts.valueStack");
if(stack != null)
extraContext.put("com.opensymphony.xwork2.util.ValueStack.ValueStack", ValueStackFactory.getFactory().createValueStack(stack));
timerKey = "Handling request from Dispatcher";
UtilTimerStack.push(timerKey);
String namespace = mapping.getNamespace();
String name = mapping.getName();
String method = mapping.getMethod();
Configuration config = configurationManager.getConfiguration();
ActionProxy proxy = ((ActionProxyFactory)config.getContainer().getInstance(com/opensymphony/xwork2/ActionProxyFactory)).createActionProxy(namespace, name, extraContext, true, false);
proxy.setMethod(method);
request.setAttribute("struts.valueStack", proxy.getInvocation().getStack());
if(mapping.getResult() != null)
{
Result result = mapping.getResult();
result.execute(proxy.getInvocation());
} else
{
proxy.execute();
}
if(stack != null)
request.setAttribute("struts.valueStack", stack);


所以你在页面上面用EL表达获取不到list对象是正常的,不过struts2.16开始已经解决这个问题了,不仅把对aaction中的属性保存在request中,还保存在了valueStack中。

给楼主两种解决方案:
1.更换高版本的struts2,最好用2.18(内部解决了很多Debug)
2.如果不方便更换版本,可使用struts2的标签,示例如下:
<%@taglib uri="/WEB-INF/struts-tags.tld" prefix="s"%>
//.......
<s:iterator id="user" value="%{list}">
<s:property value="#user.userName"/> //输出内容到网页
</s:iterator>

yudongming 2009-12-13
  • 打赏
  • 举报
回复
不懂,struts2正在学习中,42025833 欢迎加入交流一下
a4562834 2009-12-13
  • 打赏
  • 举报
回复
把LIST先实例化一下
kbzl251 2009-12-13
  • 打赏
  • 举报
回复
各方法都试过,还是不行。也非常感谢大家。

我使用Struts2的标签了。本来不想用的。可是没办法
kbzl251 2009-12-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 warison2008 的回复:]
list的属性存放在ServletActionContext.getRequest()。setAbbtritue("list",lst)里面。
即可
[/Quote]

这个方法我也试过,行不通。不知出现什么错?
道光2008 2009-12-13
  • 打赏
  • 举报
回复
list的属性存放在ServletActionContext.getRequest()。setAbbtritue("list",lst)里面。
即可
kbzl251 2009-12-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xjun15 的回复:]
楼主可以考虑:
1.Vet类里面确实有firstName、lastName、list这三个大小写完全一致的属性,并有相应的get、set方法;
2.楼主的jstl是1.2版本的,可以查看下tld标签属性描述文中对forEach标签的描述,看 <body-content>元素是否为jsp;如果不是,则改为jsp
3.换成jstl1.1的试试

[/Quote]
1 ---满足,2 ---满足 , 3 ---高版本的一般会比低版本德兼容性好。
哥们,还有别的办法吗?
xjun15 2009-12-13
  • 打赏
  • 举报
回复
楼主可以考虑:
1.Vet类里面确实有firstName、lastName、list这三个大小写完全一致的属性,并有相应的get、set方法;
2.楼主的jstl是1.2版本的,可以查看下tld标签属性描述文中对forEach标签的描述,看<body-content>元素是否为jsp;如果不是,则改为jsp
3.换成jstl1.1的试试
今天做项目,用到了el表达式和jstl,在tomcat6.0上跑得好好的,没想到copy到tomcat5.5后,服务器起不来了,是tomcat版本的问题。查阅了不少资料,现在总结如下: 错误信息: java.lang.NoClassDefFoundError: javax/el/ExpressionFactory 分析:少包,上网查阅后发现解决方法 解决方法:将javaee.jar包再copy一份放在tomcat目录的common\lib下 如上完成后即解决了该异常,大以为大功告成,没想到又出现了新异常 错误信息:java.lang.NoSuchMethodError: javax.servlet.JSP.PageContext.getELContext()LJAVAx/el/ELContext 分析:这个问题网上找了半天没看到解决方法,只好自己想办法。想起先前看到的一个知识点:tomcat 6 实现了 servlet 2.5 和JSP2.1的规范相应的 tomcat 5 实现的是 2.4和2.0,想到tomcat5不支持JSTL1.2,于是替换JSTL1.1的包试试看后,问题解决 解决方法:移出工程lib目录中的JSTL1.2.jar,添加standard-1.1.jar和JSTL1.1.jar 总结: jstl1.1版本由2个必要包构成:standard-1.1.jar和JSTL1.1.jar;而jstl1.1版本只有一个必要包JSTL1.2.jar。(一开始在替换的过程中想当然的用JSTL1.1.jar换JSTL1.2.jar,然后遗漏了standard-1.1.jar,耽搁了不少时间。) 经测试,tomcat6.0支持JSTL1.2版本,也支持JSTL1.1版本;tomcat5.5只支持JSTL1.1(JSTL1.1一下版本未测试) 不建议将2个版本的3个包同时放在工程中,可能会发生版本冲突。(另外,实际操作的时候发现JSTL1.2.jar和JSTL1.1.jar这2个包放一起可以在tomcat5.5和tomcat6.0上跑,鉴于JSTL1.1.jar里面没有c.tld等文件,猜测JSTL1.1.jar里面只是放置了1.1的专用的类和信息)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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