一步一步学习struts2(2):改造你的Action

*****************************************************************************************

@author lue

@e-mail luecsc@gmail.com

学习笔记,仅供参考,如有错误请联系

*****************************************************************************************

在上一讲的时候,我们直接自己构造的一个action如下:

package cn.luecc.action;

public class LoginAction {
	private String username;
	private String password;
	// getter and setter ...
	public String execute() {
		if(username.equals("aaa")&&password.equals("aaa")) {
			return "loginSuc";
		}else {
			return "loginFail";
		}
	}
}

其对应的struts.xml文件中有如下配置语句:

<action name="login" class="cn.luecc.action.LoginAction">
	<result name="loginSuc">/loginSuc.jsp</result>
	<result name="loginFail">/loginFail.jsp</result>
</action>

但是在struts2中我们一般不建议这样来创建action,下面就来改造自己写的action

第一种方法:实现Action接口

package cn.luecc.action;
import com.opensymphony.xwork2.Action;

public class LoginAction implements Action{
	private String username;
	private String password;
	//getter and setter ...
	@Override
	public String execute() throws Exception {
		if(username.equals("aaa")&&password.equals("aaa")) {
			return SUCCESS;
		}else {
			return ERROR;
		}
	}
}

对应的struts.xml文件中action配置如下:

<action name="login" class="cn.luecc.action.LoginAction">
	<result name="success">/loginSuc.jsp</result>
	<result name="error">/loginFail.jsp</result>
</action>

第二种方法:继承ActionSupport

这里我们先不重写execute()方法

package cn.luecc.action;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport{
	private String username;
	private String password;
	//getter and setter ...
}

我们来看一下运行结果:

点击登录后:

我们看到尽管我们的用户名和密码都输入错误,它仍然登录成功了。这里是因为如果你不重写execute()方法的话,则执行基类的execute()方法,这个方法的返回值就是success,所以这里我们不管输入什么都会显示登录成功。

所以我们要重写execute()方法,在以上代码中添加:

public String execute() throws Exception {
		if(username.equals("aaa")&&password.equals("aaa")) {
			return SUCCESS;
		}else {
			return ERROR;
		}
}

注:在实际开发中,我们创建action时,绝大多数情况下,我们都继承ActionSupport,因为ActionSupport提供了比action更多的方法,可以大大提高我们的开发效率。

在以上的例子中,我们注意到一个问题就是我们将user的属性全部放在了action中,我们要取得user的属性的话必须从action中获取。我们想象一下,如果我们有一个用户要注册,那么他涉及的属性就会特别的多,那么action就会显得特别臃肿,所以我们就需要把user的属性与action分离。所以,我们对action做如下改造(通过领域模型来接收用户输入)

我们新建一个user类来封装user的所有属性,项目的层次如下:

 

//User.java
package cn.luecc.vo;

public class User {
	private String username;
	private String password;
	//getter and setter ...
}
//LoginAction.java
package cn.luecc.action;
import cn.luecc.vo.User;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport{
	private User user = null;
	//getter and setter ...
	public String execute() throws Exception {
	//注意这里使用get来取得属性值	if(user.getUsername().equals("aaa")&&user.getPassword().equals("aaa")) {
			return SUCCESS;
		}else {
			return ERROR;
		}
	}
}

:我们在这儿并没有new一个user对象,有人可能认为会出现空指针错误,其实在struts2中会自动给我们填充user,自动生成user,所以在struts2中不用new对象。

运行一下:

我们看到运行后抛出NullPointerException,这是因为以前我们直接将usernamepassword提交给actionaction进行填充,而现在前台(Login.jsp)根本不知道怎样与User中的属性绑定,所以我们需要告诉前台,将login.jsp做如下修改:

<form action="login.action" method="post">
<!-- 告知前台从user中取得属性 -->		
姓名:<input type="text" name="user.username"><br>
密码:<input type="text" name="user.password"><br>
	<input type="submit" value="登录">		
</form>

最后介绍struts2中使用ModelDriven来接收用户输入:

public class LoginAction extends ActionSupport implements ModelDriven<User>{
	//这里一定要new一个User对象
	private User user = new User();
	public String execute() throws Exception {
		if(user.getUsername().equals("aaa")&&user.getPassword().equals("aaa")) {
			return SUCCESS;
		}else {
			return ERROR;
		}
	}

	public User getModel() {
		return user;
	}
}

相应的前台页面应修改为:

<form action="login.action" method="post">
	姓名:<input type="text" name="username"><br>
	密码:<input type="text" name="password"><br>
	<input type="submit" value="登录">		
</form>

以上介绍了3种创建action的方法,根据实际情况灵活运用,比如你只需要一个属性,就用不需要再另建一个类了.但是几种方法都需要大家理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值