2009-09-02 60 views
2

我在會話中有一個DLPUser對象,這個DLPUser基本上是一個字符串,整數和一些有用信息的容器。Struts JSP:從會話信息中設置文本字段值

(這是我的java Action類中的代碼片段)

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"/> 

這應該是簡單的......但我堅持並不能找到有關這個事情的支柱和JSP一個很好的參考。 任何幫助非常感謝。

回答

5

我正在學習如何自己做這個,這個討論很有幫助。這些來自各種網頁的材料和「Struts 2 in Action」一書讓我到了需要的地方。

Nate's和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是數據成員及其ge的簡單類tter/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來評估{}
  • 會被你訪問會話堆棧/對象中的表達?

從那裏,結果是正常點運算符訪問對象及其方法/成員。

我是這方面的新手,但如果UserModel的數據成員是私有的,JSP似乎也可以訪問它們,但似乎並不重要。

哦。最後一點,爲了使它「完整」,如何退出?我的java註銷行動:

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

你的原始語法'#session.user.name'可以在屬性標記中工作。它不工作在文本字段標籤,雖然我不知道爲什麼。此外,UserModel的屬性是私有的,但是您訪問的是User對象(您放置在地圖上的對象),因此您可以私下訪問其屬性。 – jsky 2014-05-24 10:51:25

+0

請參閱我的評論爲它在'' – 2014-10-25 17:49:54

1

我明白了......非常感謝您的回答。 Umar ;) 但有沒有更簡單的方法? 我的意思是,我怎麼能用內部

<s:textfield value=????> 

例如Java對象或變量中的財產情況: 將打印出來(從會話VAR)

如何對我的用戶名的內容?

我認爲這不僅適用於struts。但也可以申請正常jsp 像 所以我的問題是什麼去???。 (現在我不能測試,但將這項工作?)非常感謝您

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

我是否獲得closser?

0

你應該能夠做到:

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

你並不需要「得到」在名稱的前面,你在你的榜樣了。另外,它看起來像Umar的答案是Struts1的一個例子。你使用的是Struts 2,對嗎?

+1

我剛剛嘗試過,但上面的代碼在文本框內顯示#session.user.name(字面意思)。 #session.user.name沒有被評估......它似乎。 – nacho4d 2009-09-09 10:30:30

1

只是另一個說明。如果您需要直接訪問您的Java bean(並繞過會話),可以使用下面的語法:

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

<s:textfield value="%{#session.user.name}"/>爲我工作。