2009-09-02 3 views
2

У меня есть объект DLPUser в моей сессии, этот DLPUser в основном представляет собой контейнер для строк, ints и некоторую полезную информацию для меня.Struts JSP: установить значение текстового поля из информации сеанса

(это фрагмент кода в моем классе действий в 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(); внутри textField в некотором JSP Как это сделать? Я работаю с тегом 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 и 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 олучатель/сеттеры)

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

+0

Пожалуйста, просмотрите мои комментарии, чтобы он работал в '' –

1

Я вижу ... большое спасибо за ваш ответ. Umar ;) Но есть ли более простой способ? Я имею в виду, как я могу использовать объекты Java или переменные внутри

<s:textfield value=????> 

, например, в случае собственности: бы распечатать содержимое моего имени пользователя (от сеанса вара)

как насчет?

Я думаю, что это не только для стойки. но может также применяться для обычного 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"/> 

Вам не нужен «получить» перед именем, как у вас в вашем примере. Кроме того, похоже, что ответ Умара является примером для Struts1. Вы используете Struts 2, правильно?

+1

Я только что попробовал, но над кодом показывает # session.user.name (буквально) внутри текстового поля. # session.user.name не оценивается ... похоже. – nacho4d

1

Просто еще одно примечание. Если вам нужно непосредственно получить доступ к Java-боб (и обойти сеанс), вы можете использовать следующий синтаксис:

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

<s:textfield value="%{#session.user.name}"/> работал для меня.

Смежные вопросы