Struts2中Action充当着一个关键的角色。它解决了如何把JSP页面上的数据根据实际开发项目中具体的业务逻辑来进行处理的问题。
技术要点
本节代码使用登录功能作为例子,详细解析LoginAction类。
如何处理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,然后进行相应业务逻辑处理。
1 楼 fengshinianshao 2011-11-30 00:34