Struts框架(6)---action接收请求参数
action接收请求参数
在web开发中,去接收请求参数来获得表单信息非常的常见,自己也总结整理了有关Struts2通过action接收请求参数的几种方法。
Struts2 提供三种数据封装的方式:
(1) Action 本身作为model对象,通过成员setter封装
(2) 创建独立model对象,页面通过ognl表达式封装
(3) 使用ModelDriven接口,对请求数据进行封装(推荐)
下面我们来讲解第一种:
(1) Action类本身作为model对象通过成员的setter方法封装(属性驱动)
setXxx()的xxx必须与请求的参数名一样。就是指和form表单中的name对应的属性要一致
action类的代码:
import java.util.Arrays;
import com.ssh.struts2.model.User;
import com.opensymphony.xwork2.ActionSupport;
/*
* 通过这种方法最简单,但也有缺点如果要把数据封装到model对象中然后传递给业务层和数据层
* 还需要单独定义model对象进行传递数据
*/
public class RegisterAction1 extends ActionSupport { private String username;
private String [] hobby; @Override
public String execute() throws Exception {
//获取表单的数据
System.out.println("用户名是:"+username);
System.out.println("兴趣爱好是:"+Arrays.toString(hobby));
return null;
}
//这里必须提供set方法,get方法可有可无
public void setUsername(String username) {
this.username = username;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
}
/*当你在界面中用户名输入:zhangsan,兴趣爱好选择:体育和读书那么运行结果如下:
* 用户名是:zhangsan
* 兴趣爱好是:[sport, read]
*/
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="default" extends="struts-default">
<action name="register1" class="com.ssh.struts2.action.RegisterAction1">
</action>
</package>
</struts>
register.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
</head>
<body>
<h4>注册表单1 </h4>
<form action="${pageContext.request.contextPath }/register1.action" method="post">
用户名:<input type="text" name="username"><br/>
爱好:<input type="checkbox" name="hobby" value="sport">体育
<input type="checkbox" name="hobby" value="music">音乐
<input type="checkbox" name="hobby" value="read">读书 <br/>
<input type="submit" value="注册">
</form>
</body>
</html>
网页:

(2) 创建独立model对象,页面通过ognl表达式封装
该方法首先要创建一个专门的领域对象进行封装
User领域对象
import java.util.Arrays;
public class User { private String username;
private String [] hobby;
//为这两个常量提供set和get方法和toString方法
Action类
import com.ssh.struts2.model.User;
import com.opensymphony.xwork2.ActionSupport; public class RegisterAction2 extends ActionSupport{
//直接定义model对象
private User user;
@Override
public String execute() throws Exception {
System.out.println("user:"+user);
return NONE;
}
/*
* 必须提供get方法
* 封装第一个参数 创建一个新的User对象 然后把username属性封装到这个创建的user对象中 User user =new User();user.setUserName("");
* 封装第二个参数 已经存在user对象 User user =getUser(); user.setPassword(");
*/
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
/*
* 如果jsp界面输入:用户名:aa 兴趣爱好:体育读书
* 后台输出:user:User [username=aa, hobby=[sport, music]]
*/
register.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
</head>
<body>
<!-- 用ognl表达式要注意的一点就是,标签的属性name在取名字的时候是:领域对象.属性
user.username这里user是具体的对象,username是领域对象的属性-->
<h4>注册表单1 </h4>
<form action="${pageContext.request.contextPath }/register2.action" method="post">
用户名:<input type="text" name="user.username"><br/>
爱好:<input type="checkbox" name="user.hobby" value="sport">体育
<input type="checkbox" name="user.hobby" value="music">音乐
<input type="checkbox" name="user.hobby" value="read">读书 <br/>
<input type="submit" value="注册">
</form>
</body>
</html>
说明:struts2首先通过反射技术调用User的默认构造器创建User对象,然后通过反射技术调用User中与请求参数同名的属性的setter方法来获取请求参数值。在这里需要注意的一点是:User对象一定要有默认的构造器。
采用复合类型接收请求参数的好处,可以减少action中的setter和getter方法,同时可以把相应的属性组合成一个类,这样使代码更好清晰,代码有更好的结构。
(3)使用ModelDriven接口,对请求数据进行封装
第三种方法比较方便,和方法(1)不同在于它也要先创建一个领域对象类进行对象的封装。其它和方法(1)一样
Action类
import com.ssh.struts2.model.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
//实现ModelDriven<User>接口
public class RegisterAction3 extends ActionSupport implements ModelDriven<User> {
/**
* 方式三 使用模型驱动
*/
//这里需要注意,方法2中的user对象不需要自己创建,而这里必须手动初始化
private User user =new User(); public User getModel() {
return user;
}
@Override
public String execute() throws Exception {
System.out.println("user:"+user);
return NONE;
}
}
/*
* 如果jsp界面输入:用户名:aa 兴趣爱好:体育读书
* 后台输出:user:User [username=aa, hobby=[sport, music]]
*/
最后我们来思考两个问题,也是常见的笔面试题:
问题一:Action封装数据会不会有线程问题?
问题二:在使用第一种方式进行封装的时候数据封装到Action 属性中不能把Action传递给业务层数据如何传递?
谢谢大家浏览,欢迎大家指点!
Struts框架(6)---action接收请求参数的更多相关文章
- Struts系列笔记(6)---action接收请求参数
action接收请求参数 在web开发中,去接收请求参数来获得表单信息非常的常见,自己也总结整理了有关Struts2通过action接收请求参数的几种方法. Struts2 提供三种数据封装的方式: ...
- struts2 action接收请求参数和类型转换
1,action接收请求参数 在struts2中action是什么?(struts2是一个mvc框架) V:jsp M:action C:action ...
- action接收请求参数
一.采用基本类型接收请求参数(get/post)在Action类中定义与请求参数同名的属性,struts2便能接收自动接收请求参数并赋给同名属性. action的代码: public class Pa ...
- Struts2之Action接收请求参数和拦截器
技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API * 需求:提供JSP的表单页面的数据,在Ac ...
- Struts2笔记2--动态方法调用和Action接收请求方式
动态方法调用(在请求的时候,再明确具体的响应方法,配置的时候不明确): LoginAction类中有两个方法some和second 1. 动态方法的调用(修改常量struts.enable.Dynam ...
- Struts2基础-3 -继承ActionSupport接口创建Action控制器+javaBean接收请求参数+ 默认Action配置处理请求错误 + 使用ActionContext访问ServletAPI
1.目录结构及导入的jar包 2.web.xml 配置 <?xml version="1.0" encoding="UTF-8"?> <web ...
- struts2视频学习笔记 11-12(动态方法调用,接收请求参数)
课时11 动态方法调用 如果Action中存在多个方法时,可以使用!+方法名调用指定方法.(不推荐使用) public String execute(){ setMsg("execute&q ...
- Struts2学习笔记(六)——Action处理请求参数
在struts2框架中关于Action处理请求参数有两种方案(三个方式),表单属性的名称应该和在Action类中定义的成员属性或者在JavaBean中定义的成员属性名称一样: 1.属性驱动 1)直接在 ...
- springMVC中接收请求参数&&数据转发
### 1. 接收请求参数 #### 1.1. [不推荐] 通过HttpServletRequest获取请求参数 假设存在: <form action="handle_login.do ...
随机推荐
- dom4j移除节点不成功
在使用dom4j的时候想移除xml节点,经常使用remove来移除节点,通过整个文档或者根节点删除某一个子节点,但如果子节点不是儿子节点,在dom4j中就无法删除.在dom4j中移除节点必须使用父节点 ...
- Educational Codeforces Round 36
A. Garden 题目链接:http://codeforces.com/contest/915/problem/A 题意:N个花洒,每个花洒浇花有一定的范围,现在有面积为K的花园,从N个花洒中选一个 ...
- license
http://139.199.89.239:1008/4571ab86-eb0d-4d2b-999e-37406bb8ba38 _~~~ rO0ABXNyAChjb20uemVyb3R1cm5hcm9 ...
- 【竞价网站绝技】根据访客ip,页面显示访客所属城市的html代码(借用YY IP地址库)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- docker部署pinpoint
pinpoint-collector部署 Dockerfile FROM tomcat8:jdk8 MAINTAINER limugen<limugen@uce.cn> ENV APP_H ...
- iBtais 多重嵌套循环
iBatis支持集合循环, 但是如何做到双重循环, 请见下例子 例子描述: 需要去三张结构相同的表中获取信息, 需要将信息拼合去重后返回 入参数据类型: Map<String,Object> ...
- huffman树实现的压缩算法,java
1.树的构建 package huffman; public abstract class BinaryTreeBasis { protected TreeNode root; public Bina ...
- Python基础-数据类型-转摘
1.数字 2 是一个整数的例子.长整数 不过是大一些的整数.3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E-4表示52.3 * 10-4.(-5+4j)和(2.3-4. ...
- tomcat设置错误页面
今日学习笔记: 当我们访问tomcat的一个不存在的页面,返回错误信息如下: 这样的界面直接暴露给用户并不友好,有时候还不安全,因此一般需要修改默认的错误页. vim /$TOMCAT_HOME/co ...
- Python ImportError: No module named 'requests'的解决方法
import requests报错 Python ImportError: No module named 'requests'可能是requests没有安装 安装流程 1.cmd 2.cd D:\p ...