struts2传递数据的4中方式

本文详细介绍了Struts2中四种数据传递的方法:1) 通过HttpServletRequest直接获取;2) 使用ActionContext的Map方式;3) 继承ActionSupport并实现RequestAware接口;4) 实现ServletRequestAware等接口。每种方法都展示了如何在不同动作类间传递数据,揭示了Struts2的无侵入式设计和依赖注入思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


第一种:与servlet耦合,我们知道struts2是无侵入式的设计的,体现在POJO,本质是Java简单对象,类本身是由一些private属性和关于属性的get/set方法组成,本身没有业务逻辑代码,而且看不到struts2的影子,所以struts又叫做无侵入式的设计。

            与servlet耦合的方式,推荐使用

           HttpServletRequest request = ServletActionContext.getRequest();
  String userName = request.getAttribute("userName").toString();
  String passWord = request.getAttribute("passWord").toString();
  System.out.println(userName+":"+passWord);
  return "SUCCESS";

           //这里面的getAttribute是动作类中的属性,而属性中的值存的是页面中的值!

第二种:也是与servlet耦合,但是使用的是map方式,此方式与httpServlet不通用,也就是说与request.getAttribute不通用


 a动作类chain转发到b动作类

         a中设置request中数据与map 中:

         ActionContext request = ActionContext.getContext();
    request.put("userName_c", userName);
    request.put("passWord_c", passWord);
    Map<String,Object> session = request.getSession();
    Map<String,Object> appMap = request.getApplication();
    return "SUCCESS";

        b中拿数据:

        ActionContext request = ActionContext.getContext();
String userName = request.get("userName_c").toString();
String passWord = request.get("passWord_c").toString();
Map<String,Object> session = request.getSession();
System.out.println(userName+":"+passWord);
return "SUCCESS";

        核心是使用Struts2核心类库提供的ActionContext拿到web容器request对象


第三种:继承ActionSupport类,实现RequestAware接口

          a动作类中配置

   成员数据变量:private Map<String,Object> request;

           return 静态常量 大写对应小写 比如SUCCESS==>success

      实现接口方法:@Override
                public void setRequest(Map<String, Object> arg0) {
                   this.request =arg0;
                }

   存值:

            request.put("userName_d", userName);
        request.put("passWord_d", passWord);
        return SUCCESS;


            b动作类取值,实现接口,老三样

    private Map<String,Object> request;

    @Override
    public void setRequest(Map<String, Object> arg0) {
this.request=arg0;
     } 

     String u = request.get("userName_d").toString();
     String p = request.get("passWord_d").toString();
     request.put("a", "123");
     System.out.println(u+p);
     return "SUCCESS";

     核心是使用struts2提供的接口,在访问动作类(或者结果视图)之前,采取注入的方式,设置web容器对象;比如说在动作类映射,去配置文件生成动作类代理类之后

     进入struts拦截器,这个拦截器也实现了RequestAware接口,他会判断该动作类是否是该接口衍生类的实例,是的话,拦截请取到http请求对象,并将动作类向上转型成      接口类型,调用setRequest方法而动作类也实现了这个方法,Java对于向上转型的实例调用接口方法的方式是动态绑定的,所以实际调用的是我们动作了哦实现的方                  法,这样把拦截器取得的request容器对象,传过来,再写一个this.request=argo赋值给动作类容器。体现了struts注入的思想!!


第四种:实现ServletRequestAware, ServletContextAware, ServletResponseAware并不一定要全部实现,这里是4个内置对象的所有接口

            a动作类:

      private HttpServletRequest request;
    private ServletContext application;

            private HttpServletResponse response;

    @Override
   public void setServletContext(ServletContext arg0) {
this.application = arg0;
   }
   @Override
    public void setServletRequest(HttpServletRequest arg0) {
this.request = arg0;
    }

   request.setAttribute("userName_e", userName);
       request.setAttribute("passWord_e", passWord);       
       return SUCCESS;

   b动作类

   private HttpServletRequest request;
  @Override
  public void setServletRequest(HttpServletRequest arg0) {
this.request = arg0;
   }

           String u = request.getAttribute("userName_e").toString();
  String p = request.getAttribute("passWord_e").toString();
  System.out.println(u+p);
  return "SUCCESS";

   需要哪一个实现哪一个,其核心思想也是依赖注入,通过struts2内部的类来实现web容器的传递,存取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值