struts2 传值方式

本文详细阐述了在用户登录过程中,如何通过三种方法将用户名传递到登录成功页面:使用默认的action传递方式、自定义vo和ModelDriven接口。重点对比了每种方法的优缺点,并提供了实际代码示例。
如何把登陆页面中的用户名传递到登录成功的页面中呢?
有三种方式,
 
1,使用默认的action的传递方式。
2,自定义一个vo,在action中使用这个vo
3,使用ModelDriven的方式。
下面分别叙述。
 
1,使用默认的action的传递方式。
action文件如下:
package struts2.login;
 
public class LoginAction {
   
    private String username;
    private String password;
   
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
   
    public String execute() {
        System.out.println (LoginAction.class.hashCode());
        if (username.equalsIgnoreCase("aaa") &&
                password.equals("aaaaaa")) {
            return "loginSuc";
        }
        else {
            return "loginFail";
        }
    }
 
}
 
 
登陆成功的文件如下:
<%@ page contentType="text/html; charset=gb2312" %>
<%@ taglib uri="/struts-tags" prefix="s"%>
<meta http-equiv="content-type" content="text/html;charset=gb2312">
 
 
欢迎您,<s:property value="username" /> 登录成功。
 
2,自定义一个vo,在action中使用这个vo
自定义vo文件名:LoginVO.java
文件内容:
package struts2.login;
 
public class LoginVO {
     private String username;
    private String password;
   
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
   
}
 
 
在Action文件中,要使用这个vo
文件内容:
package struts2.login;
 
public class LoginAction {
     private LoginVO user = null;
 
    public String execute() {
        System.out.println (LoginAction.class.hashCode());
        if (user.getUsername().equalsIgnoreCase("aaa") &&
                user.getPassword().equals("aaaaaa")) {
            return "loginSuc";
        }
        else {
            return "loginFail";
        }
    }
 
     public LoginVO getUser() {
        return user;
    }
 
    public void setUser(LoginVO user) {
        this.user = user;
    }
 
}
 
登陆成功的文件如下:  www.2cto.com
<%@ page contentType="text/html; charset=gb2312" %>
<%@ taglib uri="/struts-tags" prefix="s"%>
<meta http-equiv="content-type" content="text/html;charset=gb2312">
 
 
欢迎您,<s:property name="user.username"> 登录成功。
 
注意login文件的部分也要进行修改
文件内容如下:
<meta http-equiv="content-type" content="text/html;charset=gb2312">
<title>login2</title>
 
<form action="login.action" method="post">
  username:<input type="input"  name="user.username" ><br>
  password:<input type="input"  name="user.password" ><br>
  <input type="submit" value="登录">
</form>
 
3,使用ModelDriven的方式。
同样也需要一个vo,这个vo和方法2中的一致,但是action中的写法就不一样了。
action文件内容如下:
package struts2.login;
 
import com.opensymphony.xwork2.ModelDriven;
 
public class LoginAction  implements ModelDriven<LoginVO> {
     @Override
    public LoginVO getModel() {
        // TODO Auto-generated method stub
        return user;
    }
 
    private LoginVO user = new LoginVO();
    public String execute() {
        System.out.println (LoginAction.class.hashCode());
        if (user.getUsername().equalsIgnoreCase("aaa") &&
                user.getPassword().equals("aaaaaa")) {
            return "loginSuc";
        }
        else {
            return "loginFail";
        }
    }
}
 
而登陆成功的页面和login的文件则不需要追加user的前缀,即和方法1的文件内容一样。
 
三种方法的总结:
第一种方法把form的值都放在action文件中,当form提交的项目很多的时候,action的内容将变得很多,很臃肿。项目少的时候可用。
 
第二种方法将form的值单独放在vo中,解决了action文件臃肿的问题,同时使form和action分开,较好。但是需要在设置和获取的 jsp 页面上进行标识。
 
第三种方法在第二种方法的基础上,通过实现特定的接口,去掉了action中的set和get方法,同时去掉了jsp页面上的标识。使后台程序的logic更加清晰
<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、付费专栏及课程。

余额充值