У меня есть веб-приложение, в котором пользователи могут быть отправлены непосредственно на определенные страницы (например, страницу, где он может просматривать или редактировать элемент). Для этого мы предоставляем определенный URL-адрес. Эти URL-адреса расположены вне текущего веб-приложения (т.е. Могут присутствовать в другом веб-приложении или в электронном письме).
URL-адрес выглядит как http://myserver/my-app/forward.jsf?action=XXX¶m=YYY
, где:
- действие представляет страницу, на которой пользователь будет перенаправлен. Вы можете рассматривать это как
from-outcome
любого действия JSF вnavigation-case
вfaces-config.xml
. - actionParam - это параметр для предыдущего действия (обычно идентификатор элемента)
Так, например, у меня могут быть такие URL-адреса:
-
http://myserver/my-app/forward.jsf?action=viewItem&actionParam=1234
-
http://myserver/my-app/forward.jsf?action=editItem&actionParam=1234
Конечно, у меня есть класс Java (bean), который будет проверять некоторые ограничения безопасности (т.е. разрешено ли пользователю видеть/редактировать соответствующий элемент?), а затем перенаправить пользователя на правильную страницу (например, edit.xhtml
, view.xhtml
или access-denied.xhtml
).
Текущая реализация
В настоящее время у нас есть базовый способ достижения вперед. Когда пользователь нажимает на ссылку, вызывается следующая страница XHTML:
<html>
<body id="forwardForm">
<h:inputHidden id="myAction" binding="#{forwardBean.hiddenAction}"/>
<h:inputHidden id="myParam" binding="#{forwardBean.hiddenActionParam}"/>
<h:commandButton id="forwardBtn" actionListener="#{forwardBean.doForward}" style="display: none;"/>
</body>
<script type="text/javascript">
document.getElementById('forwardForm:forwardBtn').click();
</script>
</html>
Как вы можете видеть, я связываю два компонента <h:inputHidden>
в моей Java bean. Они будут использоваться для хранения значения параметра action
и actionParam
запроса (с помощью FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("actiontParam");
). Я также предоставляю метод doForward
, который будет вызываться сразу при визуализации страницы, которая перенаправляет (снова) пользователя на настоящую страницу. Метод:
public void doForward(ActionEvent evt) {
FacesContext facesContext = FacesContext.getCurrentInstance();
String redirect = // define the navigation rule that must be used in order to redirect the user to the adequate page...
NavigationHandler myNav = facesContext.getApplication().getNavigationHandler();
myNav.handleNavigation(facesContext, null, redirect);
}
Это решение работает, но у меня есть две проблемы:
- Мне не нравится способ его реализации. Я уверен, что у меня может быть что-то более простое (с помощью Servlet?).
- Это решение использует Javascript, и я не должен использовать Javascript (так как этот форвард может использоваться старыми пользователями Blackberry, где Javascript не поддерживается).
Итак, мой вопрос: как реорганизовать эту функцию перенаправления/пересылки?
Техническая информация
Java 1.6, JSF 1.2, Facelets, Richfaces