У меня есть веб-приложение, в котором пользователи могут быть отправлены непосредственно на определенные страницы (например, страницу, где он может просматривать или редактировать элемент). Для этого мы предоставляем определенный URL-адрес. Эти URL-адреса расположены за пределами текущего веб-приложения (то есть они могут присутствовать в другом веб-приложении или в электронном письме).Как сделать перенаправление в JSF
URL-адрес выглядит http://myserver/my-app/forward.jsf?action=XXX¶m=YYY
, где:
- действие представляет страницу, на которой пользователь будет перенаправлен. Вы можете рассматривать это как
from-outcome
любого действия JSF вnavigation-case
вfaces-config.xml
. - actionParam является параметром для предыдущего действия (как правило, элемент ID)
Так, например, я могу иметь такого рода URLs:
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-бин. Они будут использоваться для хранения значения параметра 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
Я не уверен, является ли это лучше делать или нет, но вы даете пользователю ссылку на кнопку и с помощью промежуточного XHTML и делает JavaScript клик, но почему вы не указываете его на сервлет, и оттуда вы можете справиться с этим сценарием, я имею в виду вместо промежуточного xhtml, почему бы не использовать сервлет. Я не думаю, что его плохо добавить наш собственный сервлет в jsf env –
@org: Это, безусловно, можно сделать без сервлетов. Использование сервлета только добавит дополнительную головную боль обслуживания, потому что у нее нет мгновенного доступа к случаям навигации. – BalusC
@BalusC Спасибо, я хочу знать, как? , Можно ли напрямую использовать скрипты jsp на xhtml? –