在Struts2中,Action是可以携带数据的,并且是线程安全的.我们可以通过Jsp页面的Form表单向Action传递数据.这主要有两种方式:
①在Action中组装javaBean的属性到对象.
JSP页面:
- <s:form action="loginAction">
- <s:textfield label="UserName" name="user.userName" />
- <s:textfield label="Password" name="user.password"/>
- <s:textfield label="Email" name="user.email"/>
- <s:submit />
- </s:form>
Action中代码
- private User user;
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- @Override
- public String execute() throws Exception {
- if(StringUtils.isBlank(user.getUserName())
- || StringUtils.isBlank(user.getPassword())
- || StringUtils.isBlank(user.getEmail()))
- {
- return "failed";
- }
- if(userService.validateUserRegistered(user))
- {
- return "registerTipPage";
- }
- return SUCCESS;
- }
在Result页面要访问userName属性,也需要写user.userName.
②ModelDriven 方式
- 首先,我们的Action类需要实现ModelDriven接口,这是一种泛型类接口,里面只有一个方法getModel()方法,它返回一个泛型类对象.
- 我们需要在Action类中完成对象类的初始化,并将它在getModel()方法中作为返回值返回.
实例如下:(Java代码)
- @Controller("loginAction")
- @Scope("prototype")
- public class LoginAction extends ActionSupport implements ModelDriven<User> {
- private User user = new User();
- public User getModel() {
- // TODO Auto-generated method stub
- return user;
- }
- }
在JSP页面的访问方式如下:
- <s:form action="loginAction">
- <s:textfield label="UserName" name="userName" />
- <s:textfield label="Password" name="password"/>
- <s:textfield label="Email" name="email"/>
- <s:submit />
- </s:form>
需要说明的是使用ModelDriven Action,有以下几点需要注意:
在Action的方法中,不要再进行创建相应的对象的操作,即使手动创建了相应的对象,并对这个对象进行赋值,在显示时,也会只显示原来从页面接收的数据.例如:
测试的Java代码
- @Override
- public String execute() throws Exception {
- user = new User();
- user.setPassword("zhangsan");
- user.setUserName("zhangsan");
- user.setEmail("zhangsan@sina.cn");
- if(StringUtils.isBlank(user.getUserName())
- || StringUtils.isBlank(user.getPassword())
- || StringUtils.isBlank(user.getEmail()))
- {
- return "failed";
- }
- if(userService.validateUserRegistered(user))
- {
- return "registerTipPage";
- }
- return SUCCESS;
- }
在这段代码中,希望将从用户表单提交过来的数据进行修改,于是重新创建了一个User实例,看Jsp页面的测试结果:
点击提交后,按原来的意图,希望出现UserName,zhangsan等信息,但实际如下:
还是原来表单提交的数据.如果改成这样,就OK了
- @Override
- public String execute() throws Exception {
- // user = new User();
- user.setPassword("zhangsan");
- user.setUserName("zhangsan");
- user.setEmail("zhangsan@sina.cn");
- if(StringUtils.isBlank(user.getUserName())
- || StringUtils.isBlank(user.getPassword())
- || StringUtils.isBlank(user.getEmail()))
- {
- return "failed";
- }
- if(userService.validateUserRegistered(user))
- {
- return "registerTipPage";
- }
- return SUCCESS;
- }
结果如下:
所以在使用ModelDriven模式时,一定要注意以下几点
- 必须完成初始化,在类级别
- 不要将实例引用指向一个新创建的对象或者已经存在的其它对象,否则会出现意料外的事件.