Struts2的Action之生命周期_czjuttsw的博客-程序员秘密

技术标签: string  struts  SSH  action  setter  user  webwork  

我们知道,Struts2结合了WebWork和Struts1的优点,并且,Struts2和Struts1之间有很大的不同,其中原因是因为大部分都是继承自WebWork框架。

在编写Struts2框架的过程中,Action和ActionForm合二为一。Action从Web容器中解放出来,大大降低了耦合度。因为它大可不必继承自Action类,

并且不存在现成安全。

下面简单测试下Struts2中Action的生命周期:

(1) 首先是最简单的Action(简单类型的变量)

首先是一个页面表单:

		<form action="verify.action" method="post">
			姓名:<input type="text" name="username" /> <br/>
			密码:<input type="password" name="password" /><br/>
			<input type="submit" value="登录" />
		</form>

然后是一个Action类:

package zjut.tsw;


public class LoginAction {
	
	/*
	 * 两个实例变量
	 */
	private String username;
	private String password;

	//构造方法
	public LoginAction() {
		System.out.println("Invoke LoginAction->constructor");
	}
	
	//Getter and Setter Methods
	public String getUsername() {
		System.out.println("Invoke getUsername()");
		return username;
	}

	public void setUsername(String username) {
		System.out.println("Invoke setUsername()");
		this.username = username;
	}

	public String getPassword() {
		System.out.println("Invoke getPassword()");
		return password;
	}

	public void setPassword(String password) {
		System.out.println("Invoke setPassword()");
		this.password = password;
	}

	public String execute() {
		System.out.println("LoginAction->execute()");
		if(username.equals(password)) 
			return "success";
		else 
			return "fail";
		
	}

		
}


struts.xml:


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<package name="struts2" extends="struts-default">
		<action name="verify" class="zjut.tsw.LoginAction">
			<result name="success">/loginSuccess.jsp</result>
			<result name="fail">/loginFail.jsp</result>
		</action>
	</package>
</struts>    

loginSuccess.jsp 和 loginFail.jsp分别显示“登录成功”和“登录失败”,代码就不贴了。


输出结果为:

Invoke LoginAction->constructor
Invoke setPassword()
Invoke setUsername()
LoginAction->execute()
Invoke LoginAction->constructor
Invoke setPassword()
Invoke setUsername()
LoginAction->execute()
Invoke LoginAction->constructor
Invoke setPassword()
Invoke setUsername()
LoginAction->execute()
...
...


(2)Action类里包含Bean:


表单内容:

		<form action="verify.action" method="post">
			姓名:<input type="text" name="user.username" /> <br/>
			密码:<input type="password" name="user.password" /><br/>
			<input type="submit" value="登录" />
		</form>

User.java:

package zjut.tsw;

public class User {

	public User() {
		System.out.println("User->Constructor");
	}
	private String username;
	public String getUsername() {
		System.out.println("Invoke getUsername()");
		return username;
	}
	public void setUsername(String username) {
		System.out.println("Invoke setUsername()");
		this.username = username;
	}
	public String getPassword() {
		System.out.println("Invoke getPassword()");
		return password;
	}
	public void setPassword(String password) {
		System.out.println("Invoke setPassword()");
		this.password = password;
	}
	private String password;
}



LoginAction.java:


package zjut.tsw;

public class LoginAction {

	public LoginAction() {
		System.out.println("LoginAction->Constructor");
	}
	private User user;

	public User getUser() {
		System.out.println("Invoke GetUser()");
		return user;
	}

	public void setUser(User user) {
		System.out.println("Invoke setUser()");
		this.user = user;
	}

	public String execute() {
		System.out.println("Invoke execute()");
		System.out.println("LoginAction->execute()");
		if (user.getUsername().equals(user.getPassword()))
			return "success";
		else
			return "fail";

	}

}


输出:


LoginAction->Constructor
Invoke GetUser()
User->Constructor
Invoke setUser()
Invoke setPassword()
Invoke GetUser()
Invoke setUsername()
Invoke execute()
LoginAction->execute()
Invoke getUsername()
Invoke getPassword()
LoginAction->Constructor
Invoke GetUser()
User->Constructor
Invoke setUser()
Invoke setPassword()
Invoke GetUser()
Invoke setUsername()
Invoke execute()
LoginAction->execute()
Invoke getUsername()
Invoke getPassword()
...
...




从输出结果我们可以看出,框架首先会创建一个LoginAction对象,然后调用Setter方法将表单里的值赋值给相应的变量。赋值完后再调用execute方法,然后通过struts.xml中的配置定位到相应的处理页面。

不存在线程安全问题:对于struts1框架,对于每一次请求,都会用同一个线程来处理,这样如果存在一些共享变量,会引起线程安全问题,而struts2则不存在,因为每一次请求都会新建一个对象。

另外表单里的name属性值和相应的Setter和Getter方法对应,和具体的变量名没有关系。

比如: 对于表单里的这样一个输入框  :

<input type="text" name="weight" />

在Action类里可以这样写:

	private String w;
	
	public void setWeight(String w) {
		this.w = w;
	}
	public String getWeight() {
		return w;
	}

总之,setXXX() 和 getXXX() 中的XXX名要和表单里的name属性名相同,(在方法里的名字首字母要大写)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/czjuttsw/article/details/8065766

智能推荐

java.lang.NoSuchMethodError:com.intellij.ide.plugins.PluginManagerCore_轻风细语飞云8680的博客-程序员秘密

一、出现原因 1、Android Studio升级到4.1以上可能会出现 原因是插件不兼容所导致 2、以前安装过低版本的Android Studio,重新安装4.1以上版本之后不能启动二、解决办法 如果你是windows10系统且找不到AppData文件夹,则有可能是因为此文件夹被隐藏了,按一下步骤就可以看到隐藏的文件夹了1、打开C:\Users\your_user_name(最后一个路径是你计算机的用户名)后 点击左上角查看按钮 再点击右方隐藏的...

mysql-5.7.14-win32.zip 解压版 安装过程_mysql-5.7.14-win32安装_帅的被人砍xxx的博客-程序员秘密

mysql5.7.10启动修改初始密码 Could not create or access the registry key needed1.data目录不见了启动   mysql>mysqld --initialize mysqld: Could not create or access the registry key needed for the MySQL

Uboot和系统移植(16)------- Linux内核的配置和编译原理_移植系统需要会编译原理吗_big__C的博客-程序员秘密

目录一,linux内核源码目录结构二,内核配置和编译体验三,内核的配置原理四,menuconfig的使用和演示五,menuconfig的工作原理六,Kconfig文件详解一,linux内核源码目录结构1、源码从哪里来(1)之前讲过,我们使用2.6.35.7版本的内核。这个版本的内核有三种:第一种是kernel.org上的官方版本,第二种是三星移植过的,第三种是九鼎X210的移植版本。我们使用第三种内核来讲解,后面的移植实验使用第二种内核来移植。(2)解压后最终在windows下得到了一个kernel

nginx secure_link下载防盗链_weixin_33819479的博客-程序员秘密

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

随便推点

android项目常见疑问_android项目问题_冉航--小虾米的博客-程序员秘密

android笔记:ServiceLifecycleDispatcher: onServicePreSuperOnDestroy中分发了 ON_STOP与ON_DESTROY两个事件,因此自定义类可以感知Service的ON_STOP和ON_DESTROY两个事件,当Serivce执行到生命周期的onDestroy时。...

创建java线程的3种方式_线程 用lamad thread_gaoxiaomo的博客-程序员秘密

1、继承Thread类2、实现Runnable3、通过java8的lamad表达式创建或者通过线程池创建:Excutors.newCachedThread代码:public class c_001 { static class myThread extends Thread{ public void run(){ System.o...

php数组转xml的递归实现_php arraytoxml递归_徊忆羽菲的博客-程序员秘密

php数组转xml的递归实现原数组转换xml显示结果原数组{ "appid":"wx25d5153f5f7beb45", "mch_id":"1542278261", "nonce_str":"8b57a6f2307067c8d7fc73db923ba966", "device_info":"WEB", "body":"奇葩天地网", "out_...

netty入门一(新手上路,高手绕道)_netty菜鸟教程_奋斗的小乌龟的博客-程序员秘密

Hello World 入门(注意看注释)gradle依赖dependencies { // https://mvnrepository.com/artifact/io.netty/netty-all compile group: 'io.netty', name: 'netty-all', version: '4.1.30.Final' }Server.javaimpor...

无人船与智慧船舶解决方案_北京航通天下科技有限公司的博客-程序员秘密

CambridePixel的无人船解决方案可以为用户提供模块化的雷达目标跟踪(SPxServer)、雷达控制(通过SPxServer)、数据融合(SPxFusion)、数据记录回放(RDR)、摄像机控制(CameraControl)以及智能显控平台等产品。如USVx是基于Windows的客户端软件应用,它可以提供远程岸基或“母舰”控制无人船雷达及其追踪功能。

provider:SQL Network Interfaces,error:26 - 定位指定的服务器/实例时出错--错误原因及解决办法_guo_wen_qiang的博客-程序员秘密

问题截图:错误错误原因一未启动SQL服务错误原因二数据库和VS自带的LocalDB有冲突;导致远程过程调用失败:(需要卸载VS中的LocalDB)方法解决办法一启动SQL Server(SQLEXPRESS)服务。解决办法二卸载Microsoft SQL Server 201* Express Loca