的区别"> 的区别" /> 的区别" />
至顶网软件频道 的区别

的区别

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

的区别

作者:csdn 来源:csdn 2009年12月17日

关键字: 问答 Java EE java

<s:form action="XX.action"> 与 <s:form action="XX"> 的区别

============= struts.xml
<package name="home" extends="demo" namespace="/demo/home">
    <action name="home" class="com.demo.home.HomeAction">
   
    <result name="login" type="redirect-action">
    <param name="namespace">/demo/login </param>
    <param name="actionName">login!init.action </param>
    </result>
   
    <result name="userManage" type="redirect-action">
    <param name="namespace">/demo/userManage </param>
    <param name="actionName">userManage!init.action </param>
    </result>
    </action>
</package>


<package name="userManage" extends="demo" namespace="/demo/userManage">
    <action name="userManage" class="com.demo.userManage.UserManageAction">
    <result name="login" type="redirect">/login/login.jsp </result>
    </action>
</package>


<package name="login" extends="demo" namespace="/demo/login">
    <action name="login" class="com.demo.login.LoginAction">
    <result name="input">/login/login.jsp </result>
    </action>
</package>


===========================login.jsp

<s:form action="login.action" method="post" namespace="/demo/login">
  <table width="100%" align="center">
<tr> <td>name : <s:textfield name="loginForm.name"/> </td> </tr>
<tr> <td>password : <s:password name="loginForm.password"/> </td> </tr>
<tr> <td> <s:submit name="login" value="submit" method="login"/> </td> </tr>
    </table>
</s:form>


============ 问题
从home进入login.jsp页面时,点击"submit"按钮,程序执行正常。
但是从userManage重定向到login.jsp页面时,点击"submit"按钮,出现下面的异常:
javax.servlet.ServletException: java.lang.NoSuchMethodException: com.opensymphony.xwork2.ActionSupport.login()
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:515)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)

然后我把login.jsp的 <s:form action="login.action" method="post" namespace="/demo/login">
改成 <s:form action="login" method="post" namespace="/demo/login">
就能正常执行了。

请问为什么从home进入login.jsp页面时可以正常执行,
而从userManage重定向到login.jsp页面时就不行了?加“.action”和不加“.action”的区别是什么?

 

看web.xml就知道拉 web系统最开始找Struts是从这开始
<servlet>
    <servlet-name>action </servlet-name>
  <!-- 也是一servlet-->
    <servlet-class>org.apache.struts.action.ActionServlet </servlet-class>
    <init-param>
      <param-name>config </param-name>
      <param-value>/WEB-INF/struts-config.xml </param-value>
    </init-param> 
    <init-param>
      <param-name>debug </param-name>
      <param-value>3 </param-value>
    </init-param>       
    <init-param>     
      <param-name>detail </param-name>
      <param-value>3 </param-value>
    </init-param>
    <load-on-startup>0 </load-on-startup>
  </servlet> 
<!-- 跳转样式统一,即后缀-->
  <servlet-mapping>     
    <servlet-name>action </servlet-name>
    <url-pattern>*.do </url-pattern>
  </servlet-mapping>

 

你可以右键浏览器,查看html代码,action有何不同,应该是没加.action的生的生成的是"/webcontext/namespace/xxx.action",而加了.action的生成的是"xxx.action"

楼主应该去了解一下redirect和forward的区别
redirect,看一下浏览器的地址,应该是http://xxxxx/xxx/login/login.jsp,
会知道后者会映射到jsp路径的/xxx/login/xxx.action(因为"xxx.action"这个是相对路径,相对于jsp文件的路径),也许他巧合映射到一个action,但是这个action中没有login方法

而不用redirect的,就很好理解了,看浏览器的地址,拼接一下路径,正好映射到
/demo/login/login.action

 

通常情况下,当前输出表单的请求和提交表单的请求属于同一个名称空间。

请求:http://localhost:8080/xxxxx/demo/login/login!init.action输出的表单,名称空间会被假设为/demo/login
因此, <s:form action="login" method="post" namespace="/demo/login">,等价于 <s:form action="login" method="post">
都会定位到名称空间为/demo/login下的名为login的action,唯一的区别就是生成的html代码不一样而已。
<s:form action="login" method="post" namespace="/demo/login">生成的html为:
<form name="login" onsubmit="return true;" action="/xxxxx/demo/login/login.action" method="post">
<s:form action="login" method="post">生成的html为:
<form id="loginForm" name="login" onsubmit="return true;" action="login.action" method="post">

s:form的action属性的值如果有.action,那么struts就不再读取namespace属性的值,所以
<s:form action="login.action" method="post" namespace="/demo/login">和 <s:form action="login.action" method="post">
生成的html是一样的:
<form name="login" onsubmit="return true;" action="login.action" method="post">
如果这个form是请求http://localhost:8080/xxxxx/demo/login/login!init.action输出的,
那么当这个form再次提交时,就会查找名称空间为/demo/login下的login.action
如果这个form是请求http://localhost:8080/xxxxx/login/login.jsp输出的,那么当这个form再次提交时,就会查找名称空间为/login下的login.action

如果有这样一个form: <s:form action="regist.action" method="post" namespace="/demo/regist">,
而这个form是请求http://localhost:8080/xxxxx/demo/login/login!init.action输出的,
那么当这个form再次提交时,就会查找名称空间为/demo/login下的热regist.action,
因为此时的namespace属性已经不起作用了。


s:form的action属性的值如果没有.action,那么struts就读取namespace属性的值,所以
<s:form action="login" method="post" namespace="/demo/login">生成的html:
<form name="login" onsubmit="return true;" action="/xxxxx/demo/login/login.action" method="post">
所以,无论form是请求http://localhost:8080/xxxxx/demo/login/login!init.action输出的,还是
请求http://localhost:8080/xxxxx/login/login.jsp输出的,都将会查找名称空间为/demo/login下的login.action

    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章