Action
- action创建的几种方法
- action的访问方法
- action的调用原理
- result标签
Action 是用来处理操作请求的,它是由StrutsPrepareAndExecuteFilter分发过来的
Action 创建的几种方法
- POJO类(PlainOldJavaObjects 简单的java对象),不需要继承任何父类,实现任何接口
public class TestAction {
public String execute() {
return "success";
}
}
这种方法是通过Struts框架通过反射实现的步骤:
- Struts2框架通过读取Struts.xml文件来获取action的完整路径
- Object object = Class.forName(“完整类名”).newInstance();
- Method method = Class.forName(“完整类名”).getMethod(“execute”);
- method.invoke(object);
execute() 方法的要求:
- 方法的权限修饰符为public
- 返回一个字符串
- 方法没有参数
- 实现action接口
public class TestAction implements Action {
/**
* 可以不重写execute方法,用自定义的方法,但是
* 在配置文件中需要显示指定方法名method=要执行的方法
*/
@Override
public String execute() {
return "success";
}
}
Action接口中定义五种逻辑视图名称(常量):
public static final String SUCCESS = "success"; // 数据处理成功 (成功页面)
public static final String NONE = "none"; // 页面不跳转 return null; 效果一样
public static final String ERROR = "error"; // 数据处理发送错误 (错误页面)
public static final String INPUT = "input"; // 用户输入数据有误,通常用于表单数据校验 (输入页面)
public static final String LOGIN = "login"; // 主要权限认证 (登陆页面)
- 继承ActionSupport类(推荐)
- 其实ActionSupport类中,已经实现了Action接口
- 而且可以在Action中使用表单校验、错误信息设置、读取国际化信息三个功能,所以推荐使用
public class TestAction extends ActionSupport {
/**
* 可以不重写execute方法,用自定义的方法,但是
* 在配置文件中需要显示指定方法名method=要执行的方法
*/
@Override
public String execute() {
return "success";
}
}
Action的访问
在配置<action>
元素的时候,没有制定method属性,默认执行Acting类中的execute方法。
1、基本访问
在JSP页面中,有以下的action访问路径
<a href="${pageContext.request.contextPath}/book/update.action">测试</a>
struts.xml 配置文件
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/book" extends="struts-default">
<action name="add" class="cn.sunny.action.BookAction" method="add">
<result name="success">/success.jsp</result>
</action>
<action name="update" class="cn.sunny.action.BookAction" method="update">
<result name="success">/success.jsp</result>
</action>
<action name="delete" class="cn.sunny.action.BookAction" method="delete">
<result name="success">/success.jsp</result>
</action>
<action name="search" class="cn.sunny.action.BookAction" method="search">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
通过<package>
的namespace与<action>
的name属性结合与请求资源路径对比,可以知道访问哪一个action,在通过<action>
的class知道访问哪一个Action类,通过method知道访问哪一个方法。
2、使用通配符
使用通配符* 简化struts.xml 配置
JSP页面:
<a href="${pageContext.request.contextPath}/book/Book_add">book_add</a><br>
<a href="${pageContext.request.contextPath}/book/Book_update">book_update</a><br>
<a href="${pageContext.request.contextPath}/book/Book_delete">book_delete</a><br>
<a href="${pageContext.request.contextPath}/book/Book_search">book_search</a><br>
action 配置:
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/book" extends="struts-default">
<action name="*_*" class="cn.itcast.action.{1}Action" method="{2}">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
上面配置方法解说:
<action>
中的name属性的值中每一个"*“代表长度不为0的任意字符串,name=”_"表示页面访问的action名称必须为为类似book_add.action、book _update.action形式。如果在name属性定义了通配符之后,可以在class属性、method属性、
<result>
的name属性以及返回的jsp页面名字中都可以使用通配符,{1}代表第一个*,{2}代表第二个*。
3、动态调用
当在<action>
中不配置method属性同时又不希望执行默认的execute方法时,可以使用动态方法调用,访问的方式为"action名"+"!"+“方法名”:
<a href="${pageContext.request.contextPath}/book/book!add">bookadd</a>
action配置
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/book" extends="struts-default">
<action name="book" class="cn.sunny.action.BookAction">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
Action 名称的搜索顺序
- 获取请求路径的URL,例如Url为:
<a href="${pageContext.request.contextPath}/path1/path2/path3/update.action">测试</a>
- 首先寻找namespace为/path1/path2/path3的package。如果存在这个package,则在这个package中寻找名字为update的action,如果不存在这个package则执行第3步;
- 寻找namespace为/path1/path2的package,如果存在这个package,则在这个package中寻找名字为update的action,如果不存在这个package则执行第4步;
- 寻找namespace为/path1的package,如果存在这个package,则在这个package中寻找名字为update的action,如果仍然不存在这个package,则去默认的namespace的package中寻找名字为update的action(默认的namespace值为"/"),如果还是找不到,页面提示找不到action。
package 中的默认值
- 如果没有为package指定namespace,则默认的namespace值为"/";
- 如果action中没有指定class,则默认的class为ActionSupport;
- 如果action中没有指定method,则默认的method为execute;
- 如果result中没有指定name,则默认的name为success。
result标签
-
根据action方法的返回值,配置到不同的路径里面
-
如果 action方法返回值为none 或者 返回类型void 可以不用加result标签,否则会报错
-
标签属性
- name属性: 和方法返回值一样,可以到不同的路径里面
- type 属性
- 配置如何到路径中,(转发或重定向)
- 属性默认值,做转发操作
-
内容 :Struts(3) — 结果页配置
最后更新:2018.10.31