Struts2参数传递全解析:从jsp到Action的高效传输

0 下载量 2 浏览量 更新于2024-09-06 收藏 63KB PDF 举报
"这篇Struts2学习笔记主要探讨了如何在Struts2框架中进行参数传递,以便将前端用户输入的数据有效地传输到后台Action类进行处理。文章通过一个简单的示例,展示了如何使用Action中直接参数的方法来实现这一过程。" 在Struts2框架中,参数传递是连接前端视图和后端业务逻辑的关键步骤。以下是几种常见的参数传递方法: 1. Action中直接参数法 这是最基础的参数传递方式,可以直接在Action类的方法上声明与前端请求参数相匹配的字段。例如,在`index.jsp`中,我们创建了一个链接`<a>`,通过`?name=a&age=8`传递了两个参数`name`和`age`。在Struts2的配置文件`struts.xml`中,我们需要定义一个对应的Action,如下所示: ```xml <action name="user!add" class="com.example.UserAction"> <result name="success">/success.jsp</result> </action> ``` 在对应的`UserAction`类中,我们可以直接声明`name`和`age`属性,并且Struts2的拦截器会自动将这些请求参数绑定到Action对象上,如下: ```java public class UserAction { private String name; private int age; // getters and setters public String execute() { // 这里可以访问到name和age的值,进行业务处理 System.out.println("Name: " + name); System.out.println("Age: " + age); return "success"; } } ``` 当用户点击链接时,Struts2会将请求参数自动映射到Action类的属性上,然后执行`execute`方法。 2. 使用DTO(Data Transfer Object) 对于复杂的参数传递场景,可以使用DTO(数据传输对象)来封装多个参数。在Action中定义一个DTO类型的成员变量,然后由Struts2自动映射请求参数到DTO对象中。例如: ```java public class UserAction { private User user; // getters and setters public String execute() { // 这里可以通过user对象获取所有参数 System.out.println("Name: " + user.getName()); System.out.println("Age: " + user.getAge()); return "success"; } } public class User { private String name; private int age; // getters and setters } ``` 在`index.jsp`中,请求参数的格式保持不变,但在`struts.xml`中,Action配置需要指向DTO的getter方法: ```xml <action name="user!add" class="com.example.UserAction"> <param name="user.name">{1}</param> <param name="user.age">{2}</param> <result name="success">/success.jsp</result> </action> ``` 这样,Struts2会将请求参数按顺序映射到DTO对象的相应属性上。 3. 使用Map类型参数 如果参数数量不确定或者参数名称动态变化,可以使用Map来接收所有参数。在Action中声明一个Map类型的属性,Struts2会将所有请求参数作为键值对放入Map中: ```java public class UserAction { private Map<String, String> params; // getters and setters public String execute() { // 可以通过Map获取所有参数 String name = params.get("name"); int age = Integer.parseInt(params.get("age")); // ... } } ``` 在`struts.xml`中,不再需要显式配置每个参数,因为Struts2会自动将所有请求参数放入Map。 4. 使用ModelDriven接口 实现`ModelDriven`接口,可以将请求参数自动绑定到指定的Model对象上,简化Action类的编写。例如,创建一个`User`模型类,然后在Action中实现`ModelDriven`: ```java public class UserAction implements ModelDriven<User> { private User user = new User(); @Override public User getModel() { return user; } public String execute() { // 参数自动绑定到user对象 System.out.println("Name: " + user.getName()); System.out.println("Age: " + user.getAge()); return "success"; } } ``` 使用这种方式,请求参数的映射配置依然在`struts.xml`中完成,但无需指定每个参数。 Struts2提供了多种灵活的参数传递方式,可以根据实际需求选择合适的方法。通过这些方式,开发者能够方便地将前端数据传送到后台进行处理,进而实现业务逻辑。

我用Spring5的aop应用时报这个错误Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from file [D:\ecliple\web5\WEB-INF\applicationContext.xml]; nested exception is java.nio.file.NoSuchFileException: WEB-INF\applicationContext.xml,他说我的applicationContext.xml文件不存在,可是我明明有这个文件,另外我的web.xml需要更改吗<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <context-param> <param-name>contextConfigLocation </param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <display-name>Struts2</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/* </url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>

2023-05-30 上传