2009-05-25 4 views
3

Я хотел бы знать, как я могу прочитать значение входного текста из управляемого компонента. Я знаю, что можно прочесть этот путь, и это очень сложно.JSF inputText и сеансы в управляемом bean-компоненте jsf

<h:inputText id="username" value="#{mylogin.username}" required="true" /> 

Но что, если позволяет сказать, что у меня есть значение как

<h:inputText id="username" value="some_value" required="true" /> 

И я хочу, чтобы прочитать это «some_value» в моем управляемом компоненте. Возможно ли это?

Другой вопрос - можно ли получить доступ к переменным сеанса в управляемом компоненте или мне как-то передать их туда?

+0

Во второй части вашего вопроса вы говорите о сеансе сервлетов или управляемых компонентах с сеансом? – harto

+0

О сеансах сервлетов. – Dmitris

ответ

2

В последнем случае, что some_value не управляется бобами, ИМХО. Тем не менее, вы можете это прочитать. Сделайте что-то вроде этого,

FacesContext ctx = FacesContext.getCurrentInstance(); 
HttpServletRequest request = 
     (HttpServletRequest)ctx.getExternalContext().getRequest(); 
request.getParameter("username"); 

Аналогичным образом, в отношении доступа к переменной сеанса,

FacesContext ctx = FacesContext.getCurrentInstance(); 
HttpServletRequest request = 
     (HttpServletRequest)ctx.getExternalContext().getSession(false); 
+1

Имя параметра может не быть «именем пользователя» (см. Мой ответ); Кроме того, вы можете избежать приведения в API сервлета, если хотите. – McDowell

+0

Мне очень нравится этот путь, поскольку он не связывает бобы с JSF. – Dmitris

2

Распространенный способ чтения компонента значение, чтобы создать привязку к компоненту в управляемом-боба, и читать значение от него.

Например:

<h:inputText id="username" value="some_value" required="true" 
    binding="#{mylogin.usernameField}" /> 

Затем в управляемом-бобе:

private UIInput usernameField; 

public void setUsernameField(UIInput usernameField) { 
    this.usernameField = usernameField; 
} 
public UIInput getUsernameField() { 
    return usernameField; 
} 

Наконец, чтобы получить доступ к значению поля:

Object value = usernameField.getValue(); 
+0

Это будет связывание компонентов. Нехорошо, ИМХО. Вот почему я не упоминал об этом. Но да, путь. Фактически в этом случае вы теряете простоту POJO и полностью связываете свой компонент с JSF. –

+0

Конечно - это не практично, если вы не хотите делать что-то еще с компонентом. Лучший способ сделать это хорошо известен - просто используйте выражение привязки значения. – harto

3
<h:inputText id="username" value="#{mylogin.username}" required="true" /> 

Это было бы лучший способ, на мой взгляд. Есть ли причина, по которой вы хотели бы избежать этого? Вы можете, как harto suggests, использовать привязку компонента, но (как указывает Уксус) вы ничего не получаете от этого подхода.

<h:inputText id="username" value="some_value" required="true" /> 

Если вы хотите прочитать приведенное выше значение, его можно прочитать непосредственно из параметров запроса. ExternalContext инкапсулирует лежащую в основе контейнера API и могут быть доступны в управляемом компоненте, как так:

FacesContext facesContext = FacesContext 
    .getCurrentInstance(); 
ExternalContext extContext = facesContext 
    .getExternalContext(); 
Map<String, String> params = extContext 
    .getRequestParameterMap(); 

Но, кроме нарушения контракта модель-представление-ведущий, вы можете столкнуться с некоторыми практическими проблемами. Параметр может не быть «именем пользователя», но может быть что-то вроде «j & # x005f; id & # x005f; jsp & # x005f; 115874224 & # x005f; 691: имя пользователя", в зависимости от того, сделаете ли вы компонент каким-либо из NamingContainer s (например, UIForm - см. prependId attribute), или если вид имеет пространство имен. Жесткое кодирование этого значения в любом месте, вероятно, является плохим. Вы можете прочитать о взаимосвязи между идентификаторами компонентов JSF и отображаемыми HTML-идентификаторами here. Если вы хотите использовать UIComponent.getClientId для генерации ключа, вы вернетесь к связыванию компонентов, потому что вам нужно получить ссылку на компонент.

Другой вопрос - можно ли получить доступ к переменным сеанса в управляемом компоненте ..?

См. ExternalContext.getSessionMap.

+0

Большое спасибо за то, что нашли время и объяснили мне вещи. Я очень ценю это. Причина, по которой я спросил, заключается в том, что JSF - это первая java-инфраструктура, которую я изучаю, и мне она очень нравится. Вопрос был для цели образования (до этого я старался к добру, но не нашел никакого хорошего объяснения), в приложении reall я не буду использовать его так, но я хотел знать, как это можно сделать. – Dmitris

+0

Ах, я совсем забыл об именовании. Спасибо за указание. Дальнейшая работа с картами - лучшая идея. +1 –

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