首页 > 代码库 > 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获取表单数据