Struts2获取表单数据

news2024/12/26 9:30:45

Struts2获取表单数据

  • Struts2获取表单数据
    • 1、原始Servlet方法
    • 2、属性封装
    • 3、表达式封装
    • 4、模型驱动封装

Struts2获取表单数据

在Struts2中获取表单数据或提交路径的参数值的方式有4种。如下:

  • 原始Servlet方法
  • 属性封装
  • 表达式封装
  • 模型驱动封装

1、原始Servlet方法

该方法一般用于提取url中的参数,如下:

在这里插入图片描述

控制器Action如下:

public class HelloUserAction extends ActionSupport {

	private static final long serialVersionUID = 1L;
	
	public String getMessage() {
	    HttpServletRequest request = ServletActionContext.getRequest();
	    String username = request.getParameter("username");
	    String password = request.getParameter("password");
	    String age = request.getParameter("age");
	    System.out.println(username + "===>" + password + "===>" + age);
		return SUCCESS;
	}

}

struts.xml中配置如下:

在这里插入图片描述
启动项目,访问a标签链接,页面跳转:

在这里插入图片描述
控制台输出:

在这里插入图片描述

参数接收成功。但是这种方式有不足之处,如下:

  • 获取到的所有数据都是String类型的,需要进行数据类型转换。
  • 获取数据的代码复杂、冗余。

2、属性封装

在Action控制器中定义成员变量,提供set和get方式。需注意的是,必须保证成员变量的名称和input表单中的name属性值或提交路径中的参数名称保持一致,否则无法接收。该方法的不足之处是获取数据的方式比较简单,但是会造成属性过多,Action控制器的代码冗余。

直接修改上面的HelloUserAction控制器,修改后如下:

public class HelloUserAction extends ActionSupport {

	private static final long serialVersionUID = 1L;
	
	private String username;
	
	private String password;
	
	private Integer age;
	
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public String getMessage() {
	    System.out.println(username + "===>" + password + "===>" + age);
		return SUCCESS;
	}

}

控制器中的username,password,age分别对应url中的参数:

在这里插入图片描述
启动项目,点击a标签链接,控制台输出如下:

在这里插入图片描述

参数接收成功。下面将a标签链接中的参数改为form表单提交:

     <form action="user/helloUser.action" method="post">
          <div>
             <label>用户名:</label>
             <input type="text" name="username" />
          </div>
          <div>
             <label>密码:</label>
             <input type="password" name="password" />
          </div>
          <div>
             <label>性别:</label>
             <input type="radio" name="sex" value="1" /><input type="radio" name="sex" value="0" /></div>
          <div>
             <label>年龄:</label>
             <input type="text" name="age" />
          </div>
          <div>
             <input type="submit" value="提交" />
          </div>
     </form>

修改后的HelloUserAction:

public class HelloUserAction extends ActionSupport {

	private static final long serialVersionUID = 1L;
	
	private String username;
	
	private String password;
	
	private Integer age;
	
	private Integer sex;
	
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}
	
	public Integer getSex() {
		return sex;
	}

	public void setSex(Integer sex) {
		this.sex = sex;
	}

	public String getMessage() {
	    System.out.println(username + "===>" + password + "===>" + age + "===>" + sex);
		return SUCCESS;
	}

}

启动项目,填写表单提交:

在这里插入图片描述
控制台输出:

在这里插入图片描述
参数接收成功。

3、表达式封装

使用表达式封装的方式获取表单数据,步骤如下:

  • 在控制器中定义类类型成员变量,并且提供get和set方法。
  • 页面中使用对象.属性名。

修改页面中form表单的name属性值,如下:

     <form action="user/helloUser.action" method="post">
          <div>
             <label>用户名:</label>
             <input type="text" name="user.username" />
          </div>
          <div>
             <label>密码:</label>
             <input type="password" name="user.password" />
          </div>
          <div>
             <label>性别:</label>
             <input type="radio" name="user.sex" value="1" /><input type="radio" name="user.sex" value="0" /></div>
          <div>
             <label>年龄:</label>
             <input type="text" name="user.age" />
          </div>
          <div>
             <input type="submit" value="提交" />
          </div>
     </form>

修改后的HelloUserAction:

public class HelloUserAction extends ActionSupport {

	private static final long serialVersionUID = 1L;
	
	private User user;
	
	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public String getMessage() {
	    System.out.println(user.toString());
		return SUCCESS;
	}

}

对应的User类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
	
	private String username;
	
	private String password;
	
	private Integer sex;
	
	private Integer age;
	
}

启动项目,填写表单后提交,控制台输出如下:

在这里插入图片描述
参数接收成功。

4、模型驱动封装

需要Action控制器实现ModelDriven接口,并且重写getModel()方法。

com.opensymphony.xwork2.ModelDriven接口源码如下:

在这里插入图片描述

只有一个getModel()方法,实现此接口需要重写这个方法。

修改后的HelloUserAction:

public class HelloUserAction extends ActionSupport implements ModelDriven<User> {

	private static final long serialVersionUID = 1L;
	
	private User user = new User();
	
	@Override
	public User getModel() {
		return user;
	}

	public String getMessage() {
	    System.out.println(user.toString());
		return SUCCESS;
	}

}

修改后的form表单name属性:

在这里插入图片描述
启动项目,填写表单提交,控制台输出:

在这里插入图片描述
参数接收成功,模型驱动相当于将属性都做了一层封装。

注意:

  • input标签的name属性值、提交路径的参数名称必须与实体类的属性相同,控制器不需要提供模型对象的set和get方法。
  • 模型驱动封装与属性封装一起使用时,同名优先使用模型驱动封装,属性封装无法获取数据。

表达式封装和模型驱动封装的比较

  • 共同点:使用表达式封装和模型驱动封装都可以把数据封装到实体类对象中。
  • 不同点:使用模型驱动封装只能把数据封装到一个实体类对象里面。在一个Action里面不能使用模型驱动把数据封装到不同的实体类对象中。使用表达式封装可以把数据封装到不同的实体类对象中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/144377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文章书写方法

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

Python爬虫 xpath解析基础

今天继续给大家介绍Python爬虫相关知识&#xff0c;本文主要内容是Python爬虫 xpath解析基础。 一、xpath简介 xpath&#xff0c;即XML Path Language&#xff0c;是一种用来确定XML文档中某部分位置的语言&#xff0c;Xpath以XML为基础&#xff0c;可以提供用户在数据结构树…

8、可观测性--链路追踪

文章目录链路追踪服务之间的依赖Span 的构成Span 之间关系链路图链路追踪与 Dapper链路追踪的作用链路查询性能分析拓扑图依赖关系跨应用/语言采样率链路追踪 首先&#xff0c;我来带你了解一下什么是链路追踪&#xff1f; 服务之间的依赖 在前言中介绍了数据的来源&#xf…

运营|为什么需要配置https?

什么是HTTPS、它带来了什么? 从名字来看,它比http多了一个“s”,这个“s”表示安全。目的在于提供更安全的HTTP通道,即HTTP下加入SSL层并且加密。太详细的我就不再这里说了,再说我就要抄百度百科了。简单来说,不同于HTTP使用80端口,HTTPS使用443端口,HTTPS还需要一个付…

【手写 Vue2.x 源码】第七篇 - 阶段性梳理

一&#xff0c;前言 上篇,介绍了 Vue 数据初始化流程中&#xff0c;Vue 实例上数据代理的实现&#xff0c;核心思路如下&#xff1a; 将 data 暴露在 vm._data 实例属性上利用 Object.defineProperty 将 vm.xxx 操作代理到 vm._data 上 本篇&#xff0c;对当前版本的数据劫持…

[VP]河南第十三届ICPC大学生程序竞赛 J.甜甜圈

前言 传送门 : https://ac.nowcoder.com/acm/contest/17148/J 题意 : 给定两个甜甜圈堆 , 每次只能吃所有中最甜的那一个 , 否则的话就移动 询问最小的移动步骤 思路 : 很明确的一个目标 , 寻找当前最大值并且求出距离 那么我们考虑将两个甜甜圈堆进行合并 , 使得变成一个…

LeetCode:17. 电话号码的字母组合

17. 电话号码的字母组合1&#xff09;题目2&#xff09;思路3&#xff09;代码4&#xff09;结果1&#xff09;题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同…

【C++入门】C向C++过渡(上)

前言在正式进入C之前&#xff0c;我们首先要对C有一个基本的认知。这里我就不过多的进行描述了&#xff0c;有兴趣的可以去网络搜索一番。总而言之&#xff0c;从名称上面我们也可以看得出来&#xff0c;C是在C的基础上进行不断地优化发展。事实上确实是这样&#xff0c;C语言中…

k8s部署gitlab

Gitlab以容器方式运行&#xff0c;需要持久化如下几个目录中的数据: 持久化本地位置 容器位置 使用 ${sc}/data /var/opt/gitlab 用于存储应用程序数据。 ${sc}/logs /var/log/gitlab 用于存储日志。 ${sc}/config /etc/gitlab 用于存储 GitLab 配置 文件。 1、下载…

C语言柔性数组的‘美‘

目录 柔性数组的使用和概念 柔性数组的特点 柔性数组与指针的区别 柔性数组的好处 柔性数组的使用和概念 arr[]编译 C99 中&#xff0c;结构中的最后一个元素允许是未知大小的数组&#xff0c;这就叫做『柔性数组』成员。 柔性数组的特点 1、柔性数组成员前必须至少有一个其他…

黑龙江创维E900V22C_S905L3(B)_安卓9.0_开启设置隐藏无线_完美线刷固件包

黑龙江创维E900V22C_S905L3(B)_安卓9.0_开启隐藏设置无线WIFI_完美线刷固件包 提示&#xff1a;大部分芯片均为S905L3A&#xff0f;AB&#xff0c;这两个是可以通刷的。 1、此分享固件包芯片特殊&#xff0c;芯片为S905L3&#xff0c;还有S905L3B芯片&#xff0c;理论上通刷…

C++设计模式:建造者模式(详解+案例代码)

文章目录建造者模式实现步骤实现代码案例一&#xff1a; 组装电脑案例二&#xff1a;汉堡店点餐优缺点建造者模式 建造者模式是一种对象创建型模式之一&#xff0c;用来隐藏复合对象的创建过程&#xff0c;它把复合对象的创建过程加以抽象&#xff0c;通过子类继承和重载的方式…

【JavaEE】设计模式之单例模式

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaEE】 ✈️✈️本篇内容:设计模式之单例模式。 &#x1f680;&#x1f680;代码存放仓库gitee&#xff1a;JavaEE初阶代码存放&#xff01; ⛵⛵作者简介&am…

Redis 连接池报错:jwtCalibrateHandler 48 max number of clients reached

问题[ERROR 2023-01-06 15:37:58,877] jwtCalibrateHandler 48 max number of clients reached早上突然看到反馈说redis连接异常&#xff0c;就是这个&#xff1a;max number of clients reached。问题很显然就是redis连接数超了.原因分析redis maxclients 是redis server的重要…

VMware vCenter Server Appliance空间不足问题处理

原创作者&#xff1a;运维工程师 谢晋 前提提要 客户环境为VSAN环境&#xff0c;VCSA版本为6.7&#xff0c;偶然间发现VSAN监控的性能不能正常打开&#xff0c;如下图&#xff1a;     后登陆https://VCSAIP:5480发现出现告警&#xff0c;报错log日志满了 故障处理 开…

rabbitmq+netcore6 【3】Publish/Subscribe:发布/订阅

文章目录1&#xff09;前言2&#xff09;临时队列3&#xff09;绑定4&#xff09;综合以上代码准备工作1、生产者2、消费者13、消费者25&#xff09;验证官网教程原文链接&#xff1a; https://www.rabbitmq.com/tutorials/tutorial-three-dotnet.html翻译版参考链接&#xff1…

大话测试数据(二):概念测试数据的获取

在大话测试数据&#xff08;一&#xff09;文章中&#xff0c;我提到&#xff0c;获取数据的第一步是获取概念上数据。这一步看起来简单&#xff0c;其实不是那么容易。获取概念数据和获取需求的过程是交织在一起的&#xff0c;事实上&#xff0c;它们其实是一个事儿&#xff0…

Ribbon、Feign、Hystrix超时重试熔断问题

文章目录问题描述重试次数不生效开启熔断后重试次数生效fallbackFactory回退降级异常为空问题1分析问题2、3分析总结feign请求次数计算Hystrix超时时间设置公式问题描述 在使用Ribbon、Feign、Hystrix组合时&#xff0c;因为配置的问题出现以下现象&#xff0c;让我的大脑CPU烧…

[SWPU2019]Web1

目录 [SWPU2019]Web1 无列名查看表数据 不使用列名查询表中数据 [SWPU2019]Web1 首先我们先注册&#xff0c;登录进来后看到如下界面&#xff1a; 我们点击申请发布广告&#xff0c;并发送&#xff1a; 查看广告详情&#xff0c;发现疑似存在注入点&#xff1a; 于是我们在发…

Docker 应用篇 | Docker 学习笔记总结

Docker 视频内容可以参考黑马程序员的Docker篇 详细完整内容可以查询菜鸟教程&#xff1a;Docker 教程 本篇博文主要让读者对Docker有一个基本理解并可以借助Docker发布自己的项目 一、初识Docker 1.1 Docker概述 Docker是一个集装箱式的思想 Docker可以让开发者打包他们的…