标签:
一、Action基础
在Struts2中一个请求对应一个Action类,每个Action类是独立的工作单元
一句话概括,Action就是用来处理用户每一次请求的对象
1)Action能干什么
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>public class HelloAction extends ActionSupport{ private static final long serialVersionUID = 1L; 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; } @Override public String execute() throws Exception { //1.获取参数,Struts2自动的把参数映射到上面定义的属性中 //2.组织参数 //3.调用模型的逻辑功能除处理 //这里只是单纯的打印 System.out.println("username : "+username+" password : "+password); //4.根据处理后的结果,选择需要挑战的页面的result return SUCCESS; } } </strong></span>
根据Action实现,可以看出Action充当MVC中的模型(M),封装了业务数据,还要处理业务功能。(实际开发中逻辑部分会放在逻辑层实现(service)中实现)
Struts2在运行的时候,是由Struts2的控制器FilterDispatcher来调用Action的,而Action仅仅是一次客户请求的处理,所以一般把Action看做MVC的模型部分。
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong><package name="HelloStruts" namespace="/" extends="struts-default"> <action name="helloStruts" class="xxx.xxx.action.HelloAction"> <result>/welcome.jsp</result> </action> </package></strong></span>
2)Action的实现
Struts2的Acrion可以不实现任何类或接口,只是一个POJO(plain old java Object ,简单的java类)就OK,但是必须有一个无参的构造方法,准备底层反射调用,还有有一个execute()方法
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>public String execute() throws Exception {}</strong></span>对于execute(),必须是public、无需传参,必须返回一个字符串,Exception可抛可不抛
实现Action接口
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>public class HelloAction implements Action{}</strong></span>一定是xwork的Action接口
由于Action接口定义的功能太简单,所以一般来讲都是继承ActionSupport类
实现ActionSupport的原因:
com.opensymphony.xwork2.Validateable提供了validate()为Action增加了验证功能
com.opensymphony.xwork2.Validateableaware提供方法保存和恢复action的错误信息
com.opensymphony.xwork2.TextProvider提供获取本地信息文本的功能
com.opensymphony.xwork2.LocaleProvider提供getLocale()方法获取本地信息
这些接口使得实现了ActionSupport后的Action类拥有了实现数据检验和访问本地信息的功能
简单的数据验证
实现数据验证功能,需要覆盖validate()方法,在validate()内部进行请求参数的验证
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>public class HelloAction extends ActionSupport{ private static final long serialVersionUID = 1L; private String username; private String password; @Override public void validate() { <span style="white-space:pre"> </span>System.out.println("validate..........."); if(username==null || username.trim().isEmpty()){ this.addFieldError("ue", "用户名不能为空"); } if(password == null || password.trim().isEmpty()){ this.addFieldError("pe", "密码不能为空"); } } @Override public String execute() throws Exception { System.out.println("username : "+username + " password : "+password); return SUCCESS; } } </strong></span>当数据验证不通过的时候,使用父类的addFieldError(key,value)方法来添加验证错误信息,
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong><action name="helloStruts" class="xxx.xxxx.action.HelloAction"> <result>/welcome.jsp</result> <result name="input">/login.jsp</result> </action></strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong><s:debug></s:debug> <form action="helloStruts"> Username:<input type="text" name="username"/>${fieldErrors.ue }或<s:fielderror fieldName="ue"></s:fielderror> <br> Password:<input type="password" name="password">${fileErrors.pe }/<s:fielderror fieldName="pe"></s:file> <br><br> <input type="submit"/> </form></strong></span>
execute()方法的内部实现:
1.收集用户传递的参数
在execute()方法里面,不需要用代码去实现收集参数(request.getxxx()),页面传递来的参数会自动的填充到Action属性中,这个自动是由拦截器来实现
2.组织参数
比如说逻辑层需要一个对象,那么execute()就把数据组织成为逻辑层需要的类型和格式就可以了
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>public String execute() throws Exception { System.out.println("username : "+username + " password : "+password); FormData data = new FormData(); data.setUserName(username); data.setPassword(password); return SUCCESS; }</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>@Override public String execute() throws Exception { System.out.println("username : "+username + " password : "+password); FormData data = new FormData(); data.setUserName(username); data.setPassword(password); service.XXXX(data); return SUCCESS; }</strong></span>
5.返回处理的result,转向下一个页面
标签:
原文地址:http://blog.csdn.net/wjw0130/article/details/46387437