博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts2--Action处理请求参数(属性驱动、模型驱动)
阅读量:2441 次
发布时间:2019-05-10

本文共 4867 字,大约阅读时间需要 16 分钟。

在 Struts2 框架中,页面的请求数据和 Action 有两种基本的对应方式,分别是字段驱动(FieldDriven,也称为属性驱动)方式和模型驱动(ModelDriver)方式。

属性驱动

属性驱动是指在 Action 中通过字段属性进行与页面之间的数据传递,通常使用时会包括两种情况:一种是与基本数据类型的属性对应,另一种是直接使用域对象。

1. 基本数据类型字段驱动方式的数据传递

public class UserAction extends ActionSupport {
private String username; // 用户名 private String password; // 密码 // 此处省略两个属性的getter和setter方法 private String execute() throws Exception {
return SUCCESS; }}

在上述 Action 类的代码中,定义了两个字符串字段 username 和 password,这两个字段分别用于对应页面上的用户名和密码这两个表单域。

2. 直接使用域对象字段驱动方式的数据传递

在基本数据类型字段驱动方式中,如果传入的数据很多,那么 Action 的属性也会变得很多,再加上属性对应的 getter/setter 方法,势必会导致 Action 非常臃肿。

为了解决这一问题,我们可以把属性的 getter/setter 方法从 Action 中提取出来单独作为一个域对象,并在相应的 Action 中直接使用这个域对象。此种方式中的域对象一般以 JavaBean 的形式实现,JavaBean 中所封装的属性要和页面中表单的属性一一对应。此时 JavaBean 将成为数据传递的载体,并可以在其他 Action 中使用。

示例:

1. 在 struts2Demo02 项目的 src 目录下创建一个名称为 pers.zhang.domain 的包,在包中创建一个 User 类,编写代码后如下所示。

public class User {
private String username; private String password; // username的getter和setter方法 public String getUsername() {
return username; } public void setUsername(String username) {
this.username = username; } // password的getter和setter方法 public String getPassword() {
return password; } public void setPassword(String password) {
this.password = password; }}

2. 在 pers.zhang.action 包中创建一个名称为 UserLoginAction 的类,在类中定义一个 User 类型的域模型以及其 getter 和 setter 方法,如下所示。

import com.mengma.domain.User;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;public class UserLoginAction extends ActionSupport {
private User user; // 定义User属性 // user属性的getter和setter方法 public User getUser() {
return user; } public void setUser(User user) {
this.user = user; } public String execute() throws Exception {
// 获取Context对象 ActionContext context = ActionContext.getContext(); if ("admin".equals(user.getUsername()) && "123456".equals(user.getPassword())) {
// 将用户名和密码放入session中 context.getSession().put("username", user.getUsername()); context.getSession().put("password", user.getPassword()); return SUCCESS; } else {
context.getSession().put("error", "用户名或密码错误!"); return ERROR; } }}

在 UserLoginAction 中,首先声明了一个 User 类型的 user 对象,以及其 getter 和 setter 方法,然后在 execute() 方法中,获取了 ActionContext 对象以访问 Servlet API,下面通过对比从 User 对象获取的用户名和密码来判断是否登录成功。

需要注意的是,在使用域对象的属性驱动方式传值时,如果 JSP 页面是负责取值的,那么取值的格式必须为“对象名.属性名”;如果 JSP 页面是负责传值的,那么传值的格式可以为“模型对象名.属性名”,也可以直接是“属性名”。

3. 分别创建登录页面 userLogin.jsp、登录成功页面 loginSuccess.jsp 和登录失败页面 loginError.jsp,如文件 userLogin.jsp、loginSuccess.jsp 和 loginError.jsp 所示。

userLogin.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%>用戶登录页面      
用户名:
密    码:

loginSuccess.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%>用戶登录成功页面    

您的用戶名是<%=request.getAttribute("user.username") %>

密码是<%=request.getAttribute("user.password") %>

loginError.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%>错误页面    

${

error }
请单击此链接返回登录页面重新登录

4. 在配置文件 struts.xml 中的 元素中添加 UserLoginAction 的信息,添加内容如下所示:

/loginSuccess.jsp
/loginError.jsp

5. 部署 struts2Demo02 项目到 Tomcat 服务器并启动服务器,在浏览器的地址栏中输入地址 http://localhost:8080/struts2Demo02/userLogin.jsp 访问 userLogin.jsp,浏览器的显示结果如下图所示。

模型驱动

在 Struts2 中,Action 还有另外一种方式处理请求参数,称为模型驱动(ModelDriven)。

模型驱动方式要求 Action 需要通过实现 ModelDriven 接口接收请求参数,并且要重写 getModel() 方法。getModel() 方法返回的就是 Action 所使用的数据模型对象。

与属性驱动中直接使用域对象字段驱动方式的数据传递类似,模型驱动方式也是通过 JavaBean 模型进行数据传递的。只要是普通的 JavaBean,就可以充当模型部分,并且 JavaBean 中所封装的属性要与表单的属性一一对应,JavaBean 就是数据传递的载体。

使用模型驱动方式时,Action 类中通过 getModel() 方法获取模型,其示例代码如下所示:

import pers.zhang.domain.User;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;public class LoginAction extends ActionSupport implements ModelDriven
{
private User user = new User(); public User getModel() {
return user; } public String execute() throws Exception {
return SUCCESS; }}

使用模型驱动时,其对应的表单页面也要做相应调整,调整后的代码片段如下所示:

用户名:
密码:

从上述代码中可以看出,使用 ModelDriver 的方式后,表单中的文本域名称已经不需要添加 user 前缀,页面上的 username 会自动对应到这个 Model 的 username 属性。

与属性驱动相比,模型驱动不需要在 Action 类中定义与表单元素一一对应的所有属性及其各属性的 getter 和 setter 方法,这减少了 Action 类中的代码量。在项目应用中具体使用哪种驱动方法,现给出以下几点建议。

  1. 要统一整个系统中 Action 的驱动方法,即要么都使用属性驱动,要么都使用模型驱动。
  2. 如果持久层对象与表单中的属性是一一对应的关系,那么建议使用模型驱动,因为模型驱动方法使 Action 类中的代码更加整洁。
  3. 如果持久层对象与表单中的属性不是一一对应的关系,那么建议使用属性驱动,因为不是一一对应的关系时,系统中需要提供两个 JavaBean(一个对应表单提交的数据,一个用于持久层对象)。

转载地址:http://uasqb.baihongyu.com/

你可能感兴趣的文章
vs2010最佳字体配色_2010年50个最佳Windows最佳做法文章
查看>>
如何将部分歌曲添加到PowerPoint演示文稿中
查看>>
5g 天线 校准网络_电视天线帮助器使HDTV天线校准Swift完成
查看>>
使用简单的自制混合物蚀刻电路板
查看>>
在Windows 7下最大限度地发挥多显示器的魔力
查看>>
如何使Ubuntu中的Gnome面板完全透明
查看>>
电子修补程序入门:购物清单
查看>>
chrome插件 备份书签_如何在本地备份和还原您的Chrome书签
查看>>
利用图表绘制技巧赢取免费的Chrome Cr-48笔记本电脑
查看>>
红色和青色叠加_如何用任何图像制作经典的红色/青色3D照片
查看>>
chromebook刷机_如何在Chromebook上下载Android应用
查看>>
哪个更好:Revo卸载程序或免费替代方案?
查看>>
了解东西如何与2011年最佳入门指南解释者一起使用
查看>>
slack财报_每日新闻摘要:Slack将重置一些用户密码
查看>>
在Firefox的“关于”页面上找到隐藏功能和复活节彩蛋
查看>>
windows10鼠标指针_如何在Windows 10上更改鼠标指针的颜色和大小
查看>>
word中将空格替换为_如何在Word 2010中将英寸更改为厘米
查看>>
如何在Google文档中创建连字符,连字符和Em连字符
查看>>
如何为Windows Home Server设置电子邮件通知
查看>>
spark fold_每日新闻摘要:三星Galaxy Fold将于9月发布
查看>>