Struts2传值方式

Struts2参数传递方式

1.普通的传值方式

UserActionForCommonParam类

Action类接收三个参数,分别是id,username,content.

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.struts.action;  
  2.   
  3. public class UserActionForCommonParam {  
  4.     private int id;  
  5.     private String username;  
  6.     private String content;  
  7.   
  8.     public int getId() {  
  9.         return id;  
  10.     }  
  11.   
  12.     public void setId(int id) {  
  13.         this.id = id;  
  14.     }  
  15.   
  16.     public String getUsername() {  
  17.         return username;  
  18.     }  
  19.   
  20.     public void setUsername(String username) {  
  21.         this.username = username;  
  22.     }  
  23.   
  24.     public String getContent() {  
  25.         return content;  
  26.     }  
  27.   
  28.     public void setContent(String content) {  
  29.         this.content = content;  
  30.     }  
  31.       
  32.     // 从前台页面接收到参数后会在这个方法里打印  
  33.     public String addUser() {  
  34.         System.out.println("ID: " + this.getId());  
  35.         System.out.println("Username: " + this.getUsername());  
  36.         System.out.println("Content: " + this.getContent());  
  37.         return "success";  
  38.     }  
  39. }  

对应的struts.xml
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <!DOCTYPE struts PUBLIC  
  4.         "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  
  5.         "http://struts.apache.org/dtds/struts-2.3.dtd">  
  6.   
  7. <struts>  
  8.     <constant name="struts.enable.DynamicMethodInvocation" value="true"/>  
  9.     <constant name="struts.devMode" value="true"/>  
  10.     <package name="default" namespace="/" extends="struts-default">  
  11.         <action name="UserActionForCommonParam" class="com.struts.action.UserActionForCommonParam" method="addUser">  
  12.             <result name="success">/UserPage.jsp</result>  
  13.         </action>  
  14.     </package>  
  15. </struts>  

前台页面UserPage.jsp

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>  
  2. <%@ taglib prefix="s" uri="/struts-tags" %>  
  3. <html>  
  4. <head>  
  5.     <title>UserPage</title>  
  6. </head>  
  7. <body>  
  8.     <%--下面的Table用于提交参数(id,username,content)--%>  
  9.     <form action="UserActionForCommonParam" method="POST">  
  10.         <table border="1">  
  11.             <tr>  
  12.                 <td>ID:</td>  
  13.                 <td><input type="text" name="id"/></td>  
  14.             </tr>  
  15.             <tr>  
  16.                 <td>Username:</td>  
  17.                 <td><input type="text" name="username"/></td>  
  18.             </tr>  
  19.             <tr>  
  20.                 <td>Content:</td>  
  21.                 <td><input type="text" name="content"/></td>  
  22.             </tr>  
  23.             <tr>  
  24.                 <td colspan="2" align="center">  
  25.                     <input type="submit" value="提交"/>  
  26.                 </td>  
  27.             </tr>  
  28.         </table>  
  29.     </form>  
  30.     <br/>  
  31.     <%--下面的Table用于显示传递回来id,username,content--%>  
  32.     <table border="1">  
  33.         <tr>  
  34.             <td>ID: </td>  
  35.             <td><input type="text" value="${id}"/></td>  
  36.         </tr>  
  37.         <tr>  
  38.             <td>Username: </td>  
  39.             <td><input type="text" value="${username}"/></td>  
  40.         </tr>  
  41.         <tr>  
  42.             <td>Content: </td>  
  43.             <td><input type="text" value="${content}"/></td>  
  44.         </tr>  
  45.     </table>  
  46.     <%--用于查看ValueStack中的传递的值--%>  
  47.     <s:debug/>  
  48. </body>  
  49. </html>  
在实践后会发现,如果遇到参数非常多的情况,那么就需要在Action类中写非常多的属性以及对应的get/set方法.所以这种方式不太可取.解决问题的方法必然是封装一个JavaBean.这就用到了Strut2的第二种传值方式--DomainModel

2.DomainModel传值

首先要创建一个存储的JavaBean

User类

把id,username,content封装的到一个User类当中.

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.struts.model;  
  2.   
  3. public class User {  
  4.     private int id;  
  5.     private String username;  
  6.     private String content;  
  7.   
  8.     public int getId() {  
  9.         return id;  
  10.     }  
  11.   
  12.     public void setId(int id) {  
  13.         this.id = id;  
  14.     }  
  15.   
  16.     public String getUsername() {  
  17.         return username;  
  18.     }  
  19.   
  20.     public void setUsername(String username) {  
  21.         this.username = username;  
  22.     }  
  23.   
  24.     public String getContent() {  
  25.         return content;  
  26.     }  
  27.   
  28.     public void setContent(String content) {  
  29.         this.content = content;  
  30.     }  
  31. }  

UserActionForDomainModel类

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.struts.action;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4. import com.struts.model.User;  
  5.   
  6. public class UserActionForDomainModel extends ActionSupport{  
  7.     private User user;  
  8.   
  9.     public User getUser() {  
  10.         return user;  
  11.     }  
  12.   
  13.     public void setUser(User user) {  
  14.         this.user = user;  
  15.     }  
  16.   
  17.     public String addUser() {  
  18.         System.out.println("ID: " + user.getId());  
  19.         System.out.println("Username: " + user.getUsername());  
  20.         System.out.println("Content: " + user.getContent());  
  21.         return "success";  
  22.     }  
  23. }  

对应的struts.xml

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <!DOCTYPE struts PUBLIC  
  4.         "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  
  5.         "http://struts.apache.org/dtds/struts-2.3.dtd">  
  6.   
  7. <struts>  
  8.     <constant name="struts.enable.DynamicMethodInvocation" value="true"/>  
  9.     <constant name="struts.devMode" value="true"/>  
  10.     <package name="default" namespace="/" extends="struts-default">  
  11.         <action name="userForDomainModel" class="com.struts.action.UserActionForDomainModel" method="addUser">  
  12.             <result name="success">/UserPage.jsp</result>  
  13.         </action>  
  14.     </package>  
  15. </struts>  

前台页面UserPage.jsp

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>  
  2. <%@ taglib prefix="s" uri="/struts-tags" %>  
  3. <html>  
  4. <head>  
  5.     <title>UserPage</title>  
  6. </head>  
  7. <body>  
  8.     <%--要特别注意的是DomainModel的传值方式必须要使用对象.参数方式进行赋值以及取值--%>  
  9.     <form action="userForDomainModel" method="POST">  
  10.         <table border="1">  
  11.             <tr>  
  12.                 <td>ID:</td>  
  13.                 <td><input type="text" name="user.id"/></td>  
  14.             </tr>  
  15.             <tr>  
  16.                 <td>Username:</td>  
  17.                 <td><input type="text" name="user.username"/></td>  
  18.             </tr>  
  19.             <tr>  
  20.                 <td>Content:</td>  
  21.                 <td><input type="text" name="user.content"/></td>  
  22.             </tr>  
  23.             <tr>  
  24.                 <td colspan="2" align="center">  
  25.                     <input type="submit" value="提交"/>  
  26.                 </td>  
  27.             </tr>  
  28.         </table>  
  29.     </form>  
  30.     <br/>  
  31.     <%--下面的Table用于显示传递回来id,username,content--%>  
  32.     <table border="1">  
  33.         <tr>  
  34.             <td>ID: </td>  
  35.             <td><input type="text" value="${user.id}"/></td>  
  36.         </tr>  
  37.         <tr>  
  38.             <td>Username: </td>  
  39.             <td><input type="text" value="${user.username}"/></td>  
  40.         </tr>  
  41.         <tr>  
  42.             <td>Content: </td>  
  43.             <td><input type="text" value="${user.content}"/></td>  
  44.         </tr>  
  45.     </table>  
  46.     <%--用于查看ValueStack中的传递的值--%>  
  47.     <s:debug/>  
  48. </body>  
  49. </html>  
实际上User类不需要显式的实例化,struts会自动帮你实例化,但前提条件是,传值时需要使用 对象.参数名 的方式进行传递.

除了这种传值方式外,struts2还提供另外一种传值方式.

3.ModelDriven传值

依然要创建User的JavaBean

User类

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.struts.model;  
  2.   
  3. public class User {  
  4.     private int id;  
  5.     private String username;  
  6.     private String content;  
  7.   
  8.     public int getId() {  
  9.         return id;  
  10.     }  
  11.   
  12.     public void setId(int id) {  
  13.         this.id = id;  
  14.     }  
  15.   
  16.     public String getUsername() {  
  17.         return username;  
  18.     }  
  19.   
  20.     public void setUsername(String username) {  
  21.         this.username = username;  
  22.     }  
  23.   
  24.     public String getContent() {  
  25.         return content;  
  26.     }  
  27.   
  28.     public void setContent(String content) {  
  29.         this.content = content;  
  30.     }  
  31. }  

UserActionForModelDriven类

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.struts.action;  
  2.   
  3. import com.opensymphony.xwork2.ModelDriven;  
  4. import com.struts.model.User;  
  5.   
  6. public class UserActionForModelDriven implements ModelDriven<User>{  
  7.     private User user;  
  8.   
  9.     public String addUser() {  
  10.         System.out.println("ID: " + user.getId());  
  11.         System.out.println("Username: " + user.getUsername());  
  12.         System.out.println("Content: " + user.getContent());  
  13.         return "success";  
  14.     }  
  15.   
  16.     @Override  
  17.     public User getModel() {  
  18.         if (user == null) {  
  19.             user = new User();  
  20.         }  
  21.         return user;  
  22.     }  
  23. }  
这种方式可以不用在Action类中编写对应的get/set方法,但是需要实例化User类.

前台UserPage.jsp

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>  
  2. <%@ taglib prefix="s" uri="/struts-tags" %>  
  3. <html>  
  4. <head>  
  5.     <title>UserPage</title>  
  6. </head>  
  7. <body>  
  8.     <form action="userForModelDriven" method="POST">  
  9.         <table border="1">  
  10.             <tr>  
  11.                 <td>ID:</td>  
  12.                 <td><input type="text" name="id"/></td>  
  13.             </tr>  
  14.             <tr>  
  15.                 <td>Username:</td>  
  16.                 <td><input type="text" name="username"/></td>  
  17.             </tr>  
  18.             <tr>  
  19.                 <td>Content:</td>  
  20.                 <td><input type="text" name="content"/></td>  
  21.             </tr>  
  22.             <tr>  
  23.                 <td colspan="2" align="center">  
  24.                     <input type="submit" value="提交"/>  
  25.                 </td>  
  26.             </tr>  
  27.         </table>  
  28.     </form>  
  29.     <br/>  
  30.     <%--下面的Table用于显示传递回来id,username,content--%>  
  31.     <table border="1">  
  32.         <tr><span id="transmark"></span>  
  33.             <td>ID: </td>  
  34.             <td><input type="text" value="${id}"/></td>  
  35.         </tr>  
  36.         <tr>  
  37.             <td>Username: </td>  
  38.             <td><input type="text" value="${username}"/></td>  
  39.         </tr>  
  40.         <tr>  
  41.             <td>Content: </td>  
  42.             <td><input type="text" value="${content}"/></td>  
  43.         </tr>  
  44.     </table>  
  45.     <%--用于查看ValueStack中的传递的值--%>  
  46.     <s:debug/>  
  47. </body>  
  48. </html>  

页面还是和普通传值一样.

可以去ValueStack当中观察参数的存储,更透彻的理解Struts2的参数传递.


<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:配置Action 在struts.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` 是实现递的核心组件。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值