码迷,mamicode.com
首页 > 其他好文 > 详细

走进Struts2(二) — Action类(上)

时间:2015-06-06 14:57:54      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:

一、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>

对于Action的配置非常简单,只需要配置Action名称和Action类的全类名

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接口
继承ActionSupport类

由于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)方法来添加验证错误信息,
当验证不通过的时候,会自动挑战到struts.xml文件中的action配置中的result为input的指定的页面

<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>

login.jsp

<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>

validate()会先于execute()方法执行,只有validate()方法验证通过后,才会执行execute()方法,否则直接跳转result是input的页面

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>

3.调用逻辑层来进行数据的逻辑处理

<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>

4.准备下一个页面需要展示的数据

5.返回处理的result,转向下一个页面


走进Struts2(二) — Action类(上)

标签:

原文地址:http://blog.csdn.net/wjw0130/article/details/46387437

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!