Struts2 中 Action 充当着一个关键的角色。它解决了如何把 JSP 页面上的数据根据实际开发项目中具体的业务逻辑来进行处理的问题。
技术要点
本节代码使用登录功能作为例子,详细解析 LoginAction 类。
=??? 如何使用 Execute 方法处理业务逻辑。
=??? 如何处理 Form 表单数据。
=??? HTTP 的 session 对象在 Action 主要使用方式。
=??? ActionMapping 对象配置文件中处理流程。
演示代码
<!------------------------------------------- 文件名: ? LoginAction .java-------------------------------->
public class LoginAction {
// Action 类公用私有变量,用来做页面导航标志
private static String FORWARD = null;
// 用户名属性
private String username;
// 密码属性
private String password;
// 取得用户名值
public String getUsername() {
?????????? return username;
}
// 设置用户名值
public void setUsername(String username) {
?????????? this.username = username;
}
// 取得密码值
public String getPassword() {
?????????? return password;
}
// 设置密码值
public void setPassword(String password) {
?????????? this.password = password;
}
?
public String execute() throws Exception {
?????????? username = getUsername();? ????????? // 属性值即 JSP 页面上输入的值
?????????? password = getPassword();?? // 属性值即 JSP 页面上输入的值
?
?????????? try {
??????????????????? //? 判断输入值是否是空对象或没有输入
??????????????????? if (username != null && !username.equals("") && password != null
?????????????????????????????????????? && !password.equals("")) {
???????????????????????????? ActionContext.getContext().getSession().put("user", getUsername());
??????????????????? //? 根据标志内容导航到操作成功页面
???????????????????????????? FORWARD = "success";
??????????????????? } else {
??????????????????? //? 根据标志内容导航到操作失败页面
???????????????????????????? FORWARD = "input";
??????????????????? }
?????????? } catch (Exception ex) {
??????????????????? ex.printStackTrace();
?????????? }
?????????? return FORWARD;
}
}
Action 类映射配置。
<!------------------------------------------- 文件名: struts.xml-------------------------------->
<action name="Login"? class="com.example.struts.action.LoginAction">
?????????? <result name="input">/jsp/login.jsp</result>
?????????? <result name="success">/jsp/success.jsp</result>
</action>
代码解释
( 1 ) Struts2 中每一具体的 Action 类其实都是将 Struts1 中的 FormBean 类和 Action 类代码都放在一起,所以看起来就是一个简单的 JavaBean 类(按照现在流行说法是 POJO , Plains Ordinary Java Object 。无格式普通 Java 对象)。比如代码中用户名和密码两个变量都是字符串类型变量,使用 get , set 方法可以从 JSP 页面上得到输入的值内容。
( 2 ) Action 类中最主要的方法为 execute 方法, Struts1 中它一共有四个参数。返回一个 ActionForward 对象。而在 Struts2 中为了不侵入 Servlet 的类和方法,同时为了更好的解耦,符合现在 Web 项目松耦合开发理念,所以这四个参数都已经不用了。 Struts2 中返回的也是一个普通字符串,此字符串内容就是之前所述的导航页面的唯一标识。
( 2 )代码中用户名和密码两个变量通过 get 方法得到 JSP 页面上输入的值内容,然后判断这两个变量是否为空对象或者字符串内容为“”,即没有输入任何数据。如果为空或者没有输入任何数据则 mapForward 赋值为“ input ”,这样就导航到错误页面。反之,则 mapForward 赋值为“ success ”,导航到成功页面。
细心的读者可以发现 LoginAction 类中给它赋的 ? “ success ”、“ input ”两个值在 struts.xml 中 <action> 元素的 < result > 属性中都有定义。这就是之前所说的唯一标识指向 URL 中的 JSP 页面。
注意:之所以操作失败后 mapForward 赋值为“ input ”,而不是“ error ”或“ failure ”是为了 Struts2 校验使用考虑,具体原因见下节。
( 3 )用户名变量的值在实际项目中有可能会被用到,因此把它放入 session 属性里。注意:该 session 和 hibernate 中的 session 是两回事情,它是 HTTP 请求中的 session 对象, getAttribute 方法和 setAttribute 方法是开发中经常用到的。它的应用范围是整个当前 HTTP 请求中,所以当用 setAttribute 方法将对像值放入后,可以在任何业务逻辑需要使用对象值时候用 getAttribute 方法取出。至于 hibernate 中的 session 我们在之后章节中另外具体讲述。在代码里 Struts2 把 session 也封装起来。通过 Struts2 包里自带的 ActionContext 类来调用,首先先得到当前 HTTP 应用中内容,然后通过 getSession 方法得到 Sessions 对象,但 Struts2 是用一个 map 对象来标识,也就是说 getSession 方法得到是一个 Sessions 对象封装处理后的结果。所以代码中可以使用 put 等 map 的方法,而不是 setAttribute 方法来将用户名变量值放入 session 。
( 4 ) Action 类的每一个实例都是和 struts.xml 中每一个 <action> 元素对应。这些 struts.xml 中的配置信息其实都是在系统开始运行时候读入内存,以供系统运行时候使用。比如此代码中通过 name 中的“ Login ”提交请求信息, control 层将信息传递给 LoginAction 处理, LoginAction 实例的 execute 方法被调用,将所对应的 Form 数据传入 LoginAction, 然后进行相应业务逻辑处理。
更多信息请查看?java进阶网?http://www.javady.com