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框架中关于Action处理请求参数有两种方案(三个方式),表单属性的名称应该和在Action类中定义的成员属性或者在JavaBean中定义的成员属性名称一样: 1.属性驱动 1)直接在 ...
- Struts2之Action接收请求参数和拦截器
技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API * 需求:提供JSP的表单页面的数据,在Ac ...
- Struts2笔记2--动态方法调用和Action接收请求方式
动态方法调用(在请求的时候,再明确具体的响应方法,配置的时候不明确): LoginAction类中有两个方法some和second 1. 动态方法的调用(修改常量struts.enable.Dynam ...
- struts2视频学习笔记 11-12(动态方法调用,接收请求参数)
课时11 动态方法调用 如果Action中存在多个方法时,可以使用!+方法名调用指定方法.(不推荐使用) public String execute(){ setMsg("execute&q ...
- Struts2基础-3 -继承ActionSupport接口创建Action控制器+javaBean接收请求参数+ 默认Action配置处理请求错误 + 使用ActionContext访问ServletAPI
1.目录结构及导入的jar包 2.web.xml 配置 <?xml version="1.0" encoding="UTF-8"?> <web ...
- SpringMVC——接收请求参数和页面传参
Spring接收请求参数: 1.使用HttpServletRequest获取 @RequestMapping("/login.do") public String login(Ht ...
随机推荐
- 基于MDK编程STM32程序无法使用,硬件仿真在汇编窗口看到停留在“0x0800XXXX BEAB BKPT 0xAB //进入调试模式”
为方便工作上做测试,移植FreeRTOS到STM32F103xx,先做简单的UART1 printf. 工程编译通过,运行逻辑也确认可行,可就是无法正常打印消息.对比了网上的移植工程也是一致,硬件仿真 ...
- POJ 3991 Seinfeld
首先进行一次括号匹配,把正确匹配的全部删去. 删去之后剩下的状态肯定是 L个连续右括号+R个连续左括号. 如果L是偶数,答案是L/2+R/2: 否则答案是 (L-1)/2+(R-1)/2+2: #in ...
- Unknown/unsupported storage engine: InnoDB
症状:无法启动mysql,在“mysql数据库目录/主机名.err”日志文件中报错 Unknown/unsupported storage engine: InnoDB原因:MySQL5.5.8 GA ...
- IOS三种归档(NSKeyArchieve)的总结
IOS三种归档(NSKeyArchieve)的总结 归档是一种IOS中常用来存储文件的一种方法,在面向对象的语言中,归档也就实际上可以将一切对象存储在文件中,以下是IOS开发中常见的三种文件归档方式, ...
- C#中的协变OUT和逆变
泛型接口和泛型委托中经常使用可变性 in 逆变,out 协变 从 list<string>转到list<object> 称为协变 (string 从object 派生,那么 ...
- Java-设计模式-单例模式-饿汉模式、懒汉模式
//-------------------------------------------------------------饿汉模式--开始----------------------------- ...
- java系列--类和对象
一.成员属性,构造方法,成员方法 1.类名首字母一般大写 2.方法名的首字母一般是小写,使用驼峰法(匈牙利法) myCry, 下划线法 my_cry 3.方法的声明没有函数体(接口,抽象类),数据类型 ...
- eclipse中集成svn maven开发手册---导入项目
一,导入项目 二,创建提分支 三,maven编译打包 四,合并主干 一,导入项目 右键,import,选择从svn检出项目 点击next,如图 如果是第一次导入,选择创建新的资源库,点击next,输入 ...
- EverNote剪藏插件安装问题
安装EverNote印象笔记的剪藏插件时出现插件不能使用的问题,可以采用如下的方法(可以参考知乎的解决办法:https://www.zhihu.com/question/29875051) (下载地址 ...
- Git 入门 ---- Git 与 SVN 区别
一. Git 是什么? Git 是目前世界上最先进的分布式版本控制系统 二. 基础知识 有中心的 SCM(Software Configuration Management) 服 ...