最近在用SSH框架作一个项目,在使用Struts 的namespace时遇到很多问题,如今就对struts namespace 作一个简单的介绍吧.(本文从项目结构展开叙述)web
(第1次写博客, 写的很差,请见谅,望你们多提宝贵意见~)ajax
1. 新建一个项目工做叫作eczone, WebRoot的文件目录结构以下spring
2. 在web.xml中,欢迎页面的配置以下:apache
<display-name>Eczone</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
若是,index.jsp在/WebRoot/pages/下面, 上面的配置则须要修改成: /pages/index.jsptomcat
3. 访问方式: http://localhost:8080/eczone/ app
其中eczone为项目名称,也就是发布到tomcat的webapp下面的项目名。 (到如今彷佛还没进来主题,别急让咱们继续往下看-----》》)框架
4. URL的组成结构以下:(如下为最简单的用户登陆后的url)webapp
(关于.action,何时须要指定,何时不须要,将在后面解释)jsp
5. 先看Struts.xml的配置测试
1 <struts> 2 <constant name="struts.devMode" value="true"></constant> 3 <!--Spring plus 经过overriding struts objectFactory 来增强框架核心对象的建立 --> 4 <constant name="struts.objectFactory" 5 value="org.apache.struts2.spring.StrutsSpringObjectFactory" /> 6 <package name="mypkg2" extends="struts-default"> 7 <action name="userLogin" class="com.dragon.eczone.action.user.UserAction" method="login"> 8 <result name="success">/pages/success2.jsp</result> 9 <result name="failure">/pages/failure.jsp</result> 10 </action> 11 </package> 12 <package name="mypkg1" namespace="/" extends="struts-default"> 13 <action name="userLogin" class="com.dragon.eczone.action.user.UserAction" method="login"> 14 <result name="success">/pages/success1.jsp</result> 15 <result name="failure">/pages/failure.jsp</result> 16 </action> 17 </package> 18 <package name="user" namespace="/user" extends="struts-default"> 19 <action name="userLogin" class="com.dragon.eczone.action.user.UserAction" method="login"> 20 <result name="success">/pages/success.jsp</result> 21 <result name="failure">/pages/failure.jsp</result> 22 </action> 23 </package> 24 </struts>
说明: 1. success1.jsp, success2.jsp能够加入到/pages/ 目录下进行测试,到底请求了那个action. (在success.jsp, success1.jsp, success2.jsp上呈现不一样内容来区别)
2. Struts在处理请求时,若是请求指定了namespace , struts 会根据指定的namespace去查找action;
若是请求没有指定namespace, Struts则从默认namespace的根目录去查找acton
3. 在 Struts.xml中namespace="/" 为默认的根目录, 若是不指定namespace的值则也等同于namespace="/".
6. 在看index.jsp的 代码
<s:form name="loginForm" action="userLogin" method="POST" namespace="/user"> <s:textfield name="userName" label="Login name" /> <s:password name="passWord" label="Password" /> <s:submit value="Login" align="center" />
</s:form>
说明:1. namespace 若是不指定, 默认为 namespace="/" 更目录
2. action为Struts.xml中定义的action的名称.
3. 有的地方会指定action为如下值:
》 /user/userLogin 这种方式,页面能够跳转成功, 可是控制台会抛异常或警告 :
No configuration found for the specified action: '/user/userLogin' in namespace: '/user'. Form action defaulting to 'action' attribute's literal value.
》 /user/userLogin.action 这种方式页面能跳转成功,出现以下警告:
No configuration found for the specified action: '/user/userLogin.action' in namespace: '/user'. Form action defaulting to 'action' attribute's literal value.
4. 最后来讲.action的事情 , <s:form>使用的是Struts标签,会自动添加.action, 若是是ajax等本身拼装URL的时候,必须加上.action.
小结:
1. struts.xml中尽可能显示的指明page, 和namespace (建议将page和namespace设置成同一值)
2. 若是本身拼装URL,则按照上面第4点中URL的结构拼装。
3. 若是使用struts 标签方式<s:form>, 则建议显示的指定action, namespace(参照Struts.xml中配置)