在Struts2中页面的数据和Action有两种基本对应方式,分别是:属性驱动和模型驱动。
其中属性驱动又分为:基本类型的属性对应和JavaBean风格的属性对应
一。属性驱动
1.基本类型的属性驱动。
在Action里面设置属性名称和jsp页面设置的属性名称一样就可以了,当然Action里面的属性要有getter、setter方法,或者直接把属性设置成public的(但是一般都不那么做)。
package com.action; import com.opensymphony.xwork2.Action; public class HelloWorldAction implements Action { private String account; private String password; private String submitFlag; @Override public String execute() throws Exception { // TODO Auto-generated method stub if(account.equals("ironman")&&password.equals("123")){ return "toWelcome"; }else{ return "loginError"; } } //public 的 getter setter方法。。。 public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getSubmitFlag() { return submitFlag; } public void setSubmitFlag(String submitFlag) { this.submitFlag = submitFlag; } }
jsp代码
<form action="helloworldAction" method="post"> <input type="hidden" name="submitFlag" value="login"/> username:<input type="text" name="account"><br> password:<input type="password" name="password"><br> <input type="submit" value="submit"/> </form>
可以看到那些属性名都是一样的。
2.JavaBean风格的属性对应。
首先写一个JavaBean将属性封装起来,并且提供public的setter和getter方法。
package com.bean; public class HelloWorld { private String account; private String password; private String submitFlag; public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getSubmitFlag() { return submitFlag; } public void setSubmitFlag(String submitFlag) { this.submitFlag = submitFlag; } }
我们现在来看Action的代码会发现少很多,内容也比较清晰,所以平常使用最多的也是这种方法。当然三种方法可以混合使用,但是要避免冲突。
package com.action; import com.bean.HelloWorld; import com.opensymphony.xwork2.Action; public class HelloWorldAction implements Action{ private HelloWorld hello = new HelloWorld(); @Override public String execute() throws Exception { // TODO Auto-generated method stub if(hello.getAccount().equals("ironman")&&hello.getPassword().equals("123")){ return "toWelcome"; }else{ return "loginError"; } } public HelloWorld getHello() { return hello; } public void setHello(HelloWorld hello) { this.hello = hello; } }
再来看看jsp中的代码,会有一些不一样。
<form action="helloworldAction" method="post"> <input type="hidden" name="hello.submitFlag" value="login"/> username:<input type="text" name="hello.account"><br> password:<input type="password" name="hello.password"><br> <input type="submit" value="submit"/> </form>
我们看到,在属性前面要加上了那个对象的名字。
二。使用模型驱动。
他的基本实现方式是让Action实现一个ModelDriven接口,这个接口需要我们实现个getModel的方法,这个方法返回的就是Action所使用的数据模型对象。
主要是在Action里面有变化,只是添加了ModelDriven的实现,另外去掉了对应的getter/setter方法,其他的都没有什么变化。
package com.action; import com.bean.HelloWorld; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ModelDriven; public class HelloWorldAction implements Action , ModelDriven{ private HelloWorld hello = new HelloWorld(); @Override public Object getModel() { // TODO Auto-generated method stub return hello; } @Override public String execute() throws Exception { // TODO Auto-generated method stub if(hello.getAccount().equals("ironman")&&hello.getPassword().equals("123")){ return "toWelcome"; }else{ return "loginError"; } } }