首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

<s:form action="XX.action"> 与 <s:form action="XX"&g

2012-01-12 
s:form actionXX.action 与 s:form actionXX 的区别 struts.xmlpackage nameho

<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[color=#FF0000][/color]" method="post" namespace="/demo/login">
改成<s:form action="login[color=#FF0000][/color]" method="post" namespace="/demo/login">
就能正常执行了。

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




[解决办法]
PS:--加“.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>
[解决办法]
你的struts.xml配置文件有问题,写了namespace 建议不写namespace.
[解决办法]
这个.action 跟.do 不一样么?? 创建的时候貌似可以选择这两种啊..
[解决办法]
login.action就是被后缀为.action的ActionServlet拦截,转到响应的Action

[解决办法]
用STRUTS2标签写.ACTION和不写是一样 不用STRUTS2标签就要加.ACTION
[解决办法]
其实简单点来讲,因为你是用了struts2的标签了

如果不是用struts2的标签,是用html标签的话,就要在action名后加上个.action,也就是XXX.action

而像LZ你用的是struts2的标签的话,action名里就不用再加上个.action了
也就是XXX就可以了,struts2标签已经默认帮你加好了,你就不需要自己另外加了
[解决办法]
通常情况下,当前输出表单的请求和提交表单的请求属于同一个名称空间。

请求: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

[解决办法]

探讨
引用:
引用:
用STRUTS2标签写.ACTION和不写是一样 不用STRUTS2标签就要加.ACTION

请先实践一下,然后贴代码说话吧,否则容易产生基本错误,误导其他人


<s:form> 有默认 ACTION

jsp的 <form > 要写ACTION


热点排行