一步一步学习struts2(2):改造你的Action
来源:互联网 发布:云计算的生活实例 编辑:程序博客网 时间:2024/05/17 07:21
*****************************************************************************************
@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 ...@Overridepublic 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.javapackage cn.luecc.vo;public class User {private String username;private String password;//getter and setter ...}//LoginAction.javapackage 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,这是因为以前我们直接将username和password提交给action,action进行填充,而现在前台(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的方法,根据实际情况灵活运用,比如你只需要一个属性,就用不需要再另建一个类了.但是几种方法都需要大家理解。
- 一步一步学习struts2(2):改造你的Action
- 一步一步学习struts2(3):Action的配置
- struts2的action的学习
- struts2中Action的学习
- 改造struts2的控件
- 改造你的FOXMAIL
- 基于OSGi的struts2改造
- struts2学习之Action的数据
- 研磨Struts2-Action的数据-学习笔记
- struts2 Action学习
- Struts2学习 Action
- Struts2学习之Action
- Struts2 Action学习
- Struts2 学习 第一章 struts2中Action类的使用
- [struts2学习笔记] 第五节 编写struts2的action代码
- 改造我们的学习
- 改造我们的学习
- 学习改造代码2
- QHeaderView的樣式設定(以QTableWidget的header為例)
- [新闻] 免费体验主机安全检查服务——微软安心服务,为您的IT环境保驾护航
- sql datetime 转换成str
- 接口和抽象类的区别
- 什么是笛卡尔积
- 一步一步学习struts2(2):改造你的Action
- 网站压力测试工具webbench
- 接口的实现方式
- Linux消息队列编程实例
- SQLServer中查找含有某文本的某类型文件
- 完美实现GIF动画缩略图(GIF压缩使用C++、shell命令、php)
- Linux旗语编程实例
- 让所有的textbox一起置零的两种方法
- exe4j生成java 版本的可执行文件