Установить свойство bean со страницы JSF

Мне нужно сделать очень простую вещь - передать текущий URL-адрес со страницы JSF (2.0) на управляемый компонент. Это необходимо для получения URL-адреса формы входа, которая будет перенаправлять пользователя обратно на текущую страницу после входа в систему. (Я использую GAE, а bean-компонент является оболочкой его пользовательского сервиса, если это имеет значение). Любой очевидный способ, который я пробовал, не работает
<c:set /> - не работает (без каких-либо сообщений об ошибках или предупреждениях)
геттер, который принимает текущий URL в качестве параметра - не работает.
Так много вопросов и много рецептов, но все сложные и не изящные. Почему? Может я (как и другие спрашивающие) упустил ключевой принцип проектирования? Я буду признателен за любой ответ - простой и понятный рецепт или объяснение, почему этого не нужно делать.


person Max Doronin    schedule 13.08.2010    source источник


Ответы (1)


Он доступен по адресу #{request.requestURL} (или, если вам нужен только путь относительно домена, используйте #{request.requestURI}). Используйте f:param для перехода и @ManagedProperty для его обработки.

<h:commandButton action="#{bean.submit}" value="submit">
    <f:param name="url" value="#{request.requestURL}" />
</h:commandButton>

с участием

@ManagedProperty("#{param.url}")
private String url;

Следует отметить, что f:param внутри h:commandButton не работает в JSF 1.x. Вы хотели бы использовать h:commandLink вместо этого.


Обновить в соответствии с комментариями: я понял, что вы хотели "передать текущий URL-адрес управляемому компоненту". Но на самом деле вы хотите «получить доступ к текущему URL-адресу в управляемом компоненте».

В этом случае либо замените #{param.url} на #{request.requestURL}:

@ManagedProperty("#{request.requestURL}")
private String url;

Или получить необработанный HttpServletRequest из-под капота JSF ExternalContext#getRequest():

HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
String requestURL = request.getRequestURL();
person BalusC    schedule 13.08.2010
comment
Да, я понимаю, что это сработает, когда пользователь нажмет кнопку отправки. Но могу ли я установить какое-либо свойство компонента без какого-либо взаимодействия с пользователем? Мне нужно инициализировать свойство bean-компонента с конкретным requestURI сразу после получения HTTP-запроса GET и иметь возможность получить другое свойство, которое зависит от requestURI ниже на странице. Является ли это возможным? - person Max Doronin; 13.08.2010
comment
Да, это была моя вина, извините за двусмысленный вопрос. Теперь оба варианта работают, делаю именно то, что мне нужно! Спасибо BalusC! - person Max Doronin; 14.08.2010
comment
@Odelya: только когда область действия свойства короче области действия bean-компонента. В этом конкретном примере свойство ограничено запросом, тогда bean-компонент должен быть ограничен запросом, он не может иметь более широкую область действия, чем это. - person BalusC; 15.08.2010