Struts2获取表单数据总结
网站的数据很多都是通过表单来传到后台的(最常见的就是登入界面),所以开发的时候就需要和表单打交道了。恰逢正在学习struts 2,总结下它接收表单数据的几种方法。如有不对,请多指教(。^▽^)
⊙属性封装
⊙模型驱动封装
⊙表达式封装
属性封装
步骤:
1.在action中定义成员变量(变量名必须要和表单的name属性的值一致)。
2.写出(生成)定义的变量的get和set方法【set方法一定要有】。
原理:
Struts 2中内部封装这种操作,只要表单的name值和action中的成员变量名一致,就会将name值赋给对应的变量。
主要代码:
表单
loginAction
这样你就获得了表单中的内容,你也可输出它们的值与数据库中的值做比较等(uid,upassword中的值现在action后执行之后就被赋上了表单上对应的值)。
这里说一下如何自动生成get和set方法
在代码编辑区域右键,然后就能出现如下界面,按图中操作就可:
模型驱动封装
步骤:
1.action实现ModelDriven接口
2.实现接口里的getModel方法(获取创建的对象)
3.在action创建实体类对象(前提:表单name值和实体类属性名称一样)
原理:也是Struts 2中内部封装这种操作,具体原理还得去琢磨源码。
关键代码:
Student实体类
1public class Student {
2 private String name;
3 private String grade;
4 private String number;
5 public String getName() {
6 return name;
7 }
8 public void setName(String name) {
9 this.name = name;
10 }
11 public String getGrade() {
12 return grade;
13 }
14 public void setGrade(String grade) {
15 this.grade = grade;
16 }
17 public String getNumber() {
18 return number;
19 }
20 public void setNumber(String number) {
21 this.number = number;
22 }
23}
表单页面
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}/formaction1" method="post">
11 名字:<input name="name" type="text"/></br>
12 年级:<input name="grade" type="text"/></br>
13 学号:<input name="number" type="text"/></br>
14 <input type="submit" value="确定"/>
15 </form>
16</body>
17</html>
formaction1代码
1import javax.servlet.http.HttpServletRequest;
2import org.apache.struts2.ServletActionContext;
3import com.entity.Student;
4import com.opensymphony.xwork2.ActionSupport;
5import com.opensymphony.xwork2.ModelDriven;
6public class FormAction1 extends ActionSupport implements ModelDriven<Student>{
7 private Student student = new Student();
8 public Student getModel() {
9 return student;
10 }
11 public String execute() {
12 System.out.println(student.getName());
13 System.out.println(student.getGrade());
14 return NONE;
15 }
16}
最后控制台就会输出名字和年级了。
表达式封装
步骤:
- 在action中声明实体类(只需声明,无需创建)。
- 生成(或写出)实体类变量的get和set方法。
- 写表单的时候将表单的name值写为表达式形式。
实体类仍使用上面的Student类
formaction2代码:
1import com.entity.Student;
2import com.opensymphony.xwork2.ActionSupport;
3
4public class FormAction2 extends ActionSupport{
5 private Student student;
6 public Student getStudent() {
7 return student;
8 }
9 public void setStudent(Student student) {
10 this.student = student;
11 }
12 public String execute() {
13 System.out.println(student.getName());
14 return NONE;
15 }
16}
表单页代码:
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="formaction2" method="post">
11 名字:<input name="student.name" type="text" /></br>
12 年级:<input name="student.grade" type="text"/></br>
13 学号:<input name="student.number" type="text"/></br>
14 <input type="submit" value="确定"/>
15 </form>
16
17</body>
18</html>
然后比较一下表达式封装与模型驱动
相同:两者都能把数据封装到实体类中去。
不同:模型驱动封装在一个Action中只能将表单数据封装到一个实体类对象中去。而表达式封装可在一个Action中将数据封装到多个实体类对象中去。(例如:我可以在表达式封装的action中再引入一个实体类,然后在表单的name属性值中,就写引入的实体类对象中属性名,这样就实现了同时封装到两个不同的实体类对象的操作)