首页 > 代码库 > struts2入门之struts2获取表单数据

struts2入门之struts2获取表单数据

在上一篇博文中分享了action如何获取表单数据,在本篇博文中分享一下用struts2这个框架如何来获取表单数据。

struts2获取表单数据可以分为三种方式:

1、属性封装

2、模型驱动封装

3、表达式封装

分别介绍以上三种方式:

  属性封装的步骤:首先在action中定义成员变量,并写set方法(这里为了避免和后面的混淆,把get和set方法都写上得了),然后该action要访问的form表单中的属性值要和定义的成员变量名称一样,在action访问到jsp页面时,form表单中的数据都已经拿到了,下面show my code:

action代码:

 1 package com.cczhao.struts.form;
 2 
 3 import com.opensymphony.xwork2.ActionSupport;
 4 
 5 /**
 6  * 功能: TODO 当点击表单提交的时候访问Action,表单中的userName,passWord,address数据都可以获取到.<br/>
 7  * date: 2017年6月25日 上午8:44:17 <br/>
 8  *
 9  * @author cczhao
10  * @version
11  * @since JDK 1.8
12  */
13 public class Form1Demo extends ActionSupport {
14 
15     private static final long serialVersionUID = 1L;
16     // 声明的成员变量的名称要和form表单中的数据的name属性值相同
17     private String userName;
18     private String passWord;
19     private String address;
20 
21     public String execute() throws Exception {
22         return "success";
23     }
24 
25     public String getUserName() {
26         return userName;
27     }
28 
29     public void setUserName(String userName) {
30         this.userName = userName;
31     }
32 
33     public String getPassWord() {
34         return passWord;
35     }
36 
37     public void setPassWord(String passWord) {
38         this.passWord = passWord;
39     }
40 
41     public String getAddress() {
42         return address;
43     }
44 
45     public void setAddress(String address) {
46         this.address = address;
47     }
48 }

 

hello.jsp代码:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     <form action="${pageContext.request.contextPath }/form1.action"
11         method="post">
12         userName:<input type="text" name="userName" /><br /> passWord:<input
13             type="text" name="passWord" /><br /> address:<input type="text"
14             name="address" /><br /> <input type="submit" value="提交" />
15     </form>
16 </body>
17 </html>

 

struts.xml配置如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 4     "http://struts.apache.org/dtds/struts-2.3.dtd">
 5 <struts>
 6     <package name="formDemo" extends="struts-default" namespace="/">
 7         <action name="form1" class="com.cczhao.struts.form.Form1Demo">
 8             <result name="success">/hello.jsp</result>
 9         </action>
10     </package>
11 </struts>

 

   模型驱动封装可以直接把表单中的数据封装到一个实体对象中,步骤如下,

  首先需要有一个实体类: 

 

 1 package com.cczhao.struts.bean;
 2 
 3 public class User {
 4     private String userName;
 5     private String passWord;
 6     private String address;
 7 
 8     public String getUserName() {
 9         return userName;
10     }
11 
12     public void setUserName(String userName) {
13         this.userName = userName;
14     }
15 
16     public String getPassWord() {
17         return passWord;
18     }
19 
20     public void setPassWord(String passWord) {
21         this.passWord = passWord;
22     }
23 
24     public String getAddress() {
25         return address;
26     }
27 
28     public void setAddress(String address) {
29         this.address = address;
30     }
31 
32     @Override
33     public String toString() {
34         return "User [userName=" + userName + ", passWord=" + passWord + ", address=" + address + "]";
35     }
36 
37 }

 

 

 

    然后,jsp页面中form表单中的要填写的数据和上面定义的实体类的成员变量要一致,即名称要一样,当然不一样也不会报错,只是你后面获取不到这部分数据罢了,jsp代码如下:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     <form action="${pageContext.request.contextPath }/form2.action"
11         method="post">
12         userName:<input type="text" name="userName" /><br /> passWord:<input
13             type="text" name="passWord" /><br /> address:<input type="text"
14             name="address" /><br /> <input type="submit" value="http://www.mamicode.com/提交" />
15     </form>
16 </body>
17 </html>

 

    接下来就是action部分代码:

 1 package com.cczhao.struts.form;
 2 
 3 import com.cczhao.struts.bean.User;
 4 import com.opensymphony.xwork2.ActionSupport;
 5 import com.opensymphony.xwork2.ModelDriven;
 6 
 7 /**
 8  * 
 9  * 功能: TODO 用模型驱动封装的方式来获取表单数据.<br/>
10  * date: 2017年6月25日 上午8:56:28 <br/>
11  *
12  * @author cczhao
13  * @version
14  * @since JDK 1.8
15  */
16 public class Form2Demo extends ActionSupport implements ModelDriven<User> {
17 
18     private static final long serialVersionUID = 1L;
19     /**
20      * 具体步骤: 1、在acton中创建实体类对象 2、写这个对象的set和get方法
21      * 3、核心是通过实现ModelDriven这个接口中的getModel()方法,来获取表单对象数据
22      */
23     private User user = new User();
24 
25     @Override
26     public User getModel() {
27         return user;
28     }
29 
30     public String execute() throws Exception {
31         System.out.println(user);
32         return "success";
33     }
34 
35     public User getUser() {
36         return user;
37     }
38 
39     public void setUser(User user) {
40         this.user = user;
41     }
42 
43 }

   struts.xml文件和上面的一样只需要把action标签中的name属性值改成form表单中请求的action名称即可。

  表达式封装也是现在我正在用的一种方式,这种方式也需要有一个实体类User,和上面一样,action的代码如下:

 1 package com.cczhao.struts.form;
 2 
 3 import com.cczhao.struts.bean.User;
 4 import com.opensymphony.xwork2.ActionSupport;
 5 
 6 /**
 7  * 
 8  * 功能: TODO 表达式封装也可以直接把表单中的数据直接封装到实体对象中去,步骤如下:.<br/>
 9  * 1、action中声明一个实体对象(只是声明)<br/>
10  * 2、写这个对象的get和set方法 <br/>
11  * 3、form表单中不能像以前那样直接写属性名称了,要写成对象.属性名(user.useName)<br/>
12  * date: 2017年6月25日 上午9:17:27 <br/>
13  *
14  * @author cczhao
15  * @version
16  * @since JDK 1.8
17  */
18 public class Form3Demo extends ActionSupport {
19 
20     private static final long serialVersionUID = 1L;
21     private User user;
22 
23     public String execute() throws Exception {
24         System.out.println(user);
25         return "success";
26     }
27 
28     public User getUser() {
29         return user;
30     }
31 
32     public void setUser(User user) {
33         this.user = user;
34     }
35 
36 }

 

   jsp代码如下:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10 <h1>厉害了,word 哥。。。。</h1>
11 <form action="${pageContext.request.contextPath }/form3.action"
12         method="post">
13         userName:<input type="text" name="user.userName" /><br /> passWord:<input
14             type="text" name="user.passWord" /><br /> address:<input type="text"
15             name="user.address" /><br /> <input type="submit" value="http://www.mamicode.com/提交" />
16     </form>
17 </body>
18 </html>

 

 ======================================================================================

总结:属性封装只能获取表单中各个属性的值,如果需要封装到对象中,还需手动setValue();但是模型驱动封装和表达式封装可以将form表单中的数据封装到实体对象中,在实际的开发项目中可能更实用点。但是,这以上三种获取表单数据的方式,不能混合使用。

---------------------分割线------------------------

拓展一下,利用struts2可以封装实体对象,也可以封装成list集合或者map集合。

 

struts2入门之struts2获取表单数据