问题描述
今天在开发中遇到一奇怪问题,有一个action,在该action里使用request.setAttribute()方法将一个List类型对象放在request中,然后forward到一个jsp文件,该文件的主要内容是使用<logic:iterate>标签将这个List对象中的条目列表显示。与它同样逻辑但位于另一模块(teacher)中的代码执行正常。但这个模块(xxgl)中的代码,本来很简单的逻辑,却总是提示:
org.apache.jasper.JasperException: Cannot find bean t
in
any scope
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java: 254 )
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java: 295 )
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java: 241 )
at javax.servlet.http.HttpServlet.service(HttpServlet.java: 853 )
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java: 684 )
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java: 432 )
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java: 356 )
at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java: 1069 )
at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java: 455 )
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java: 279 )
at org.apache.struts.action.ActionServlet.process(ActionServlet.java: 1482 )
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java: 507 )
at javax.servlet.http.HttpServlet.service(HttpServlet.java: 740 )
at javax.servlet.http.HttpServlet.service(HttpServlet.java: 853 )
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 247 )
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 193 )
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: 256 )
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java: 643 )
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java: 480 )
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java: 995 )
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java: 191 )
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java: 643 )
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java: 480 )
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java: 995 )
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java: 2417 )
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java: 180 )
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java: 643 )
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java: 171 )
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java: 641 )
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 172 )
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java: 641 )
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java: 480 )
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java: 995 )
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: 174 )
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java: 643 )
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java: 480 ) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java: 995 )
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java: 193 )
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java: 781 )
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java: 549 )
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java: 589 )
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java: 666 )
at java.lang.Thread.run(Unknown Source)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java: 254 )
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java: 295 )
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java: 241 )
at javax.servlet.http.HttpServlet.service(HttpServlet.java: 853 )
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java: 684 )
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java: 432 )
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java: 356 )
at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java: 1069 )
at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java: 455 )
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java: 279 )
at org.apache.struts.action.ActionServlet.process(ActionServlet.java: 1482 )
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java: 507 )
at javax.servlet.http.HttpServlet.service(HttpServlet.java: 740 )
at javax.servlet.http.HttpServlet.service(HttpServlet.java: 853 )
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 247 )
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 193 )
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: 256 )
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java: 643 )
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java: 480 )
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java: 995 )
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java: 191 )
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java: 643 )
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java: 480 )
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java: 995 )
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java: 2417 )
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java: 180 )
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java: 643 )
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java: 171 )
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java: 641 )
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 172 )
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java: 641 )
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java: 480 )
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java: 995 )
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: 174 )
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java: 643 )
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java: 480 ) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java: 995 )
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java: 193 )
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java: 781 )
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java: 549 )
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java: 589 )
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java: 666 )
at java.lang.Thread.run(Unknown Source)
将<logic:iterate>之间的代码去掉后就不会提示错误了,所以怀疑是<bean:write>中的代码有错误。相关文件ListSfzxJbxxAction.java中的execute方法如下:
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
HibernateDAO dao = HibernateDAO.getInstance(getServlet().getServletContext());
List sfzxjbxxs = dao.find( " from " + SfzxJbxx.class.getName());
SfzxJbxx tmp = new SfzxJbxx();
tmp.setSfzxid( " id " );
tmp.setXxdm( " pku " );
sfzxjbxxs.add(tmp);
request.setAttribute( " sfzxjbxxs " , sfzxjbxxs);
return mapping.findForward( " success " );
}
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
HibernateDAO dao = HibernateDAO.getInstance(getServlet().getServletContext());
List sfzxjbxxs = dao.find( " from " + SfzxJbxx.class.getName());
SfzxJbxx tmp = new SfzxJbxx();
tmp.setSfzxid( " id " );
tmp.setXxdm( " pku " );
sfzxjbxxs.add(tmp);
request.setAttribute( " sfzxjbxxs " , sfzxjbxxs);
return mapping.findForward( " success " );
}
listsfzxjbxx.jsp内容如下:
<%
@ page contentType="text/html;charset=UTF-8" language="java"
%>
<% @ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<% @ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
< head >
< title > SfzxJbxxList </ title >
</ head >
< body >
< logic:iterate name ="sfzxjbxxs" id ="sfzxjbxx" >
< tr >
< td align ="left" >
< bean:write name ="sfzxjbxx" property ="sfzxId" filter ="true" />
</ td >
< td align ="left" >
< bean:write name ="sfzxjbxx" property ="xxdm" filter ="true" />
</ td >
< td >
</ td >
</ tr >
</ logic:iterate >
< body >
</ html >
<% @ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<% @ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
< head >
< title > SfzxJbxxList </ title >
</ head >
< body >
< logic:iterate name ="sfzxjbxxs" id ="sfzxjbxx" >
< tr >
< td align ="left" >
< bean:write name ="sfzxjbxx" property ="sfzxId" filter ="true" />
</ td >
< td align ="left" >
< bean:write name ="sfzxjbxx" property ="xxdm" filter ="true" />
</ td >
< td >
</ td >
</ tr >
</ logic:iterate >
< body >
</ html >
模块配置文件中相关内容如下:
<
action-mappings
>
< action
attribute ="Form"
input ="/form/sfzxjbxx.jsp"
name ="sfzxJbxxForm"
path ="/saveSfzxJbxx"
type ="edu.pku.cc.sfzx.xxgl.action.SaveSfzxJbxxAction" />
< action path ="/listsfzxjbxx" type ="edu.pku.cc.sfzx.xxgl.action.ListSfzxJbxxAction" >
< forward name ="success" path ="/form/listsfzxjbxx.jsp" />
</ action >
</ action-mappings >
< action
attribute ="Form"
input ="/form/sfzxjbxx.jsp"
name ="sfzxJbxxForm"
path ="/saveSfzxJbxx"
type ="edu.pku.cc.sfzx.xxgl.action.SaveSfzxJbxxAction" />
< action path ="/listsfzxjbxx" type ="edu.pku.cc.sfzx.xxgl.action.ListSfzxJbxxAction" >
< forward name ="success" path ="/form/listsfzxjbxx.jsp" />
</ action >
</ action-mappings >
问题解决
经过三个小时的检查,发现是listsfzxjbxx.jsp里缺少<logic:iterate>标签的声明,在前面增加上:
<
%@ taglib
uri
="/WEB-INF/struts-logic.tld"
prefix
="logic"
%
>
一切OK!
本文转自博客园八进制的博客,原文链接:[Struts]"Cannot find bean in any scope"之一解,如需转载请自行联系原博主。