4

我正在使用 JSF,并且我有一个支持 bean 方法,它进行一些处理并设置一个变量“结果”,然后根据 faces-config.xml 导航规则决定要导航到的下一页。

我想要做的是在导航到下一页时将参数添加到 URL(在支持 bean 中?)。但是,在支持 bean 方法所在的 Handler 中,没有对 HttpRequest 对象的引用。这是一个已经存在很长时间的现有处理程序,所以我想知道我该怎么做

request.setAttribute("name", value);

JSF 有不同的方法吗?非常感谢任何帮助。


嗨,BalusC,

我正在尝试实现您在下面解释的内容,但是我遇到了问题。这就是我所拥有的:

StringBuffer url = ( (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getRequestURL();
    url.append( "?serialNumber=");
    url.append(regBean.getSerialNumber());
try{                     FacesContext.getCurrentInstance().getExternalContext().redirect(url.toString());
}catch (Exception ex){
    ex.printStackTrace();
}

没有生成异常,但是我收到 500 Http 错误“服务器遇到未知错误”。日志显示了更多细节,但不足以提供帮助:

错误 [生命周期] JSF1054:(阶段 ID:INVOKE_APPLICATION 5,查看 ID:/registration/productValidation.jsp)阶段执行期间抛出异常:javax.faces.event.PhaseEvent[source=com.sun.faces.lifecycle.LifecycleImpl@591dae ] 11:19:12,186 错误 [[Faces Servlet]] Servlet.service() for servlet Faces Servlet 在 org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435) 在 com 处抛出异常 java.lang.IllegalStateException .sun.faces.context.ExternalContextImpl.redirect(ExternalContextImpl.java:421) 在 com.sun.faces.application.NavigationHandlerImpl.handleNavigation(NavigationHandlerImpl.java:181) 在 com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl .java:130) 在 javax.faces.component.UICommand.broadcast(UICommand.java:387) 在 org.ajax4jsf.component。AjaxViewRoot.processEvents(AjaxViewRoot.java:321) 在 org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296) 在 org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253) 在 org.ajax4jsf.component .AjaxViewRoot.processApplication(AjaxViewRoot.java:466) 在 com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82) 在 com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)82) 在 com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)82) 在 com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)

任何想法都将不胜感激。谢谢!


好的,感谢您的评论,我改变了一些东西,现在我有了:

FacesContext.getCurrentInstance().getExternalContext().redirect("mypage.jsp?serialNumber=555555");

调试后,我可以看到重定向正在工作,因为在 mypage.htm 上,我正在显示资源包(属性文件)中的一些标头,因此当它试图显示标头时,它在下面的行中遇到了 NullPointer:

FacesContext context = FacesContext.getCurrentInstance();

context 为空,所以日志显示 NullPointer 错误但页面的 url 是正确的我可以看到地址栏显示 http://..../mypage.jsp?serialNum=5555 正如预期的那样!似乎仅显示页面内容时遇到了麻烦。这么近,这么远;-(

4

2 回答 2

5

您需要ExternalContext#redirect()自己在 bean 操作方法中触发。

public void submit() {
    String url = "page.jsp?name1=value1&name2=value2";
    FacesContext.getCurrentInstance().getExternalContext().redirect(url);
}

如果您的 IDE 验证器对void操作方法感到不安,那么您可以忽略它或将其声明回String并放在return null;方法块的末尾。

如果您想在后续请求中将特定参数设置回某个 bean 中,则可以通过 和 将它们设置为 faces-config.xml 中的托管#{param.name1}属性#{param.name2}

也就是说,请求属性不应与请求参数混淆。请求属性仅附加到服务器端的当前请求。它们绝不会传递给下一个请求。在那里,您可以使用请求参数,您可以将其附加到重定向 URL 或作为隐藏参数包含在响应页面的 POST 表单中。

此外,知道您可以HttpServletRequest通过ExternalContext#getRequest(). 但是,您应该尽量避免将“原始”Servlet API 从 JSF 引擎盖下拖走。尽可能多地使用 JSF 提供的设施。

于 2009-12-31T20:04:08.943 回答
1

view-paramJSF 2 通过元素将参数添加到导航处理程序。从规范:

如果找到了匹配<navigation-case>元素,并且<redirect/>在 this 中指定了该元素,则在ViewHandler 上调用<navigation-case>getRedirectURL ()传递当前FacesContext、 、在element 内的元素中指定的任何name=value参数对以及包含的值-如果存在,则元素的 view-params 属性,如果不存在,则为 false。此方法的返回值是要发送到将发生重定向的客户端的值。在当前FacesContext上调用getFlash().setRedirect(true)。使当前响应执行到此路径的 HTTP 重定向,并调用<to-view-id><view-param><redirect />当前请求的FacesContext实例上的responseComplete() 。如果的内容<to-view-id>是一个值表达式,首先对其求值以获得视图id的值。

于 2010-01-01T18:37:37.850 回答