技术标签: 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>
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>
输出结果为:
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()
...
...
不存在线程安全问题:对于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;
}
一、出现原因 1、Android Studio升级到4.1以上可能会出现 原因是插件不兼容所导致 2、以前安装过低版本的Android Studio,重新安装4.1以上版本之后不能启动二、解决办法 如果你是windows10系统且找不到AppData文件夹,则有可能是因为此文件夹被隐藏了,按一下步骤就可以看到隐藏的文件夹了1、打开C:\Users\your_user_name(最后一个路径是你计算机的用户名)后 点击左上角查看按钮 再点击右方隐藏的...
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
目录一,linux内核源码目录结构二,内核配置和编译体验三,内核的配置原理四,menuconfig的使用和演示五,menuconfig的工作原理六,Kconfig文件详解一,linux内核源码目录结构1、源码从哪里来(1)之前讲过,我们使用2.6.35.7版本的内核。这个版本的内核有三种:第一种是kernel.org上的官方版本,第二种是三星移植过的,第三种是九鼎X210的移植版本。我们使用第三种内核来讲解,后面的移植实验使用第二种内核来移植。(2)解压后最终在windows下得到了一个kernel
为什么80%的码农都做不了架构师?>>> ...
android笔记:ServiceLifecycleDispatcher: onServicePreSuperOnDestroy中分发了 ON_STOP与ON_DESTROY两个事件,因此自定义类可以感知Service的ON_STOP和ON_DESTROY两个事件,当Serivce执行到生命周期的onDestroy时。...
1、继承Thread类2、实现Runnable3、通过java8的lamad表达式创建或者通过线程池创建:Excutors.newCachedThread代码:public class c_001 { static class myThread extends Thread{ public void run(){ System.o...
php数组转xml的递归实现原数组转换xml显示结果原数组{ "appid":"wx25d5153f5f7beb45", "mch_id":"1542278261", "nonce_str":"8b57a6f2307067c8d7fc73db923ba966", "device_info":"WEB", "body":"奇葩天地网", "out_...
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的客户端软件应用,它可以提供远程岸基或“母舰”控制无人船雷达及其追踪功能。
问题截图:错误错误原因一未启动SQL服务错误原因二数据库和VS自带的LocalDB有冲突;导致远程过程调用失败:(需要卸载VS中的LocalDB)方法解决办法一启动SQL Server(SQLEXPRESS)服务。解决办法二卸载Microsoft SQL Server 201* Express Loca