上学的时候 ,也没学什么 ,年底了 工作不忙 就开始自己研究S2SH了,刚能整合到一起就遇到了一个问题,先上代码:
package com.myclass.test.action;import javax.annotation.Resource;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext;
import org.springframework.stereotype.Controller;import com.myclass.test.dto.UserDTO;
import com.myclass.test.service.UserService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
@Controller("UserAction")
public class UserAction extends ActionSupport {
   @Resource
private UserService  userService;
    private  String  userName;
@Override
public String execute() throws Exception {

//System.out.println("---"+userName);
userService.addUser(new UserDTO(userName)); ActionContext ac=ActionContext.getContext();  
HttpServletRequest request=(HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);  
System.out.println("@@"+request.getParameter("userName"));
        
ActionContext.getContext().put("message", userName);
return  SUCCESS;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}}
我现在想问的时,userName 这个属性,是Struts2可以自己根据页面(JSP)传来的表单
给赋值进去的,那么我用
ActionContext.getContext().get("userName")
为什么取不到值呢,得到一个null但是
ActionContext ac=ActionContext.getContext();  
HttpServletRequest request=(HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST); 
System.out.println("@@"+request.getParameter("userName"));
这样就可以呢?而且这样也是可以的
ActionContext ac=ActionContext.getContext();  
HttpServletRequest request=(HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);  
System.out.println("@@"+request.getAttribute("userName"));
        
那么  ActionContext.getContext().get("userName") 这样实在哪里取得的值呢?

解决方案 »

  1.   

    System.out.println("------"+((Map)(ActionContext.getContext().get("request"))).get("userName"));

    System.out.println("@@@@@@@@@@@"+ ServletActionContext.getRequest().getParameter("userName"));
    System.out.println("@@@@@@@@@@@"+ ServletActionContext.getRequest().getAttribute("userName"));
    以上都能取到值 
    而且
    System.out.println("------"+((Map)(ActionContext.getContext().get("request"))).get("userName"));

    和ActionContext ac=ActionContext.getContext();  
    HttpServletRequest request=(HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);  
    System.out.println("request:"+request.getParameter("userName"));
            应该是等价的那我就又有一个疑问了
    ActionContext.getContext().get("userName")  这样取得不到值那么 在Action 中
    [code]ActionContext.getContext().put("message", userName);[/code]刚进去的值  在JSP
    [code]System.out.println(request.getAttribute("message")); [/code]这些写就能取到那ActionContext.getContext().put 就是放到了request中
    但为什么ActionContext.getContext().get  就在request中取不到值呢纠结了
      

  2.   

    其实你纠结的地方就不对。
    ActionContext中包含 ValueStack,request,session,application、 , 、 attr、parameters这些对象,而这些对象之后又包含了userName这个值的。
    就像你一个房间里的一个衣柜里面放了一件衣服。
    你直接打开房间而不打开衣柜是拿不到衣服的。。
    另外给你一个建议,你可以把结果返回到一个jsp页面中,jsp页面中加上<debug></debug>,注意引入struts标签。
    然后看返回给你的jsp页面,上面包含页面中所有的值,那个值在哪个对象下面都是很清楚的。
      

  3.   

    能详细说明一下吗
    S2Sh 都是我自己看的   真的  没什么老师
      

  4.   

    你先别SSH了。你刚才介绍的应该没涉及到Spring的。
    这些技术一个来学吧。
    你先找一些基本的Struts2例子做做吧。。感觉做完了基本学的就差不多了
      

  5.   

    是我看错了还是你写错了put时key是message对吧
    ActionContext.getContext().put("message", userName);get时key变成了userName?
      

  6.   

    action  取jsp里面的值  取值的方法很多  感觉最简单的一种是action定义的变量和jsp控件定义的名字一样就行
      

  7.   

    spring的依赖注入  看看
      

  8.   


    兄弟 你没买看明白吧 我没有那么二  userName  是我在页面传进来的参数。
      

  9.   

    我就想知道  在JSP 页面传参的时候 是把值放到了那里。 get的时候 是在哪里取得的。
    别说那些没有用的。
    要是不明白就别回答。
    我最近没有时间,要不让我就自己下载源代码看了。
      

  10.   

     ActionContext.getContext().put("message", userName); 
    ActionContext.getContext().get("userName");
    这是你代码里面拷出来的
      

  11.   


    我说点啥好呢   username 是我要在Action里取出来的东西
    message  是我后续要放进去的  这个很好理解的吧
      

  12.   

      ActionContext.getContext().put("message", userName);  这句话但我没写  好吗   
      

  13.   

    2楼说的就是对的。 如果要通过action上下文来获取页面参数,应该通过的事下面的方法来获取。ActionContext context = ActionContext.getContext();Map params = context.getParameters();String username = (String) params.get(“username”);
      

  14.   

    哦,那样确实没问题,但是你ActionContext里面的对象userName是什么时候放进去的呢?
    struts2自动放进去的userName好像并不在ActionContext这个大的对象里面
      

  15.   

    lz  还是看看ActionContext.getContext();的对象  都封装了什么吧
      

  16.   


    也在ActionContext 这里里面    但是不能直接取到  
      

  17.   

    我就是想知道 put的时候 是放在了哪个值栈里   get的时候默认是在哪个取得的
      

  18.   

    我觉得这个没必要深究他,ActionContext.getContext().put("message", userName);是放到context里
    你用<s:debug/>看就行了
      

  19.   

    Action.getContext().get("xxx")会到CompoundRoot中去取值,而request.getParameter("xxx")到ValueStack中去取,如果userName是action的一个属性,用Action.getContext().get("xxx")就能取到
      

  20.   

    同学习!
    首先非常赞同2楼回答,例子也很形象。
    我觉得ActionContext.getContext().put("xxx", yyy)是put进了context最下层,而request是在中间层,这样用request.getAttribute能取出put进去的值。
    相同的是ActionContext.getContext().get首先会去request中间这一层找,发现找不到username所以取不出,而用ActionContext.getContext().request.get就到最下层去找到username自然就取出来啦.
      

  21.   

    http://blog.csdn.net/smcfy/article/details/5693481参考学习。
      

  22.   

     非常欣赏lz善于发现问题的能力。    ActionContext.getContext.get()方法可获取当前ActionContext中key对应的value。同时该方法可以获取HttpServletRequest中的属性。
        ActionContext.getContext.put()方法将key-value存放在ActionContext中,该方法可用于向HttpServletRequest存入属性。    HttpServletRequest中的getAttribute(String s)和getParameter(String s)方法本质是不一样,不然为啥写两个方法呢。
    一个是获取request范围内属性值,一个是获取请求参数值。

       上述说明和LZ的实例验证的结果有出入,就是调用get方法可以拿到值,而调用request.getAttribute却拿到值了。因此本人同样
    编写了简单的demo如下测试   
     ActionContext ac = ActionContext.getContext();
    HttpServletRequest request = 
    (HttpServletRequest)ac.get(ServletActionContext.HTTP_REQUEST);

    String para = (String)request.getAttribute("para");
    logger.info("attribute[para]=" + para);
    String par2 = (String)request.getParameter("para");
    logger.info("parameter[para]=" + par2);
    String par3 = (String)ac.get("para");
    logger.info("context.get[para]=" + par3);
    ac.put("mes", "putValue");
    String mes = (String)request.getAttribute("mes");
    logger.info("attribute[mes]=" + mes);
    输出结果如下:
    attribute[para]=null //requst属性中没有这个值。
    parameter[para]=test //请求参数中的值
    context.get[para]=null //同1
    attribute[mes]=putValue  //自行设置的属性值,可以获取

    结果和最开始介绍的get,set方法保持一致,就是get,set方法其实是操作的HttpServletRequest中的属性。
    lz的例子中通过getAttribute能获取到值,是不是在别的地方调用setAttribute方法了?
      

  23.   

    action的开头设置个断点。一目了然啊。。2楼的比喻很正确了。但是可能后面那个楼主不明白的put问题没搞清,之所以PUT可以取到,是因为他会Put在两个地方,包括根对象和request对象。。记得当时看过书好像是这样的。如果你不信我的讲法,你也可以按照楼上的,在页面写个debug来就能清晰的查出这个Put是放在什么位置。。
      

  24.   

    put<key,value>  我亲爱的楼主
      

  25.   

    ActionContext.getContext().put("xxx", xxVALUE) 相当于 request.setAttribute("xxx",xxVALUE)
    相比楼主传过来参数的形式是?xxx=xxVALUE吧
    不能用get方法去取
      

  26.   

    你的action中没有传值肯定取不到啊!
      

  27.   

    ActionContext context = ActionContext.getContext();得到的是一个线程安全容器。
    它的内部结构是是一个OGNL值栈,本质上是一系列的MAP,所以楼主直接取一个键值对的值是取不到的。
    对于页面请求所传的参数,Struts2会调用params拦截器压入值栈中的params map中,然后通过反射调用action里的set方法给属性赋值。所以想要通过get(key)的形式获取值,必须先获取params,即"getParameters()"。
    另外,ActionContext的实现主要是为了与底层web解耦,所以不应该与底层web对象httprequest打交道。如果楼主实在是想实现类似于request.getParameter("userName"))的用法,可以使用ServletActionContext对象,它可以与servlet api打交道,可以通过ServletActionContext. getRequest()获取HttpRequest对象,实现楼主的用法。
      

  28.   

    大神,问你个问题, 我通过getHibernateTemplate()方法里面哪个方法可以 实现通过表内某个字段查询