Struts2学习 — Action开发、Namespace路径
struts2中Action开发的几种方式 :
-
继承 ActionSupport
public class LoginAction extends ActionSupport{} 如果需要使用struts的数据校验功能,就必须继承ActionSupport
-
实现Action 接口
public static final String SUCCESS = "success"; public static final String NONE = "none"; public static final String ERROR = "error"; public static final String INPUT = "input"; public static final String LOGIN = "login"; public String execute() throws Exception;
-
不继承、不实现任何类和接口
public class LoginAction{}
通配符
<action name="hello_*" class="com.se7en.struts.action.HelloAction" method="{1}">
<result name="success">/success.jsp</result>
</action>
method参数的值 "{ 1 }",代表name参数的值中第一个 " * " 的值
struts2 路径匹配原则
<package name="anyway" namespace="/user" extends="struts-default">
<action name="hello_*" class="com.se7en.struts.action.HelloAction" method="{1}">
<result name="success">/success.jsp</result>
</action>
</package>
访问路径1 : http://localhost:8080/struts02/user/user_login ok
访问路径2 : http://localhost:8080/struts02/user/a/b/asddf/user_login ok
访问路径3 : http://localhost:8080/struts02/a/ab/a/s/d/user/user_login no
Tomcat
- localhost 通过地址找到需要访问的机器
- 8080 通过端口号找到识别服务类型
- struts02 找到项目名称
- /user/a/b 通过对url截取获取namespace,判断这个命名空间是否存在.如果不存在继续向下截取
- /user/a 判断这个命名空间是否存在.如果不存在继续向下截取
- /user 判断这个命名空间是否存在. 如果不存在继续向下截取
- / 默认名称空间, 还没找到,报错
如果找到就返回这个名称空间,然后通过Action的name值,找到对应的class属性的值.创建Action对象.执行方法
struts 常量
Struts中常量以 " .properties "文件的形式存储.
存储的位置在 Struts - core - 2.3.4-1.jar / org.apache.struts / default.properties文件中
我们可以通过在struts.xml中使用<constant>标签来修改Struts的常量值.
下面是一些常用的Struts2常量 :
1. <constant name="struts.action.extension" value = "action,,">
自定义后缀修改常量 :
- Struts1中默认访问后缀是 : * . do
- Struts2中默认访问后缀是 : * . action
修改默认访问后缀 :
-
Struts2 的 . action访问后缀在哪里定义?
- 在 Struts - core - 2.3.4-1.jar / org.apache.struts / default.properties文件中,值为 : struts.action.extension = action,, -
修改访问后缀
通过常量修改访问后缀在struts.xml文件中,使用<constant>(常量标签)修改 <constant name="struts.action.extension" value = "action,,"> // 如果去掉value 值中的 " , , " 符号,请求路径就必须加后缀. value = "action , do ," 访问后缀 : action / do / 不带后缀 value = "action , do " 访问后缀 : action 或 do 二者必须带一个 value = "action" 访问后缀 : 只能 action
2. <constant name="struts.i18n.encoding" value="UTF-8"/>
指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出
3. <constant name="struts.serve.static.browserCache" value="false"/>
设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭
4. <constant name="struts.configuration.xml.reload" value="true"/>
当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开
5. <constant name="struts.devMode" value="true" />
开发模式下使用,这样可以打印出更详细的错误信息
6. <constant name="struts.ui.theme" value="simple" />
默认的视图主题
7. <constant name="struts.objectFactory" value="spring" />
与spring集成时,指定由spring负责action对象的创建
8. <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为 false
9. <constant name="struts.multipart.maxSize" value=“10701096"/>
上传文件的大小限制
Struts2 全局结果
当多个Action中都使用到了相同的result时, 为了避免重复定义result, 这是我们应该把result定义为全局结果.
实现 :
<package name="pattern4" namespace="/pattern4" extends="struts-default">
<!-- 定义全局result -->
<global-results>
<results name="delete">/pattern/success.jsp</results>
</global-results>
<action name="test" class="com.se7en.struts2.TestAction">
</action>
</package>
注意 : 如果全局和局部有同名的result,那么局部会覆盖全局的result
全局配置
在同一个模块中,可能会遇到很多跳转的同一个页面的逻辑.如果我们每次都对跳转声明一次的话,会显得很啰嗦.
那么我们就会考虑一次声明到处使用的想法 ------ 配置全局跳转视图
原始跳转声明情况 :
<package name="anyway" namespace="/user" extends="struts-default">
<action name="hello_login" class="com.se7en.struts.action.HelloAction" method="login">
<result name="success">/success.jsp</result>
</action>
<action name="hello_regist" class="com.se7en.struts.action.HelloAction" method="regist">
<result name="success">/success.jsp</result>
</action>
</package>
使用全局跳转视图后:
<package name="anyway" namespace="/user" extends="struts-default">
<!-- 全局跳转视图 -->
<global-results>
<result name="success">/success.jsp</result>
</global-results>
<action name="hello_login" class="com.se7en.struts.action.HelloAction" method="login">
<result name="success">/success.jsp</result>
</action>
<action name="hello_regist" class="com.se7en.struts.action.HelloAction" method="regist">
<result name="success">/success.jsp</result>
</action>
</package>
当Action返回对应页面的结果标记时,会先在Action中寻找是否有对应的跳转结果. 如果找到直接跳转.
如果Action中没有配置result,则会在全局配置中查找是否有与返回标记相对应的result. 如果还没就,就会报404
全局配置一定要放在Action前面