与 的区别

============= struts.xml 
 
     
    
     
    /demo/login  
    login!init.action  
   
 
    
     
    /demo/userManage  
    userManage!init.action  
   
 
   
 


 
     
    /login/login.jsp  
   
 


 
     
    /login/login.jsp  
   
 


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

 
 

 
 
 
 
   
name :
password :
 


============ 问题 
从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的  
改成  
就能正常执行了。

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

 

看web.xml就知道拉 web系统最开始找Struts是从这开始 
 
    action 
   
    org.apache.struts.action.ActionServlet  
     
      config  
      /WEB-INF/struts-config.xml  
   
  
     
      debug  
      3  
   
        
          
      detail  
      3  
   
 
    0  
 
  
 
        
    action  
    *.do  
 

 

你可以右键浏览器,查看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 
因此, ,等价于  
都会定位到名称空间为/demo/login下的名为login的action,唯一的区别就是生成的html代码不一样而已。 
namespace="/demo/login">生成的html为: 

 
生成的html为: 
 

s:form的action属性的值如果有.action,那么struts就不再读取namespace属性的值,所以 
 
生成的html是一样的: 
 
如果这个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: , 
而这个form是请求http://localhost:8080/xxxxx/demo/login/login!init.action输出的, 
那么当这个form再次提交时,就会查找名称空间为/demo/login下的regist.action, 
因为此时的namespace属性已经不起作用了。 


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

你可能感兴趣的:(Struts2)