struts传值

1.今天一直struts传值,action个中的一个属性自动注入功能一直没有实现,原来是使用了artdialog弹出层。

2.后来在struts的一个action中没有实现跳转,原来action自动set属性只能够是基本数据类型,不能为list或者对象。

<think>我们正在讨论Struts2框架中使用Bean进行递的问题。根据提供的引用,我们可以整合以下信息: 引用[1]提到Struts2动作的默认URI后缀是.action,也可以通过配置修改。 引用[2]强调了拦截器是Struts2框架的支柱。 引用[3]展示了在web.xml中配置Struts2核心过滤器的代码。 引用[4]是关于Django的一些标签,与当前问题无关。 用户的问题是如何在Struts2中使用Bean进行递。在Struts2中,递通常通过模型驱动(ModelDriven)模式或直接使用JavaBean属性来实现。 ### 步骤1:理解递的基本方式 在Struts2中,Action类可以拥有JavaBean属性,这些属性可以通过OGNL表达式在JSP页面Action之间。例如,如果Action中有一个名为`user`的JavaBean属性(包含`name`和`age`属性),那么在JSP页面中可以使用`<s:textfield name="user.name" />`来绑定。当表单提交时,Struts2会自动将请求参数填充到Action的`user`属性中。 ### 步骤2:使用模型驱动(ModelDriven)接口 另一种更直接的方式是实现`ModelDriven`接口。这样,Action类就可以直接提供一个模型对象(即Bean),Struts2会将请求参数直接注入到这个模型对象中。 1. **创建JavaBean**:例如,一个User类。 ```java public class User { private String name; private int age; // getter和setter方法 } ``` 2. **Action类实现ModelDriven接口**: ```java public class UserAction extends ActionSupport implements ModelDriven<User> { private User user = new User(); // 必须实例化 @Override public User getModel() { return user; } // 其他业务方法 } ``` 这样,在JSP页面中,表单字段可以直接使用`name`和`age`作为名称,而不需要加上`user.`前缀。 ### 步骤3:配置Actionstruts.xml中配置Action: ```xml <action name="userAction" class="com.example.UserAction"> <result name="success">/success.jsp</result> <result name="input">/form.jsp</result> </action> ``` ### 步骤4:在JSP页面中使用 在form.jsp中: ```jsp <s:form action="userAction"> <s:textfield name="name" label="Name"/> <s:textfield name="age" label="Age"/> <s:submit/> </s:form> ``` 当表单提交时,Struts2会通过模型驱动机制将请求参数注入到User对象的对应属性中。 ### 注意事项 - 模型驱动要求Action必须实现`ModelDriven`接口,并实现`getModel()`方法返回模型对象实例。 - 模型对象必须在Action中实例化(如上述代码中的`private User user = new User();`)。 - 如果使用属性驱动(即不使用ModelDriven),则需要在Action中定义JavaBean属性,并提供getter和setter方法,同时在JSP页面中使用带前缀的名称(如`user.name`)。 ### 引用说明 在Struts2中,这种递机制依赖于拦截器(如`modelDriven`拦截器)[^2]。因此,确保在配置中包含了Struts2的默认拦截器栈。 [^1]: 关于Struts2动作后缀的配置,但与本问题关系不大。 [^2]: 拦截器是Struts2框架的支柱,模型驱动功能就是由拦截器实现的。 [^3]: 配置核心过滤器是使用Struts2的前提。 §§相关问题§§ 1. Struts2中模型驱动(ModelDriven)和属性驱动有什么区别? 2. 如何配置Struts2拦截器以实现自定义的递逻辑? 3. 在Struts2中,如何递集合类型的(如List或Map)?</think>在 Struts2 框架中,Bean 递主要通过模型驱动(ModelDriven)机制实现,以下是具体实现步骤: ### 一、核心实现步骤 1. **创建 JavaBean** 定义包含属性和 getter/setter 方法的 POJO: ```java public class User { private String username; private String email; // Getter & Setter public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } // 其他属性的 getter/setter } ``` 2. **Action 类实现 ModelDriven 接口** 通过 `getModel()` 返回 Bean 实例: ```java public class UserAction extends ActionSupport implements ModelDriven<User> { private User user = new User(); // 必须实例化 @Override public User getModel() { return user; // 返回 Bean 对象 } public String execute() { // 可直接使用 user.getUsername() 操作数据 return SUCCESS; } } ``` 3. **JSP 页面绑定数据** 使用 OGNL 表达式直接访问 Bean 属性: ```jsp <s:form action="userAction"> <s:textfield name="username" label="用户名"/> <!-- 自动绑定到 user.username --> <s:textfield name="email" label="邮箱"/> <s:submit value="提交"/> </s:form> ``` 4. **结果页面显示数据** ```jsp 用户名: <s:property value="username"/> <!-- 直接输出 user.getUsername() --> 邮箱: <s:property value="email"/> ``` ### 二、关机制说明 1. **模型驱动拦截器** Struts2 的 `ModelDrivenInterceptor` 自动调用 `getModel()`,将返回的 Bean 压入栈顶部[^2]。这使得 JSP 可直接访问 Bean 属性(如 `username` 而非 `user.username`)。 2. **数据流过程** ```mermaid graph LR A[JSP 表单提交] --> B[Struts2 拦截器] B --> C[ModelDrivenInterceptor 调用 getModel] C --> D[Bean 属性注入] D --> E[Action 执行业务逻辑] E --> F[结果页读取 Bean 数据] ``` 3. **配置要点** 在 `struts.xml` 中确保包含默认拦截器栈: ```xml <package name="default" extends="struts-default"> <action name="userAction" class="com.example.UserAction"> <result>/result.jsp</result> </action> </package> ``` ### 三、注意事项 1. **Bean 必须实例化** Action 类中需显式初始化 Bean(如 `private User user = new User()`),否则会抛 `NullPointerException`。 2. **多模型场景处理** 若需递多个 Bean,建议: - 使用组合模式(主 Bean 包含其他 Bean) - 通过 Action 属性直接暴露(需在 JSP 中使用 `userBean.username` 格式) 3. **作用域管理** Bean 默认存在于请求作用域。若需跨请求,需手动存入 Session: ```java ActionContext.getContext().getSession().put("user", user); ``` ### 四、与统属性驱动的对比 | **方式** | 优点 | 缺点 | |----------------|--------------------------|--------------------------| | **模型驱动** | 代码简洁,直接访问属性 | 一个 Action 仅支持一个模型 | | **属性驱动** | 支持多个独立 Bean | JSP 需写完整路径(如 `user.username`) | [^1]: Struts2 的默认拦截器栈包含模型驱动处理机制。 [^2]: `ModelDrivenInterceptor` 是实现递的核心组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值