我们知道,Struts2完成参数传递处理工作的基础是OGNL和ValueStack。而在这个 过程中,我也把Struts2所要做的工作大致归纳为两个方面: 1. 对OGNL操作进行封装,完成OGNL表达式所表示的值到Java对象的值传递机制 2. 在参数传递的过程中,做恰当的类型转化,保证页面上的字符串能够转化成各 式各样的Java对象 接下来,通过四个不同的角度,来具体讲述Struts2在这两个方面的工作。 ### Struts2中的参数传递 #### 一、概述 在Web开发中,Struts2框架因其灵活、高效的特点被广泛采用。Struts2的核心之一就是它对于参数传递的支持能力,这一点主要依赖于OGNL(Object-Graph Navigation Language)和ValueStack。通过这两个组件,Struts2实现了动态的数据绑定和灵活的类型转换功能。 #### 二、OGNL与ValueStack ##### 1. OGNL简介 OGNL是一种强大的表达式语言,用于获取和设置Java对象的属性。在Struts2中,OGNL被用来解析和执行表达式,从而实现对模型对象的操作。例如,`user.name`这样的表达式可以用来获取或设置`User`对象的`name`属性。 ##### 2. ValueStack的作用 ValueStack是Struts2中一个重要的数据结构,用于存储请求范围内的所有数据。它作为OGNL表达式执行上下文的一部分,使得开发者可以通过OGNL表达式方便地访问这些数据。ValueStack的存在使得Struts2能够轻松地处理复杂的对象模型,并且能够支持多种数据类型。 #### 三、参数传递详解 根据Struts2的工作原理,参数传递主要包括两个方面的工作: 1. **封装OGNL操作,实现值的传递**:Struts2通过对OGNL表达式的封装,实现从客户端传入的参数到Java对象之间的值传递。这一过程包括但不限于对各种复杂类型的处理,如数组、列表、映射等。 2. **类型转换**:为了确保传入的字符串能够正确地转换为所需的Java对象类型,Struts2提供了内置的类型转换器,并允许用户自定义类型转换逻辑。这一步骤对于确保应用程序的安全性和数据完整性至关重要。 接下来,我们将从四个方面详细介绍Struts2如何实现这些功能。 #### 四、最简单的参数传递 这是最基本的参数传递方式,通常用于传递简单的数据类型,如字符串、整型等。在Struts2中,这些参数可以直接通过表单元素的`name`属性与Action类中的属性相匹配,无需额外配置即可实现自动绑定。 例如,下面的HTML代码展示了一个简单的表单,其中包含了一个文本框和一个下拉框,分别用于输入用户名和性别: ```html <form method="post" action="/struts-example/enum-conversion.action"> <input type="text" name="user.name" value="downpour"/> <select name="user.gender"> <option value="MALE">男性</option> <option value="FEMALE">女性</option> </select> <input type="submit" value="submit"/> </form> ``` 对应的Action类如下所示: ```java public class EnumConversionAction extends ActionSupport { private static final Log logger = LogFactory.getLog(Policy.class); private User user; // getter and setter methods for user public User getUser() { return user; } public void setUser(User user) { this.user = user; } // ... } ``` 这里的关键在于`User`类的设计: ```java public class User { private String name; private Gender gender; // 枚举类型定义 public enum Gender {MALE, FEMALE} // getter and setter methods public String getName() { return name; } public void setName(String name) { this.name = name; } public Gender getGender() { return gender; } public void setGender(Gender gender) { this.gender = gender; } } ``` 为了使枚举类型的转换生效,还需要定义一个类型转换器: ```java public class EnumTypeConverter extends DefaultTypeConverter { public Object convertValue(Map context, Object o, Class toClass) { if (o instanceof String[]) { return convertFromString(((String[]) o)[0], toClass); } else if (o instanceof String) { return convertFromString((String) o, toClass); } return super.convertValue(context, o, toClass); } public java.lang.Enum convertFromString(String value, Class toClass) { return Enum.valueOf(toClass, value); } } ``` #### 五、Array、List、Map等容器类型的参数传递 对于更复杂的类型,如数组、列表、映射等,Struts2同样提供了强大的支持。例如,假设我们需要接收一个用户列表,每个用户都有名字和年龄: ```java public class User { private String name; private int age; // getter and setter methods public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } public class UserAction extends ActionSupport { private List<User> users; // getter and setter methods public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; } // ... } ``` 对应的HTML表单可以设计为: ```html <form method="post" action="/struts-example/list-action"> <table> <tr> <th>Name</th> <th>Age</th> </tr> <tr> <td><input type="text" name="users[0].name" value="Alice"/></td> <td><input type="text" name="users[0].age" value="25"/></td> </tr> <tr> <td><input type="text" name="users[1].name" value="Bob"/></td> <td><input type="text" name="users[1].age" value="30"/></td> </tr> </table> <input type="submit" value="Submit"/> </form> ``` #### 六、文件上传 Struts2还支持文件上传功能。要实现文件上传,首先需要在表单中添加一个文件输入字段,并确保`enctype`属性设置为`multipart/form-data`。然后,在Action类中声明一个`File`类型的属性,以及一个`File`类型的数组属性来接收多个文件。 ```html <form method="post" action="/struts-example/upload-action" enctype="multipart/form-data"> <input type="file" name="files" multiple/> <input type="submit" value="Upload"/> </form> ``` 对应的Action类示例: ```java public class UploadAction extends ActionSupport { private File[] files; private String[] fileNames; // getter and setter methods public File[] getFiles() { return files; } public void setFiles(File[] files) { this.files = files; } public String[] getFileNames() { return fileNames; } public void setFileNames(String[] fileNames) { this.fileNames = fileNames; } // ... } ``` #### 七、自定义的类型转化实现 除了内置的类型转换器外,Struts2还允许开发者自定义类型转换逻辑。例如,前面提到的`EnumTypeConverter`就是一个自定义类型转换器的例子。自定义类型转换器可以实现更复杂的逻辑,满足特定的应用需求。 通过上述四个方面的介绍,我们可以看到Struts2提供了一套全面而强大的参数传递机制。无论是简单的字符串、数字类型还是复杂的数组、列表、映射甚至文件,Struts2都能够通过OGNL和ValueStack实现高效的处理。此外,通过自定义类型转换器,开发者还可以扩展Struts2的功能,实现更加灵活的应用场景。
剩余15页未读,继续阅读
- zhhwyybwzl2014-03-01真心不咋地没有将评出·清楚
- 粉丝: 0
- 资源: 10
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Spring Boot框架的博客系统.zip
- (源码)基于Spring Boot框架的博客管理系统.zip
- (源码)基于ESP8266和Blynk的IR设备控制系统.zip
- (源码)基于Java和JSP的校园论坛系统.zip
- (源码)基于ROS Kinetic框架的AGV激光雷达导航与SLAM系统.zip
- (源码)基于PythonDjango框架的资产管理系统.zip
- (源码)基于计算机系统原理与Arduino技术的学习平台.zip
- (源码)基于SSM框架的大学消息通知系统服务端.zip
- (源码)基于Java Servlet的学生信息管理系统.zip
- (源码)基于Qt和AVR的FestosMechatronics系统终端.zip