【问题标题】:Struts JSP : set textfield value from session informationStruts JSP:从会话信息中设置文本字段值
【发布时间】:2009-09-02 09:22:10
【问题描述】:

我的会话中有一个 DLPUser 对象,这个 DLPUser 基本上是一个包含字符串、整数和一些对我有用的信息的容器。

(这是我在java中的动作类中的一段代码)

Map <String, Object> session = ActionContext.getContext().getSession();
session.put("logged-in","true");
session.put("user", user); //user is DLPUser user = new DLPUser();

现在我想显示 user.getName(); 的值在某些 JSP 中的 textField 内 我怎样才能做到这一点? 我正在使用 Struts 标签,但以下内容不起作用。

<s:textfield label="Name" name="name" value="<% session.user.getName(); %>"/>

<s:textfield label="Name" name="name" value="#session.user.getName"/>

这应该很简单......但我被卡住了,无法在 struts 和 jsp 中找到关于这件事的好参考。 非常感谢任何帮助。

【问题讨论】:

    标签: jsp session struts textfield


    【解决方案1】:

    我自己正在学习如何做到这一点,这次讨论很有帮助。结合来自各种网页的材料和“Struts 2 in Action”一书,我到达了我需要的地方。

    Nate 和 nacho4d 的答案接近分数。这是我所做的:

    必需的进口:

    import java.util.Map;
    import com.opensymphony.xwork2.ActionSupport;
    import org.apache.struts2.interceptor.SessionAware;
    

    我的动作类(“用户”)声明:

    public class User extends ActionSupport implements SessionAware {
    

    我的会话变量是用户的数据成员:

    Map <String, Object> session;
    

    然后,在我对用户进行身份验证的方法中(请注意,UserModel 是仅包含数据成员及其 getter/setter 的简单类)

    UserModel user;
    ...
    session.put("User", user);
    

    最后,在我的jsp文件中:

                <s:if test="%{#session.User.isLoggedIn()}">
                    Welcome back, <s:property value="%{#session.User.firstName}" />
                    <s:property value="%{#session.User.middleName}" />
                    <s:property value="%{#session.User.lastName}" />!
                    &nbsp;&nbsp;&nbsp;&nbsp;
                    <a href="Logout.action">Logout</a>
                </s:if>
    

    注意访问会话对象方法/数据成员的语法。虽然我没有在某处详细阅读过,但我猜是:

    • %{} 告诉 jsp 计算 {}
    • 内的表达式
    • session 让您可以访问会话堆栈/对象?

    从那里,结果是用于访问对象及其方法/成员的普通点运算符。

    我是这方面的新手,但似乎 UserModel 的数据成员是否私有也没关系,JSP 无论如何都可以访问它们。

    哦。最后一点,为了让它“完整”,注销怎么样?我用于注销操作的 java:

    public String logoutUser()
    {
        session.remove("User");
        return SUCCESS;
    }
    

    【讨论】:

    • 您的原始语法 #session.user.name 可以在属性标签中使用。它在文本字段标签中不起作用,尽管我不知道为什么。此外,UserModel 的属性是私有的,但您访问的是用户对象(您放在地图上的那个),因此您可以私有地访问其属性。
    • 请查看我的 cmets 以使其在 &lt;s:textfield&gt; 中工作
    【解决方案2】:

    &lt;s:textfield value="%{#session.user.name}"/&gt; 为我工作。

    【讨论】:

      【解决方案3】:

      我明白了……非常感谢您的回答。奥马尔 ;) 但是有没有更简单的方法? 我的意思是,我怎样才能在里面使用java对象或变量

      <s:textfield value=????>
      

      例如在财产的情况下: 会打印出我的用户名的内容(来自会话变量)

      怎么样?

      我认为这不仅适用于 struts。但也可以应用于普通的jsp 像 所以我的问题是里面有什么??? 非常感谢

      (我现在无法测试,但这会有效吗?)

      <% Map session = ContextAction.getContext().getSession(); %>
      <s:textfield value="%{session.user.name}"/> or
      <s:textfield value="%{session.get("user").getName()}"/>
      

      我越来越近了吗?

      【讨论】:

        【解决方案4】:

        只是另一个注释。如果您需要直接访问您的 Java bean(并绕过会话),您可以使用以下语法:

        <s:textfield name="userBean.username" maxlength="30" value="%{userBean.username}"  ></s:textfield>
        

        【讨论】:

          【解决方案5】:

          你应该可以做到:

          <s:textfield label="Name" name="name" value="#session.user.name"/>
          

          您不需要像示例中那样在名称前加上“get”。此外,看起来 Umar 的答案是 Struts1 的一个例子。您使用的是 Struts 2,对吗?

          【讨论】:

          • 我刚试过,但上面的代码在文本字段中显示了#session.user.name(字面意思)。 #session.user.name 未评估...似乎。
          猜你喜欢
          • 1970-01-01
          • 2011-11-08
          • 2013-01-04
          • 2014-11-22
          • 2015-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多