Struts2(二)---将页面表单中的数据提交给Action

点击打开链接https://blog.csdn.net/u012804035/article/details/71690365

Struts2 获取表单数据到实体的三种方法

方法一:属性封装

(1)在action中声明属性成员变量,要求变量的名称和表单中name的名称一致,表单内容代码如下:

 <form  name="form1" method="post" action="${pageContext.request.contextPath }/data1.action">
     姓名:<input name="username" type="text"/><br/>
     密码:<input name="password" type="text"/><br/>
     地址:<input name="address" type="text"/><br/>
     <input type="submit" value="提交">
   </form>

action中代码如下:

public class UserInfo extends ActionSupport {




private String username;
private String password;
private String address;

@Override
public String toString() {
return "UserInfo [getUsername()=" + getUsername() + ", getPassword()="
+ getPassword() + ", getAddress()=" + getAddress() + "]";
}


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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}

public String execute()
{
    
System.out.println(toString());
return NONE;
}

}


配置代码如下:

 <action name = "data1" class = "com.data.UserInfo"></action>


方法二:模型驱动封装

(1)在action中实现接口ModelDriven

(2)实现接口里面的getModel方法,返回建立的对象

(3)在action 中手动建立实体类。(前提要求:表单输入项name与实体成员变量名称相同)

action中的代码如下:

public class data2 extends ActionSupport implements ModelDriven<UserInfo>{


private UserInfo ui = new UserInfo();

@Override
public UserInfo getModel() {
// TODO Auto-generated method stub
return ui;
}
    
public String execute()
{
System.out.println(ui);
return NONE;
}

}

方法三:属性表达式封装

(1)在action中声明一个实体类

(2)在action中生成实体类的set和get方法

(3)在表单输入name的使用    实体类.name 的方式

表单代码如下:

<form  name="form1" method="post" action="${pageContext.request.contextPath }/data3.action">
     姓名:<input name="userinfo.username" type="text"/><br/>
     密码:<input name="userinfo.password" type="text"/><br/>
     地址:<input name="userinfo.address" type="text"/><br/>
     <input type="submit" value="提交">
   </form>


action中的代码如下:

public class data3 extends ActionSupport {

private UserInfo userinfo;


public UserInfo getUserinfo() {
return userinfo;
}


public void setUserinfo(UserInfo userinfo) {
this.userinfo = userinfo;
}

public String execute()
{
System.out.println(userinfo);
return NONE;
}

}


模型驱动与属性封装的区别:

(1)模型驱动一次只能给一个实体类赋值,如果表单中数据想要分别赋值给两个实体类,该方法做不到

(2)属性封装就可以做到,代码如下:

action 中代码如下:

public class data3 extends ActionSupport {

private UserInfo userinfo;
    private User2 user2;
    
public User2 getUser2() {
return user2;
}


public void setUser2(User2 user2) {
this.user2 = user2;
}


public UserInfo getUserinfo() {
return userinfo;
}


public void setUserinfo(UserInfo userinfo) {
this.userinfo = userinfo;
}

public String execute()
{
System.out.println(userinfo +"\n" + user2);
return NONE;
}

}


表单中的代码如下:

<form  name="form1" method="post" action="${pageContext.request.contextPath }/data3.action">
     姓名:<input name="userinfo.username" type="text"/><br/>
     密码:<input name="userinfo.password" type="text"/><br/>
     地址:<input name="userinfo.address" type="text"/><br/>
     性别:<input name="user2.sex" type="text"/><br/>
     
     <input type="submit" value="提交">
   </form>






https://blog.csdn.net/uniquewonderq/article/details/4682135

点击打开链接https://blog.csdn.net/uniquewonderq/article/details/468213533

转载请注明http://blog.csdn.net/uniquewonderq

问题:在struts2框架下,如何将表单数据传递给业务控制器Action。

struts2中,表单想Action传递参数的方式有两种,并且这两种传参方式都是struts2默认实现的,他们分别是基本属性注入、域模型注入、其中

---基本属性注入,是将表单的数据项分别传入给Action中的一些基本基本类型。

---域模型注入,是将表单的数据项打包传入给Action中的一个实体对象。

我们继续使用项目Struts2的hello Struts实例,在其基础上使用这2中方式完成页面向Action的参数传递。具体的我们可以在项目首页index.jsp上追加表单,并在表单中模拟一些数据,将这些数据提交给HelloAction,最后在HelloAction中将接受的参数输出到控制台。

具体实现步骤:

1>基本属性注入

步骤一:

在Struts2Day01项目的index.jsp中,追加表单,并将该表单设置提交给HelloAction,即将form的action属性设置为:“/Struts2Day01/demo/hello.action”

在表单中增加一个文本框,用于输入一个姓名,该文本框的name属性值为name。代码如下:

[html]  view plain  copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>My JSP 'index.jsp' starting page</title>  
  13.     <meta http-equiv="pragma" content="no-cache">  
  14.     <meta http-equiv="cache-control" content="no-cache">  
  15.     <meta http-equiv="expires" content="0">      
  16.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  17.     <meta http-equiv="description" content="This is my page">  
  18.     <!-- 
  19.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  20.     -->  
  21.   </head>  
  22.     
  23.   <body>  
  24.     This is my JSP page. <br><br>  
  25.     <form action="/Struts2Day01/demo/hello.action"  method="post">  
  26.     <!-- 演示基本属性注入 -->  
  27.     姓名:<input type="text" name="realName"/><br/><br/>  
  28.     <input type="submit" value="提交"/>  
  29.     </form>  
  30.   </body>  
  31. </html>  

步骤二:HelloAction中,接收表单传入的参数

在HelloAction中,追加属性并用于接收表单传入的姓名参数,该属性的名称要求与文本框的值相同(realName),并且该属性需要具备set方法。

在业务方法中输出属性realName的值。通知为了方便观察代码执行的顺序,在Action默认构造器中,输出任意的文字,代码如下:

[java]  view plain  copy
  1. package Action;  
  2.   
  3. public class HelloAction {  
  4.         public HelloAction(){  
  5.             System.out.println("实例化Action...");  
  6.         }  
  7.         //定义基本类型属性,接受表单参数:姓名  
  8.         private String realName;  
  9.         public void setRealName(String realName){  
  10.             System.out.println("注入参数realName...");  
  11.             this.realName=realName;  
  12.         }  
  13.         public String sayHello(){  
  14.             System.out.println("Hello,Action");  
  15.             //输出基本类型数据  
  16.             System.out.println("姓名:"+realName);  
  17.             return "success";  
  18.         }  
  19. }  

步骤三:测试

重新部署该项目并启动tomcat,打开浏览器,针对当前的案例,在地址栏中输入地址:http://localhost:8888/StrutsDay01/

运行结果:

点击提交:

myeclipse控制台输出:


控制台输出的顺序可以证明代码的执行顺序:实例化Action--->调用set方法注入参数-->调用业务方法,当然这个过程是Struts2的API自行实现的,我们只需要在写代码时满足上述步骤中的要求即可。

由于index.jsp中的表单将请求提交给HelloAction,而HelloAction又会跳转到hello.jsp,因此最终浏览器显示的效果如下图:

2>域模型注入

步骤一:修改表单,追加演示数据

在index.jsp修改表单,追加用户名、密码两个文本框,模拟输入用户的相关信息,代码如下:

[java]  view plain  copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>My JSP 'index.jsp' starting page</title>  
  13.     <meta http-equiv="pragma" content="no-cache">  
  14.     <meta http-equiv="cache-control" content="no-cache">  
  15.     <meta http-equiv="expires" content="0">      
  16.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  17.     <meta http-equiv="description" content="This is my page">  
  18.     <!--  
  19.     <link rel="stylesheet" type="text/css" href="styles.css">  
  20.     -->  
  21.   </head>  
  22.     
  23.   <body>  
  24.     This is my JSP page. <br><br>  
  25.     <form action="/StrutsDay01/demo/hello.action" method="post">  
  26.     <!-- 演示基本属性注入 -->  
  27.     姓名:<input type="text" name="realName"/><br><br>  
  28.     <!-- 演示域模型注入 -->  
  29.     用户名:<input type="text"/><br><br>  
  30.  密码:<input type="password"/><br><br>  
  31.     <input type="submit" value="提交"/>  
  32.     </form>  
  33.   </body>  
  34. </html>  


步骤二:创建实体类

创建包entity,用于存放实体类。在entity包下创建实体类User,用于封装表单中追加的数据,即用户名、密码。User中要包含两个属性,用于封装用户名、密码,并给属性提供get和set方法,代码如下:

[java]  view plain  copy
  1. package entity;  
  2.   
  3. public class User {  
  4.     private String userName;//用户名  
  5.     private String password;//密码  
  6.     public String getUserName() {  
  7.         return userName;  
  8.     }  
  9.     public void setUserName(String userName) {  
  10.         this.userName = userName;  
  11.     }  
  12.     public String getPassword() {  
  13.         return password;  
  14.     }  
  15.     public void setPassword(String password) {  
  16.         this.password = password;  
  17.     }  
  18.       
  19.       
  20. }  


步骤三:修改HelloAction,接受表单传入的参数

在HelloAction中,追加属性用于接受表单传入的用户名、密码参数,该属性的类型为User类型,名称为user,并为该属性提供get和set方法。

在业务方法(sayHello())中输出属性user的值,代码如下:

[java]  view plain  copy
  1. package action;  
  2.   
  3. import entity.User;  
  4.   
  5. public class HelloAction {  
  6.         public  HelloAction(){  
  7.             System.out.println("实例化 Action...");  
  8.         }  
  9.         //定义基本类型属性,接受表单参数:姓名  
  10.         private String realName;  
  11.         public void setRealName(String realName){  
  12.             System.out.println("注入参数realName...");  
  13.             this.realName=realName;  
  14.         }  
  15.         //定义实体对象属性,接受表单参数:用户名、密码  
  16.         private User user;  
  17.         public void setUser(User user){  
  18.             this.user=user;  
  19.         }  
  20.         public User getUser(){  
  21.             return this.user;  
  22.         }  
  23.         //在业务方法中输出"Hello,Action"  
  24.         public String sayHello(){  
  25.             System.out.println("Hello,Action");  
  26.             //输出基本类型数据  
  27.             System.out.println("姓名:"+realName);  
  28.               
  29.             //输出域模型方法注入的参数  
  30.             System.out.println("用户名:"+user.getUserName());  
  31.             System.out.println("密码:"+user.getPassword());  
  32.             return "success";  
  33.         }  
  34. }  

步骤四:修改表单,设置文本框属性

在index.jsp中,修改表单新增的2个文本框name属性值。对于域模型注入的方式,文本框name属性值应该是具有"对象名.属性名"格式的表达式。其中对象名指的是Action中的实体类型属性名,属性名指的是实体类型中的属性名,代码如下:

[java]  view plain  copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>My JSP 'index.jsp' starting page</title>  
  13.     <meta http-equiv="pragma" content="no-cache">  
  14.     <meta http-equiv="cache-control" content="no-cache">  
  15.     <meta http-equiv="expires" content="0">      
  16.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  17.     <meta http-equiv="description" content="This is my page">  
  18.     <!--  
  19.     <link rel="stylesheet" type="text/css" href="styles.css">  
  20.     -->  
  21.   </head>  
  22.     
  23.   <body>  
  24.     This is my JSP page. <br><br>  
  25.     <form action="/StrutsDay01/demo/hello.action" method="post">  
  26.     <!-- 演示基本属性注入 -->  
  27.     姓名:<input type="text" name="realName"/><br><br>  
  28.     <!-- 演示域模型注入 -->  
  29.     用户名:<input type="text" name="user.userName"/><br><br>  
  30.  密码:<input type="password" name="user.password"/><br><br>  
  31.     <input type="submit" value="提交"/>  
  32.     </form>  
  33.   </body>  
  34. </html>  

步骤五:测试

重新部署项目并启动tomcat,在浏览器中输入地址:http://localhost:8888/StrutsDay01/

效果如下图所示(当然为了稍候测试方便,我自己输入了一些信息):

点击提交,查看myeclipse的控制台,输出结果如下:


控制台输出的顺序可以证明代码的执行顺序为:实例化Action-->实例化User并注入参数-->调用set方法注入User对象-->调用业务方法。

最终浏览器显示的效果如下图:









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值