Action接受请求参数

2024-06-08 00:58
文章标签 action 请求 参数 接受

本文主要是介绍Action接受请求参数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


一 、Action接收请求参数

struts2内部提供三种请求参数封装机制

1)      Action 本身作为model对象,通过成员setter封装(使用与成员少的)

<form action="${pageContext.request.contextPath }/regist1.action" method="post">用户名 <input type="text" name="username" /><br/>密码<input type="password" name="password"/><br/>年龄 <input type="text" name="age" /><br/><input type="submit" value="注册" />
</form>public class RegistAction1 extends ActionSupport {提交的有什么参数就设置什么字段,并写好setter方法private String username;private String password;private int age;public void setUsername(String username) {this.username = username;}public void setPassword(String password) {this.password = password;}public void setAge(int age) {this.age = age;}
}

注:通过以上特性就能清楚,struts2action是多例的,每个用户有每个用户的参数,每个参数封装到一        javabean中,也就是说每次请求都会创建 struts2Action 对象。

 

         2)创建独立model对象,页面通过ognl表达式封装

<form action="${pageContext.request.contextPath }/regist2.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="submit" value="注册" />
</form>	
* 页面中使用ognl写法 name="user.username"  底层就会执行 Action的setUser() --- > setUsername();
在action中的写法
public class RegistAction2 extends ActionSupport {private User user;持有对象public void setUser(User user) {this.user = user;}
// 必须提供get方法 ----- 如果不提供只能封装一个属性,下次再封装第二个属性的时候又是一个新的userpublic User getUser() {return this.user;}
}
单独创建一个user的domain
public class User {private String username;private String password;private int age;...
}

         3)使用ModelDriven接口,对请求数据进行封装

页面可以直接写属性名称

<form action="${pageContext.request.contextPath }/regist3.action" method="post">用户名 <input type="text" name="username" /><br/>密码<input type="password" name="password"/><br/>年龄 <input type="text" name="age" /><br/><input type="submit" value="注册" />
</form>public class RegistAction3 extends ActionSupport  implements ModelDriven<User> {private User user = new User(); // 必须手动new,不然就出现空指针异常@Overridepublic User getModel() {return user;}
}
单独创建一个user的domain
public class User {private String username;private String password;private int age;
}

原理:发起请求后, struts2 会调用 getModel().setUsername() getModel().setPassword()因此必须手动 model进行初始化

结论:三种参数封装方式,在开发中主要使用第三种

           第一种只适用于请求参数非常少的情况的封装,第二种更加灵活,支持一个表单数据封装到不model对象,第三种封装方式,只能支持一个model对象。

 

二、 向集合元素属性中封装数据 (封装参数第二种写法,ognl 灵活写法)

Collection(List、Set) 、 Map 

1、 Collection 接收
<form>第一个员工 姓名 <input type="text" name="employees[0].name" /><br/>第一个员工工资 <input type="text" name="employees[0].salary" /><br/>第二个员工 姓名 <input type="text" name="employees[1].name" /><br/>第二个员工工资 <input type="text" name="employees[1].salary" /><br/><input type="submit" value="提交" />
</form>public class EmployeeAction extends ActionSupport {// 接收多个 Employee信息,定义集合private Collection<Employee> employees;提供set、get方法public Collection<Employee> getEmployees() {return employees;}public void setEmployees(Collection<Employee> employees) {this.employees = employees;}
}2、 Map 接收
<form action="${pageContext.request.contextPath }/employee2.action" method="post">第一个员工 姓名 <input type="text" name="employees['first'].name" /><br/>第一个员工工资 <input type="text" name="employees['first'].salary" /><br/>第二个员工 姓名 <input type="text" name="employees['second'].name" /><br/>第二个员工工资 <input type="text" name="employees['second'].salary" /><br/><input type="submit" value="提交" />
</form>public class EmployeeAction2 extends ActionSupport {private Map<String, Employee> employees;public Map<String, Employee> getEmployees() {return employees;}public void setEmployees(Map<String, Employee> employees) {this.employees = employees;}
}

Struts2内建类型转换器

对于大部分常用类型,开发者根本无需创建自己的转换器,Struts2内置了常见数据类型多种转换器

•    boolean 和 Boolean

•    char和 Character

•    int 和 Integer

•    long 和 Long

•    float 和 Float

•    double 和 Double

•    Date 可以接收 yyyy-MM-dd格式字符串

•    数组  可以将多个同名参数,转换到数组中

•    集合  支持将数据保存到 List或者 Map 集合

客户端请求过来的数据都是字符串,struts2可以判断你的model中相对于的字段是什么类型的,再帮你将字符串转换成什么类型的。但是有时我们的需求类型并不止这些,因此这时候就要自定义转换器了。

内建类型无法转换时就会抛出这样的异常:java.lang.NoSuchMethodException:

         Struts2 类型转换器实际上都是基于OGNL实现的,在OGNL项目中,有一个TypeConverter接口,自定        义类型转换器必须实现ongl.TypeConverter

备注:TypeConverter接口提供convertValue方法,此方法要传入6个参数,DefaultTypeConverter实现了              TypeConverter接口,覆盖了convertValue方法,需要传入3个参数,在struts2内部提供                                 StrutsTypeConverter 继承DefaultTypeConverter,将 convertValue 拆分为两个方法:

         convertFromString(java.util.Mapcontext, java.lang.String[] values, java.lang.Class toClass)

         convertToString(java.util.Map context,java.lang.Object o)

自定义类型转换器,继承 DefaultTypeConverter ,覆盖 convertValue

  convertValue方法中有两层含义,第一种 String目标类型第二种目标类型 String 

1、 自定义类型转换器 例:public class DateConverter extends DefaultTypeConverter {@Override  public Object convertValue(Map context, Object value, Class toType) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");try { if(toType == Date.class){//当字符串向Date类型转换时String[] params = (String[]) value;// Request.getParameterValues() return dateFormat.parse(params[0]);}else if(toType == String.class){//当Date转换成字符串时Date date = (Date) value;return dateFormat.format(date);}} catch (ParseException e) {}return null;}
}

2、 在struts2 框架中注册类型转换器

第一种 局部类型转换器,只针对当前Action有效

在Action类所在的包下放置ActionClassName-conversion.properties文件

         属性名称=类型转换器的全类名

 

第二种 全局类型转换器,对所有Action都有效

在src下放置xwork-conversion.properties文件

         待转换的类型=类型转换器的全类名

 

3、 在类型转换过程中发生异常,自动跳转到 input 结果页面  

<interceptorname="conversionError"class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>负责当发生类型转换错误时,将转换错误信息 保存到 fielderror 中

 

在jsp中 通过struts2 提供标签 <s:fielderror /> 查看类型转换错误信息

在查看之前需要导入标签库<%@tagliburi="/struts-tags" prefix="s" %> 

<s:fielderror/>

 

自定义错误信息?? 需要国际化信息文件

在Action所在包中,创建 ActionName.properties,在局部资源文件中配置提示信息 :invalid.fieldvalue.属性名= 错误信息


这篇关于Action接受请求参数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040798

相关文章

ABAP怎么把传入的参数刷新到内表里面呢?

1.在执行相关的功能操作之前,优先执行这一段代码,把输入的数据更新入内表里面 DATA: lo_guid TYPE REF TO cl_gui_alv_grid.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGe_grid = lo_guid.CALL METHOD lo_guid->check_changed_data.CALL M

Java面试八股之JVM参数-XX:+UseCompressedOops的作用

JVM参数-XX:+UseCompressedOops的作用 JVM参数-XX:+UseCompressedOops的作用是启用对象指针压缩(Ordinary Object Pointers compression)。这一特性主要应用于64位的Java虚拟机中,目的是为了减少内存使用。在传统的64位系统中,对象引用(即指针)通常占用8字节(64位),而大部分应用程序实际上并不需要如此大的地址空间

axios全局封装AbortController取消重复请求

为什么? 问题:为什么axios要配置AbortController?防抖节流不行吗? 分析: 防抖节流本质上是用延时器来操作请求的。防抖是判断延时器是否存在,如果存在,清除延时器,重新开启一个延时器,只执行最后一次请求。节流呢,是判断延时器是否存在,如果存在,直接return掉,直到执行完这个延时器。事实上,这些体验感都不算友好,因为对于用户来说,得等一些时间,尤其是首次请求,不是那么流畅

关于命令行参数argv(《学习OpenCV》)

在《学习OpenCV》这本书中,很多示例代码都用到了命令行参数。作为新手,之前总是很困扰,不知道怎么用。偶然的机会终于略知一二了。 在Visual Studio中,我们可以自行设置命令行参数。 如在这个示例程序中,我们想把图像存入argv[1]。 方法如下: 依次点击,项目、属性、配置属性、调试、命令参数。出现下面的界面: 然后进行编辑,即输入图像路径。如:E:\Lena.jpg

jmeter测试https请求

公司最近在搞全站HTTPS改造,进一步提高网站的安全性,防止运营商劫持。那么,改造完成后,所有前后端的URL将全部为https。 So ,研究下怎么用Jmeter访问https请求呢。 其实很简单, 第一步在jmeter中创建HTTP请求,如下图进行配置,https端口为443; 第二步,在本机浏览器,如Chrome中导入该域名证书,在更多工具-设置-管理证书的地方,找到该证书,导出到本地。然后在

关于IE get 请求报400

问题描述: 在使用IE8进行get请求时,参数中有中文存在,发现发送请求之后,返回http状态码400 问题解决方法: 把请求连接进行处理window.encodeURI('http://aaa:8080/wtp?name=小明'); window.location.href=window.encodeURI('http://aaa:8080/wtp?name=小明'); 然后在把处理后

兰州理工大学24计算机考研情况,好多专业都接受调剂,只有计算机专硕不接收调剂,复试线为283分!

兰州理工大学(Lanzhou University of Technology),位于甘肃省兰州市,是甘肃省人民政府、教育部、国家国防科技工业局共建高校,甘肃省高水平大学和“一流学科”建设高校;入选国家“中西部高校基础能力建设工程”、教育部“卓越工程师计划”、“111计划”、新工科研究与实践项目、国家大学生创新性实验计划,是国家国防教育特色学校、全国毕业生就业典型经验高校、中国政府奖

Linux IPC 参数设定,echo 80 /proc/...

文章转自 http://blog.chinaunix.net/uid-22287947-id-1775633.html Linux IPC 参数设定- 命令方式: echo 80 > /proc/sys/vm/overcommit_ratio, etc MSGMNB  每个消息队列的最大字节限制。 MSGMNI  整个系统的最大数量的消息队列。 MSGGSZ  消息片断的大

mysql中in参数过多该如何优化

优化方式概述 未优化前 SELECT * FROM rb_product rb where sku in('1022044','1009786') 方案2示例 public static void main(String[] args) {//往list里面设置3000个值List<String> list = new ArrayList<>();for (int i = 0;

删除第三方AAR所请求的权限

1.问题:引了第三方的AAR库要求一些权限,但我APP不需要,我想删除掉,怎么办 答:很简单,只要在添加:http://schemas.android.com/tools 这个工具在manifest文件中,然后在相应的权限上增加:tools:node="remove"即可。 <manifest xmlns:android="http://schemas.android.com/apk/res/a