最近写网站遇到了关于<s:action/>的问题,我就写了个小程序测试了下,但结果很让我不解。这个测试程序的结构是这样的index.jsp页面是这样的 <body>
    <s:a href="show.action">点我</s:a>
  </body>
struts.xml中这样配置
<package name="default" namespace="/" extends="struts-default">
        <action name="show" class="com.test.action.Show">
         <result>show.jsp</result>
        </action>
    </package>
action是这样的
public class Show extends ActionSupport {
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
}
在show.jsp中输出一句话
<body>
    <h1>hello</h1>
  </body>
这样写的话,页面可以正常显示。但是我把Index.jsp中的<s:a>改成<s:action>就会报错
<body>
    <%-- <s:a href="show.action">点我</s:a> --%>
    <s:action name="show.action" executeResult="true"></s:action>
  </body> 
报的错误
SEVERE: Could not execute action: /show.action
There is no Action mapped for action name show.action. - [unknown location]
at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185)
at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
at org.apache.struts2.components.ActionComponent.executeAction(ActionComponent.java:289)
at org.apache.struts2.components.ActionComponent.end(ActionComponent.java:175)
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:128)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:97)
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:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
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:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
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:99)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
struts2

解决方案 »

  1.   

    你和饭碗有什么区别?答案是根本就没联系,何谈区别<s:a 在页面上最终留下一个html 的<a>
    <s:action 页面上什么也留不下,它是在解析jsp时调用后台的方法用的。name要的是action的名字而不是请求地址的后半部分。<s:action name="show" id="showc"/><s:property value="#showc.方法"/>一般是这么用的
      

  2.   

    楼主 看下源代码,,看看s:action被解析成什么了,,不就一目了然啦
      

  3.   

    你好,我知道<s:action>中的name是action的名字。我要做的就是在这个页面加载时自动执行那个action而不是要点击才执行
      

  4.   

    你好,我知道<s:action>中的name是action的名字。我要做的就是在这个页面加载时自动执行那个action而不是要点击才执行
    那不是已经跟你说了么?
    <s:action name="show" id="showc"/>
    这句话的意思就是说showc指向了show这个action类
    如果你想执行里面的方法就这样
    <s:property value="#showc.方法"/><s:select list="#showc.xx方法" />这个select就的list值就是方法的返回值
      

  5.   


    <s:action>不用你点,你也没地方点,既然知道是名字那你上面写的是什么?
      

  6.   

    你好,我知道<s:action>中的name是action的名字。我要做的就是在这个页面加载时自动执行那个action而不是要点击才执行
    那不是已经跟你说了么?
    <s:action name="show" id="showc"/>
    这句话的意思就是说showc指向了show这个action类
    如果你想执行里面的方法就这样
    <s:property value="#showc.方法"/><s:select list="#showc.xx方法" />这个select就的list值就是方法的返回值
    你好,问题已经解决。还是我以前的那种写法,不知道怎么回事就可以了。但还是非常感谢,又学的了一些东西