JSF添加查询参数

时间:2009-12-31 17:09:46

标签: jsf query-parameters

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

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

request.setAttribute("name", value);

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


HI 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 ERROR [[Faces Servlet]] servlet的Servlet.service()Faces Servlet抛出异常   java.lang.IllegalStateException       在org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435)       at com.sun.faces.context.ExternalContextImpl.redirect(ExternalContextImpl.java:421)       at com.sun.faces.application.NavigationHandlerImpl.handleNavigation(NavigationHandlerImpl.java:181)       at 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)       at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)       在com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)

任何想法都将非常感激。谢谢!


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

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

调试后我可以看到重定向正在mypage.htm上工作我正在显示来自resourcebundle(属性文件)的一些头文件,所以当它试图获得要显示的头时,它在下面一行遇到NullPointer:

FacesContext context = FacesContext.getCurrentInstance();

context为null,因此日志显示NullPointer错误,但页面的url是正确的我可以看到显示http://..../mypage.jsp?serialNum=5555的地址栏正如预期的那样! 它似乎只是显示页面的内容有困难。到目前为止如此接近; - (

2 个答案:

答案 0 :(得分:5)

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

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}的托管属性。

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

此外,了解您可以通过ExternalContext#getRequest()获取JSF中HttpServletRequest的句柄可能很有用。但是,您应该尽量避免在JSF引擎盖下运行“原始”Servlet API。尽可能多地使用JSF提供的设施。

答案 1 :(得分:1)

JSF 2通过view-param元素向导航处理程序添加了参数。来自规范:

  

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