在JSF表单提交上保留GET请求查询字符串参数

在JSF表单提交上保留GET请求查询字符串参数,第1张

概述我有3页: > main.xhtml > agreement.xhtml > generated.xhtml 协议X.html需要两个参数才能正确加载:serviceId和site。所以,普通网址如下所示:/app/agreement.xhtml?site=US\u0026amp;ser​​viceId=AABBCC。 我在协议X.html上有这个按钮 <h:form> <h:command 我有3页:

> main.xhtml
> agreement.xhtml
> generated.xhtml

协议X.HTML需要两个参数才能正确加载:serviceID和site。所以,普通网址如下所示:/app/agreement.xhtml?site=US\u0026amp;ser​​viceID=AABBCC。

我在协议X.HTML上有这个按钮

<h:form>   <h:commandbutton value="Generate license file" action="#{agreement.generateMethod}" />   </h:form>

@RequestScoped bean#{agreement}具有以下方法:

public String generateMethod(){    .......    return "generated";}

我需要,点击,generateMethod()方法被执行,完成之后,用户被重定向到generated.xhtml页面。发生的情况是,在点击时,页面浏览器将用户发送到/app/agreement.xhtml,因为它不发送参数站点和serviceID,所以它会崩溃。

我尝试使generateMethod()返回一个“generated?faces-redirect = true”,但是仍然没有。有任何想法吗?

解决方法 您的具体问题是由于JsF< h:form>默认提交到当前的请求URL,而没有任何查询字符串。仔细观察生成的HTML输出,你会看到
<form action="/app/agreement.xhtml" ...>

因此,您显然需要自己包含这些请求参数。有几种方法可以解决这个问题。如果您没有发送重定向,那么您可以将其添加为JsF表单的隐藏输入。

<h:form>    <input type="hIDden" name="site" value="#{param.site}" />    <input type="hIDden" name="site" value="#{param.serviceID}" />    ...</h:form>

只有这些参数不会重新显示在浏览器地址栏中的URL中。如果您只在同一页面上使用AJAX,这不是问题。 < h:inputHIDden>是不合适的,因为在表单上发生转换或验证错误时,它会混淆失去其价值。

为了让他们重新出现在网址中,您需要< f:vIEwParam>和includeVIEwParams。为了使includeVIEwParams工作,您需要在源页协议.xhtml中声明以下内容…

<f:Metadata>    <f:vIEwParam name="site" value="#{agreement.site}" />    <f:vIEwParam name="serviceID" value="#{agreement.serviceID}" /></f:Metadata>

…和目标页面generate.xhtml:

<f:Metadata>    <f:vIEwParam name="site" value="#{generated.site}" />    <f:vIEwParam name="serviceID" value="#{generated.serviceID}" /></f:Metadata>

现在您可以发送包含视图参数的重定向,如下所示:

public String generateMethod() {    // ...    return "generated?faces-redirect=true&includeVIEwParams=true";}

请注意,bean应该是@VIEwScoped,以便在打开页面与表单之间保留这些参数,并提交表单,还有验证错误。否则,当粘贴到@RequestScoped bean时,您应该将它们保留为< f:param>在命令组件中:

<h:commandbutton ...>    <f:param name="site" value="#{generated.site}" />    <f:param name="serviceID" value="#{generated.serviceID}" /></h:commandbutton>

没有办法为< f:AJAX>设置它们内部的输入组件,你的bean应该是真的@VIEwScoped。

或者,如果您碰巧使用JsF实用程序库OmniFaces,那么您也可以将< h:form>由< o:form>如下(另见showcase example):

<o:form includeRequestParams="true">

基本上都是这样这将生成< form action>包括当前查询字符串。

<form action="/app/agreement.xhtml?site=US&serviceID=AABBCC" ...>

那些请求参数只能在提交表单的请求参数图中可用。您不需要额外的元数据/视图参数,您也不需要发送重定向,如果需要,您的bean可以保留@RequestScoped。

public String generateMethod() {    // ...    return "generated";}

或者,如果您使用的是“漂亮的URL”库,例如prettyfaces或FacesVIEws,或者也可能是本地生成的内容,并打算提交与浏览器地址栏中显示的完全相同的URL,那么可以使用useRequestURI。

<o:form useRequestURI="true">

也可以看看:

> What can <f:metadata>,<f:viewParam> and <f:viewAction> be used for?
> How to navigate in JSF? How to make URL reflect current page (and not previous one)

总结

以上是内存溢出为你收集整理的在JSF表单提交上保留GET请求查询字符串参数全部内容,希望文章能够帮你解决在JSF表单提交上保留GET请求查询字符串参数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1112112.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存