在Action中,
List list = new ArrayList();
list.add( new User("mike") );
list.add( new User("alreen") );
list.add( new User("mary") );
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute( "list", list );在JSP里
                <s:iterator value="list" id="user" status="status">

${user.name } <br> 


</s:iterator>
这里得不到这个值。
但是如果我把list作为action的属性,并生成get/set方法,JSP是可以得到的,
望各位大哥指教

解决方案 »

  1.   

    <s:iterator value="#request.list" id="user" status="status"> 或者 你吧list 定义到 全局的
       给上get  set 方法。。
      你用你的办法可以得到 
      

  2.   

    谢谢楼上的大哥啊,
    那我想问下“#request.list"” 中的#表示什么含义呢,
    还有网上我还看到 有%,&  这些是什么意思呢 ?
      

  3.   

    我一般都是 EL+struts2标签
     开发比较快
      

  4.   

    #request 就是在request里取值 同理有#session等
    其实你还可以用
    ActionContext.getContext().put("list",list);
      

  5.   

    你用ActionContext.getContext().put("list",list);
    直接<s:iterator value="list">就可以
    不用写#request.list
      

  6.   

    如果是ActionContext.getContext().put("list",list);那就等于把属性保存在application之中了,
    这样不符合规范吧,一般都是保存在request范围的
    还想问下,%, & 又是什么意思呢?
      

  7.   


                    <s:iterator value="list" var="user" status="status"> <s:property value="user.name" <br> 
      

  8.   

    struts2标签的生命周期要搞清楚哟。去看看这个标签的说明。这样你就知道为什么作为action属性,get,set就可以取得。
      

  9.   

    <input name="name" value="${user.name}"> 
      

  10.   

    List list = new ArrayList(); <input name="name" value="${list.name}"> 
      

  11.   

    用el表达式很好呀,struts2的标记库没有用过
      

  12.   


    我刚刚看了源码 经过测试 得出以下结论ActionContext.getContext().put("list",list);是把["list",list]这个键值对放到一个Map里
    这个map在ActionContext里 其实就是在一个ThreadLocal里在jsp页面是怎样得到这个list的呢? 原因是通过下面这个类
    org.apache.struts2.dispatcher.StrutsRequestWrapper这个类是HttpServletRequest的包装类
    他重写了public Object getAttribute(String s)方法 这个方法将会被在页面中调用
    在这个方法里 他首先在request里找有没有这个list 如果没有 他就在ActionContext的那个map里去找
    所以在这里 request application里是没有list的 list是在一个ThreadLocal的map里
      

  13.   

    最最安全的取法<s:iterator value="%{#request.list}" id="user" status="status"> 
      

  14.   

    在每次执行Action之前都会创建新的ActionContext,ActionContext是线程安全的,也就是说在同一个线程里ActionContext里的属性是唯一的,这样我的Action就可以在多线程中使用。ThreadLocal为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。这样,我们ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的。struts2框架将与Web相关的很多对象(request,response,session,application等)重新进行了包装,供我们的Action使用,而不用直接和底层HttpServlet打交道。也正是框架的包装,让我们的Actoion可以完全的和Web层解藕。如果我们的Action需要直接与Servlet的HttpSession、HttpServletRequest等一些对象进行操作,可以使用ServletActionContext。但是ServletActionContext和ActionContext有着一些重复的功能,在我们的Action中,该如何去抉择呢?我们遵循的原则是:如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问JavaServlet的相关对象。在使用ActionContext时有一点要注意:不要在Action的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null。
      

  15.   

    我刚看了下,还有好几种保存request的方法,
    public class PersonAction2 extends ActionSupport implements RequestAware,SessionAware,ApplicationAware
    {
    private Map<String ,Object> request;
    private Map<String ,Object> session;
    private Map<String ,Object> application;

    /**
     *  IOC,本来是由自己初始化,现在由struts2帮你初始化,这种是最常用的
     *  这3个属性范围控制反转给struts2控制
     * 
     */
    public String execute()
    {
    System.out.println("PersonAction22222222222222222");
    request.put( "name", "MIKE" );
    session.put( "password", "123456" );
    application.put( "age", 20 );
    return SUCCESS;

    } public void setRequest( Map<String, Object> request )
    {
    this.request=request;
    } public void setSession( Map<String, Object> session )
    {
    this.session=session;
    } public void setApplication( Map<String, Object> application )
    {
    this.application=application;
    }
    }