【问题标题】:Struts2 list couldn't be resolvedStruts2 列表无法解析
【发布时间】:2011-12-22 21:10:19
【问题描述】:

请帮助我。我面临这个错误 3 天。我在网上搜索了所有示例,但我无法弄清楚。

这些是我的文件:

struts.xml

...
<action name="menu"  class="com.struts.actions.MenuAction" method="asdf">
<result name="success" type="tiles">struts2tiles.home</result>
</action>
...

menu2.jsp

....
<body>
<s:form action="menu">
    <s:checkboxlist label="What's your favor color" list="colors" name="colors" />

<s:submit value="submit" name="submit" />

</s:form>
</body>

菜单操作

public class MenuAction extends ActionSupport {
    private ArrayList<String> colors;
    private String yourColor;

    public ArrayList<String> getColors() {
        return colors;
    }

    public void setColors(ArrayList<String> colors) {
        this.colors = colors;
    }

    public String getYourColor() {
        return yourColor;
    }

    public void setYourColor(String yourColor) {
        this.yourColor = yourColor;
    }

    public String asdf() {
        colors = new ArrayList<String>();
        colors.add("red");
        colors.add("yellow");
        colors.add("blue");
        colors.add("green");

        return SUCCESS;
    }

    @Override
    public String execute() {
        System.out.println("execute menu action");
        colors = new ArrayList<String>();
        colors.add("red");
        colors.add("yellow");
        colors.add("blue");
        colors.add("green");

        return SUCCESS;
    }

}

我做的任何事情,仍然存在同样的错误:

Dec 22, 2011 10:56:44 PM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet jsp threw exception
tag 'checkboxlist', field 'list', name 'colors': The requested list key 'colors' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location]
    at org.apache.struts2.components.Component.fieldError(Component.java:237)
    at org.apache.struts2.components.Component.findValue(Component.java:358)
    at org.apache.struts2.components.ListUIBean.evaluateExtraParams(ListUIBean.java:80)
    at org.apache.struts2.components.UIBean.evaluateParams(UIBean.java:856)
    at org.apache.struts2.components.UIBean.end(UIBean.java:510)
    at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:42)
    at org.apache.jsp.jsp.common.menu2_jsp._jspx_meth_s_005fcheckboxlist_005f0(menu2_jsp.java:166)
    at org.apache.jsp.jsp.common.menu2_jsp._jspx_meth_s_005fform_005f0(menu2_jsp.java:122)
    at org.apache.jsp.jsp.common.menu2_jsp._jspService(menu2_jsp.java:84)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:593)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:530)
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:927)
    at org.apache.jasper.runtime.PageContextImpl.doInclude(PageContextImpl.java:684)
    at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:678)
    at org.apache.tiles.jsp.context.JspTilesRequestContext.include(JspTilesRequestContext.java:80)
    at org.apache.tiles.jsp.context.JspTilesRequestContext.dispatch(JspTilesRequestContext.java:73)
    at org.apache.tiles.context.TilesRequestContextWrapper.dispatch(TilesRequestContextWrapper.java:72)
    at org.apache.struts2.tiles.StrutsTilesRequestContext.dispatch(StrutsTilesRequestContext.java:88)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:283)
    at org.apache.tiles.jsp.taglib.InsertAttributeTag.render(InsertAttributeTag.java:140)
    at org.apache.tiles.jsp.taglib.InsertAttributeTag.render(InsertAttributeTag.java:117)
    at org.apache.tiles.jsp.taglib.RenderTagSupport.execute(RenderTagSupport.java:154)
    at org.apache.tiles.jsp.taglib.RoleSecurityTagSupport.doEndTag(RoleSecurityTagSupport.java:75)
    at org.apache.tiles.jsp.taglib.ContainerTagSupport.doEndTag(ContainerTagSupport.java:80)
    at org.apache.jsp.jsp.common.mainLayout_jsp._jspx_meth_tiles_005finsertAttribute_005f2(mainLayout_jsp.java:181)
    at org.apache.jsp.jsp.common.mainLayout_jsp._jspService(mainLayout_jsp.java:94)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:593)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:530)
    at org.apache.tiles.servlet.context.ServletTilesRequestContext.include(ServletTilesRequestContext.java:217)
    at org.apache.tiles.servlet.context.ServletTilesRequestContext.dispatch(ServletTilesRequestContext.java:177)
    at org.apache.tiles.context.TilesRequestContextWrapper.dispatch(TilesRequestContextWrapper.java:72)
    at org.apache.struts2.tiles.StrutsTilesRequestContext.dispatch(StrutsTilesRequestContext.java:88)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:606)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:246)
    at org.apache.struts2.views.tiles.TilesResult.doExecute(TilesResult.java:105)
    at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
    at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:373)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:277)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:270)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
    at org.apache.struts2.components.ActionComponent.executeAction(ActionComponent.java:291)
    at org.apache.struts2.components.ActionComponent.end(ActionComponent.java:173)
    at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:42)
    at org.apache.jsp.index_jsp._jspx_meth_s_005faction_005f0(index_jsp.java:108)
    at org.apache.jsp.index_jsp._jspService(index_jsp.java:76)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:88)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

有人有想法吗?

【问题讨论】:

  • 最初如何访问 JSP?
  • 您能否显示您在网络浏览器中访问的 URL 并获得此异常?
  • 请回答问题——如果你不回答,没人能帮忙。几乎可以肯定的是,您并没有像您认为的那样处理操作,而是访问了一个没有初始化集合的页面。

标签: struts2 struts


【解决方案1】:

请求的列表键“颜色”无法解析为集合/数组/映射/枚举/迭代器类型

当您尝试访问尚未创建的列表/集合时会发生此错误。

可能是您直接调用操作,即 loacalhost:8080/youraction.action。

请确保您在实例化动作类后访问列表,即调用相应的动作。

如果您想在调用 action 之前直接访问它,请将其设为静态并在 jsp 中访问它。

【讨论】:

    【解决方案2】:

    简单来说,您正在访问页面,即 menu2.jsp 直接没有处理任何操作,因此没有初始化列表。 在通往 menu2.jsp 的路上经过一个动作并初始化列表 这就是错误所说的

    The requested list key 'colors' could not be resolved as a collection/array/map/enumeration/iterator type
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      有三种方法可以做到这一点。

      1. 如果我们在类级别初始化所有集合对象,则不会发生此问题,据我了解,当时触发特定操作时,JSP页面不知道字段的类型。在这种情况下,当你写 "private ArrayList&lt;String&gt; colors;" 代替这个,做它

        私有 ArrayList colors=new ArrayList();

      2. 像 Tomasz Gutkowski 之前所说的那样使用 prepare 也可以。

      3. 通过使用拦截器标签,我们也可以这样说(包含在动作标签中)

        interceptor-ref name="params"
        拦截器参考名称=“准备”
        拦截器引用名称="basicStack"

      【讨论】:

      • thanx,你的第一个方法帮助我解决了这个问题
      【解决方案4】:

      您需要添加实现 Preparable 和方法 prepare() 并在此方法中准备颜色列表。

      应该是这样的:

      public class MenuAction extends ActionSupport implements Preparable{
          private ArrayList<String> colors;
          private String yourColor;
      
          public ArrayList<String> getColors() {
              return colors;
          }
      
          public void setColors(ArrayList<String> colors) {
              this.colors = colors;
          }
      
          public String getYourColor() {
              return yourColor;
          }
      
          public void setYourColor(String yourColor) {
              this.yourColor = yourColor;
          }
      
          public String asdf() {
              colors = new ArrayList<String>();
              colors.add("red");
              colors.add("yellow");
              colors.add("blue");
              colors.add("green");
      
              return SUCCESS;
          }
      
          @Override
          public String execute() {
              System.out.println("execute menu action");
      
      
              return SUCCESS;
          }
          public void prepare() throws Exception {
              colors = new ArrayList<String>();
              colors.add("red");
              colors.add("yellow");
              colors.add("blue");
              colors.add("green");
      
          }
      }
      

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题;我删除了 struts xml 验证,它工作正常

        【讨论】:

          【解决方案6】:

          在从jsp文件中的action类访问任何字段之前,你需要确保action类对象被创建并且被访问的字段被正确初始化。

          在您的 struts.xml 中,对于操作“菜单”,您已配置为调用方法“asdf”。所以首先要注意的是struts框架不会调用execute方法来执行你的动作'menu',而是调用方法'asdf'。

          在 menu2.jsp 中的表单中,在标签中,您试图访问动作类中存在的名为 colors 的变量。所以当 menu2.jsp 被调用时,相应的动作没有被调用,因此字段颜色也没有被初始化。

          那么如何在 menu2.jsp 之前调用 MenuAction 类呢?这是实现这一目标的一种尝试:

          struts.xml

          <!-- Define one extra action in struts.xml which redirects-->
          <action name="invokeMenuActionFirst" class="com.struts.actions.MenuAction" method="input">
              <result name="input">/menu2.jsp</result>
          </action>
          

          无论您在何处直接调用 menu2.jsp,都需要改为调用操作“invokeMenuActionFirst”。例如,考虑如下示例 other.jsp。

          其他.jsp

          <a href="menu2.jsp">Link </a>
          <%-- Replace links similar to above created using plain html markup with following struts2 markup. --%>
          <a href="<s:url action='invokeMenuActionFirst'/>">Link </a>
          

          这里的输入法由ActionSupport类提供,默认实现返回String“input”。 您还应该将颜色的初始化代码移至 MenuAction 默认构造函数。

          我从https://struts.apache.org/docs/message-resource-files.html得到这个想法。

          【讨论】:

            【解决方案7】:

            必须为操作方法配置struts.xml 文件,该方法填充列表/映射/集合,如下所述。
            <action name="selectAction" class="<full class name>" method="display"> <result name="none">pages/<file name>.jsp</result> </action

            在浏览器中输入以下网址:
            http://hostname:port/context/selectAction.action
            现在集合将被填充,struts select 将显示集合的内容

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-01-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-02-28
              • 2015-03-11
              相关资源
              最近更新 更多