十一 三种Struts2的数据封装方式,封装页面传递的数据
Struts2的数据封装:Struts2是一个web层框架,框架是软件的半成品。提供了数据封装的基本功能。
注:Struts2底层(核心过滤器里面的默认栈里面的拦截器,具体见struts-default.xml)完成了参数的接收、封装、类型转换的功能。例如字符串与基本类型转换的功能
分类:
属性驱动:提供属性set方法的方式(基本不用)、页面中提供表达式方式(实际上是内部提供的OGNL表达式)
模型驱动(最常用):采用模型驱动方式,通过实现一个模型驱动的接口ModelDriven,手动提供对象的实例private User user = new User();
区别:
- 属性驱动:向多个数据封装中同时封装数据
- 模型驱动: 最常用的方式,缺点:只能同时向一个对象中封装数据
提供属性set方法的方式(不常用,缺点是需要自己往对象里面封装) :
这种方式很少用,除非数据少,需要在Action类里自己往对象里封装
前端jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>Struts2的数据封装</h1> <h3>方式一:属性驱动:提供Set方法的方式</h3> <form action="${pageContext.request.contextPath }/userAction1.action" method="post"> 用户名:<input type="text" name="username"><br/> 密码:<input type="password" name="password"><br/> 年龄:<input type="text" name="age"><br/> 生日:<input type="text" name="birthday"><br/> 工资:<input type="text" name="salary"><br/> <input type="submit" value="提交"> </form> </body> </html>
实体类User:
package com.itheima.struts2.domain; /** * 实体对象 */ import java.util.Date; public class User { private String username; private String password; private int age; private Date birthday; private Double salary; public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } public void setAge(int age) { this.age = age; } public void setBirthday(Date birthday) { this.birthday = birthday; } public void setSalary(Double salary) { this.salary = salary; } @Overridepublic String toString() { return "User [username=" + username + ", password=" + password + ", age=" + age + ", birthday=" + birthday + ", salary=" + salary + "]";} }
Action类:
package com.itheima.struts2.demo2; import java.util.Date; import com.itheima.struts2.domain.User; import com.opensymphony.xwork2.ActionSupport; /** * 数据封装的方式一:属性封装 * */ public class UserAction1 extends ActionSupport { private String username; private String password; private Integer age; private Date birthday; private Double salary; public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } public void setAge(Integer age) { this.age = age; } public void setBirthday(Date birthday) { this.birthday = birthday; } public void setSalary(Double salary) { this.salary = salary; } public String execute() throws Exception{ //接收数据 System.out.println(username); System.out.println(password); System.out.println(age); System.out.println(birthday); System.out.println(salary); //封装数据 User user = new User(); user.setAge(age); user.setUsername(username); user.setBirthday(birthday); user.setSalary(salary); return NONE; } }
属性驱动:提供页面表达式的方式
前端JSP:name属性前加上实体类的对象前缀,如:user.password
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>Struts2的数据封装</h1> <h3>方式二:属性驱动:提供页面表达式方式</h3> <form action="${pageContext.request.contextPath }/userAction2.action" method="post"> 用户名:<input type="text" name="user.username"><br/> 密码:<input type="password" name="user.password"><br/> 年龄:<input type="text" name="user.age"><br/> 生日:<input type="text" name="user.birthday"><br/> 工资:<input type="text" name="user.salary"><br/> <input type="submit" value="提交"> </form> </body> </html>
Action类:相较而言,这种直接封装对象,而不是操作属性的方式,比较简约
package com.itheima.struts2.demo2; import com.itheima.struts2.domain.User; import com.opensymphony.xwork2.ActionSupport; /** * 数据封装方式二:属性驱动 * @author 李腾 * */ public class UserAction2 extends ActionSupport { //提供一个User对象,在前端页面的name属性上加上user前缀 private User user; //提供user的get和set方法,一定要提供get方法 //因为拦截器提供对象的封装,需要创建User对象,前提是前端属性名字的前缀和类一样 public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String execute() throws Exception{ System.out.println(user); return NONE; } }
模型驱动:采用模型驱动的方式(最常用)
Action类实现ModelDriven接口,重写getModel方法,返回实体对象
缺点:只能向一个对象(比如user)中封装对象。而页面表达式可以向多个对象封装(只需改变name属性的前缀如student.username user.username )
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>Struts2的数据封装</h1> <h3>方式三:模型驱动方式</h3> <form action="${pageContext.request.contextPath }/userAction3.action" method="post"> 用户名:<input type="text" name="username"><br/> 密码:<input type="password" name="password"><br/> 年龄:<input type="text" name="age"><br/> 生日:<input type="text" name="birthday"><br/> 工资:<input type="text" name="salary"><br/> <input type="submit" value="提交"> </form> </body> </html>
Action类:
package com.itheima.struts2.demo2; import com.itheima.struts2.domain.User; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; /** * 数据封装方式三:模型驱动 最常用的方式,缺点:只能同时向一个对象中封装数据 * 二:向多个数据封装中同时封装数据 * @author 李腾 * */ public class UserAction3 extends ActionSupport implements ModelDriven<User>{ //前提:手动实例化User private User user = new User(); //模型驱动需要使用的方法 @Override public User getModel() { return user; } public String execute() throws Exception{ System.out.println(user); return NONE; } }
十一 三种Struts2的数据封装方式,封装页面传递的数据的更多相关文章
- 九 三种Struts2访问Servlet方式总结
Servlet是单例的,Action是多例的. 多个程序访问Servlet只会创建一个Servlet对象,多个程序访问Action会创建对应的多个Action对象. 跳转页面可以获取对象的属性,说明使 ...
- Spring中三种配置Bean的方式
Spring中三种配置Bean的方式分别是: 基于XML的配置方式 基于注解的配置方式 基于Java类的配置方式 一.基于XML的配置 这个很简单,所以如何使用就略掉. 二.基于注解的配置 Sprin ...
- 三种Singleton的实现方式
来源:http://melin.iteye.com/blog/838258 三种Singleton的实现方式,一种是用大家熟悉的DCL,另外两种使用cas特性来实现. public class Laz ...
- Objective-C:三种文件导入的方式以及atomic和nonatomic的区别
一.三种文件导入的方式比较: 类的前项声明@class.import.include: 1.采用@class 类名的方式,它会告诉编译器有这么一个类,目前不需要知道它内部的实例变量和方法是如何定义 ...
- 浅淡Webservice、WSDL三种服务访问的方式(附案例)
Webservice Webservice是使应用程序以与平台和编程语言无关的方式进行相互通信技术. eg:站点提供访问的数据接口:新浪微博.淘宝. 官方解释:它是一种构建应用程序的普遍模型,可以在任 ...
- 三种root的修补方式
三种root的修补方式 system/core/adb/abd.c adbd漏洞,请看abd.c的第917行/* then switch user and group to "shell&q ...
- 三种Tomcat集群方式的优缺点分析
三种Tomcat集群方式的优缺点分析 2009-09-01 10:00 kit_lo kit_lo的博客 字号:T | T 本文对三种Tomcat集群方式的优缺点进行了分析.三种集群方式分别是:使用D ...
- python列表和字符串的三种逆序遍历方式
python列表和字符串的三种逆序遍历方式 列表的逆序遍历 a = [1,3,6,8,9] print("通过下标逆序遍历1:") for i in a[::-1]: print( ...
- Objective-C:三种文件导入的方式比较
三种文件导入的方式比较: 类的前项声明@class.import.include: 1.采用@class 类名的方式,它会告诉编译器有这么一个类,目前不需要知道它内部的实例变量和方法是如何定义 ...
随机推荐
- MySQL中 IS NULL、IS NOT NULL、!= 能用上索引吗?
看面试题的时候,总能看到MySQL在什么情况下用不上索引,如下: MySQL的WHERE子句中包含 IS NULL.IS NOT NULL.!= 这些条件时便不能使用索引查询,只能使用全表扫描. 不耽 ...
- ioutils
import yaml import json import csv import configparser class IoUtils(object): """ dep ...
- uniGUI之FDQuery(28)
1]基本设置FDQuery1.Connection2]执行查询SQL语句3]执行 非查询SQL语句4]返回所有数据 和所有 列名 1]基本设置FDQuery1.Connection 一定要 放一个 ...
- Springmvc-crud-01错误
错误:无法显示图书列表内容 原因:获取存储域对象中的名字写错了 controller层: 前端页面: 解决方案:前后端的代码要保持一致(名字自己定义),写代码要细心 修改成功后的界面
- 去除移动端苹果手机(ios)的input默认样式与input禁止键盘出现的方式
样式: input{-webkit-appearance: none;} 在iPhone plus点击input框出生日期时会出现如下图: 为了去掉下面那条苹果自带的,可以这样处理:在HTML中的in ...
- opencv python:图像二值化
import cv2 as cv import numpy as np import matplotlib.pyplot as plt # 二值图像就是将灰度图转化成黑白图,没有灰,在一个值之前为黑, ...
- 【visio】 图片
1.背景页设置 新建背景页:新建页面>设计>页面设置>页属性 使用背景页:在页属性页的"背景" 选项里,选择需要的背景. 2.插入图片 支持插入本地图片 ...
- Android学习04
Toast Toast是Android系统提供的一种非常好的提示方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何的屏幕空间. 1.默认Toast 在 ...
- jq 获取input多选框
1.获取checkbox选中个数 $("input[name='ckb-jobid']:checked").length $("input[type='checkbox' ...
- C语言:使用递归解决汉诺塔问题。
//汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小 ...