让我们剖析几个简单的用例,并查看视图参数的工作原理(视图参数名称不是强制性的,以匹配通过URL查询字符串传递的请求参数,但在本文中,我们将重点讨论这种情况):

情况1

index.xhtml页面中,我们有:

<f:metadata><f:viewParam name="playernameparam" value="#{playersBean.playerName}"/>           <f:viewParam name="playersurnameparam" value="#{playersBean.playerSurname}"/>
</f:metadata>
...
<h:form>Enter name:<h:inputText value="#{playersBean.playerName}"/>Enter surname:<h:inputText value="#{playersBean.playerSurname}"/><h:commandButton value="Send" action="results?faces-redirect=true&includeViewParams=true"/>
</h:form>

results.xhtml页面中,我们有:

<f:metadata><f:viewParam name="playernameparam" value="#{playersBean.playerName}"/>           <f:viewParam name="playersurnameparam" value="#{playersBean.playerSurname}"/>
</f:metadata>You requested name: <h:outputText value="#{playersBean.playerName}"/><br/>
You requested surname: <h:outputText value="#{playersBean.playerSurname}"/>

PlayersBean我们有:

@Named
@RequestScoped
public class PlayersBean {private String playerName;private String playerSurname;...
}

当应用程序进入时发生了什么(设置查询字符串的方式并不重要;您可以手动进行操作,也可以通过 与 这里) index.xhtml?playernameparam=rafael&playersurnameparam=nadal吗?

  1. 请求参数名称与视图参数的名称匹配,因此视图参数采用请求参数的值,最后将它们存储在PlayersBean管Bean中的playerNameplayerSurname字段下。 因此,粗略地说,您可以通过视图参数设置托管bean字段。
  2. 视图将被渲染(生成HTML标记并将其发送到浏览器),因此您可以在文本输入中看到rafaelnadal ,因为它们是从托管Bean属性(即#{playersBean.playerName}#{playersBean.playerSurname} )。
  3. 您(作为用户)可以在文本输入中手动修改这些值(文本)(或像这样保留它们)。 现在,当您单击
    发送按钮,您实际上提交了具有当前值的表单(由<h:form>分隔的部分
    </h:form> )。 因此,将提交名称和姓氏,并覆盖/初始化数据模型中的当前值(即使您没有修改它们)。 在对视图进行编码(渲染)期间,JSF还将针对PlayersBean托管bean对视图参数进行编码。
  4. 此外,JSF注意到您想要在导航到下一个目标页面( results.xhtml )之前附加视图参数(将其信号告知: ?faces-redirect=true&amp;includeViewParams=true )。 在此请求的前面,已经根据PlayersBean托管bean评估了视图参数。 因此,JSF处理视图参数,并将根据视图参数名称和值计算出的相应查询字符串附加到操作URL。
  5. JSF导航到目标URL(现在包含查询字符串)。 这是可见的,多亏了faces-redirect=true

案例2

index.xhtml页面中,我们有:

<f:metadata><f:viewParam name="playernameparam" value="#{playersBean.playerName}"/>           <f:viewParam name="playersurnameparam" value="#{playersBean.playerSurname}"/>
</f:metadata><h:form>Enter name:<h:inputText value="#{playersBean.playerName}"/>Enter surname:<h:inputText value="#{playersBean.playerSurname}"/><h:commandButton value="Send" action="results?faces-redirect=true&includeViewParams=true"/>
</h:form>

results.xhtml页面中,我们有:

<f:metadata><f:viewParam name="playernameparam" value="#{playersBean.playerName}"/>           <f:viewParam name="playersurnameparam" value="#{playersBean.playerSurname}"/>
</f:metadata>You requested name: <h:outputText value="#{playersBean.playerName}"/><br/>
You requested surname: <h:outputText value="#{playersBean.playerSurname}"/>

PlayersBean我们有:

@Named
@RequestScoped
public class PlayersBean {private String playerName = "roger";private String playerSurname = "federer";...
}

当应用程序到达index.xhtml时会发生什么? (无查询字符串)

  1. 没有查询字符串(没有请求参数)。 因此,无法从查询字符串初始化视图参数,并且它们在PlayersBean也未设置任何内容!
  2. 呈现视图(生成HTML标记并将其发送到浏览器),并且文本输入反映了
    roger和federer initalization数据(这些是评估#{playersBean.playerName}#{playersBean.playerSurname} )。
  3. 您(作为用户)可以在文本输入中(或不可以!)修改这些值。 现在,当您单击“ Send按钮时,您实际上提交了表单(属于由<h:form>界定的部分的数据
    </h:form> )。 因此,将提交名称和姓氏,并覆盖/初始化模型中的当前值(即使您没有修改它们)。 在对视图进行编码(渲染)期间,JSF还将针对PlayersBean托管bean对视图参数进行编码。
  4. 此外,JSF注意到您想要在导航到下一个目标页面( results.xhtml )之前附加视图参数(将其信号告知: ?faces-redirect=true&amp;includeViewParams=true )。 在此请求的前面,已经根据PlayersBean托管bean评估了视图参数。 因此,JSF处理视图参数,并将根据视图参数名称和值计算出的相应查询字符串附加到操作URL。
  5. JSF导航到目标URL(现在包含查询字符串)。 这是可见的,多亏了faces-redirect=true

案例3

index.xhtml页面中,我们有:

<f:metadata><f:viewParam name="playernameparam" value="#{playersBean.playerName}"/>           <f:viewParam name="playersurnameparam" value="#{playersBean.playerSurname}"/>
</f:metadata><h:link value="Send" outcome="results" includeViewParams="true"/>

results.xhtml页面中,我们有:

<f:metadata><f:viewParam name="playernameparam" value="#{playersBean.playerName}"/>           <f:viewParam name="playersurnameparam" value="#{playersBean.playerSurname}"/>
</f:metadata>You requested name: <h:outputText value="#{playersBean.playerName}"/><br/>
You requested surname: <h:outputText value="#{playersBean.playerSurname}"/>

PlayersBean我们有:

@Named
@RequestScoped
public class PlayersBean {private String playerName;private String playerSurname;...
}

当应用程序进入时发生了什么(设置查询字符串的方式并不重要;您可以手动进行操作,也可以通过 > 与 这里) index.xhtml?playernameparam=rafael&playersurnameparam=nadal吗?

  1. 请求参数的名称与视图参数的名称匹配,因此视图参数采用请求参数的值,并将其存储在playerNameplayerSurname下的托管bean中。 因此,您可以通过视图参数设置托管bean字段。
  2. 视图将被渲染(生成HTML标记并将其发送到浏览器),因此在文本输入中,您可以看到rafaelnadal文本,因为它们是从托管Bean提取的(这些是对#{playersBean.playerName}#{playersBean.playerSurname} )。 在对视图进行编码(渲染)期间,JSF还将针对PlayersBean托管bean对视图参数进行编码。 现在,检查页面的源代码,并注意,与<h:link>相对应的<a href>是按如下方式生成的(注意,这是已fix ! )。 因此,JSF将<h:link>转换为<a href>并从初始请求开始附加包含视图参数的查询字符串。 includeViewParams="true"属性会导致以下链接:
  3. 当您单击链接时,您不会提交任何数据 <h:link>绝不能在 <h:form> )。 您只需执行上面的静态HTML代码,这就是一个简单的GET请求!
  4. JSF通过此GET(包含查询字符串)导航到目标URL。 不需要faces-redirect=true

案例4

index.xhtml页面中,我们有:

<f:metadata><f:viewParam name="playernameparam" value="#{playersBean.playerName}"/>           <f:viewParam name="playersurnameparam" value="#{playersBean.playerSurname}"/>
</f:metadata><h:link value="Send" outcome="results" includeViewParams="true"/>

results.xhtml页面中,我们有:

<f:metadata><f:viewParam name="playernameparam" value="#{playersBean.playerName}"/>           <f:viewParam name="playersurnameparam" value="#{playersBean.playerSurname}"/>
</f:metadata>You requested name: <h:outputText value="#{playersBean.playerName}"/><br/>
You requested surname: <h:outputText value="#{playersBean.playerSurname}"/>

PlayersBean我们有:

@Named
@RequestScoped
public class PlayersBean {private String playerName = "roger";private String playerSurname = "federer";...
}

当应用程序到达index.xhtml时会发生什么? (无查询字符串)

  1. 没有请求参数。 因此,无法从查询字符串初始化视图参数。 view参数在托管bean中也没有设置任何内容!
  2. 视图已呈现(生成了HTML标记并将其发送到浏览器),因此您可以在文本输入中看到roger和federer ,因为它们是从托管Bean提取的(这些是评估#{playersBean.playerName}#{playersBean.playerSurname} )。 在对视图进行编码(渲染)期间,JSF还将针对PlayersBean托管bean(获取rogerfederer )对视图参数进行编码。 现在,检查页面的源代码,并注意,与<h:link>相对应的<a href>是按如下方式生成的(注意,这是已fix ! )。 因此,JSF将<h:link>转换为<a href>并从初始请求开始附加包含视图参数的查询字符串。 includeViewParams="true"属性会导致以下链接:
  3. 单击链接时,您不会提交任何数据。 您只需执行上面的静态HTML代码,这就是一个简单的GET请求!
  4. JSF通过此GET(包含查询字符串)导航到目标URL。 不需要
    faces-redirect=true

案例5

index.xhtml页面中,我们有:

<f:metadata><f:viewParam name="playernameparam" value="#{playersBean.playerName}"/>           <f:viewParam name="playersurnameparam" value="#{playersBean.playerSurname}"/>
</f:metadata><h:link value="Send" outcome="results" includeViewParams="true"/>

results.xhtml页面中,我们有:

<f:metadata><f:viewParam name="playernameparam" value="#{playersBean.playerName}"/>           <f:viewParam name="playersurnameparam" value="#{playersBean.playerSurname}"/>
</f:metadata>You requested name: <h:outputText value="#{playersBean.playerName}"/><br/>
You requested surname: <h:outputText value="#{playersBean.playerSurname}"/>

PlayersBean我们有:

@Named
@RequestScoped
public class PlayersBean {private String playerName;     // this is nullprivate String playerSurname;  // this is null...
}

当应用程序到达index.xhtml时会发生什么? (无查询字符串)

  1. 没有请求参数。 因此,无法从查询字符串初始化视图参数。 view参数在bean中没有设置任何内容!
  2. 视图已呈现(生成了HTML标记并将其发送到浏览器),因此您无法在文本输入中看到任何内容,因为它们是从Bean中获取的(这些是#{playersBean.playerName}#{playersBean.playerSurname}均为null –您不能期望看到文本为null! )。 在对视图进行编码(渲染)期间,JSF还将针对PlayersBean托管bean(获得null )对视图参数进行编码。 现在,检查页面的源代码,并注意,与<h:link>相对应的<a href>是按如下方式生成的(注意,这是已fix ! )。 因此,JSF将<h:link>转换为<a href> ,但是没有包含视图参数的查询字符串,因为JSF看到了includeViewParams="true"属性,但是无法生成以下HTML:<a href =” /…/results.xhtml? playernameparam = null &amp; playersurnameparam = null “>发送</a>”因此,JSF将“忽略” null值,并且没有要附加的查询字符串:<a href=”/…/results.xhtml”>发送</a>
  3. 单击链接时,您不会提交任何数据。 您只需执行上面的静态HTML代码,这就是一个简单的GET请求!
  4. JSF通过此GET(包含查询字符串)导航到目标URL。 不需要faces-redirect = true。

案例6 –为了更好地理解

index.xhtml页面中,我们有:

<f:metadata><f:viewParam name="playernameparam" value="#{playersBean.playerName}"/>           <f:viewParam name="playersurnameparam" value="#{playersBean.playerSurname}"/>
</f:metadata><h:form>Enter name:<h:inputText value="#{playersBean.playerName}"/>Enter surname:<h:inputText value="#{playersBean.playerSurname}"/><h:commandButton value="Send" action="results?faces-redirect=true&includeViewParams=true"/>
</h:form>

results.xhtml页面中,我们有:

<f:metadata><f:viewParam name="playernameparam" value="#{playersBean.playerName}"/>           <f:viewParam name="playersurnameparam" value="#{playersBean.playerSurname}"/>
</f:metadata>You requested name: <h:outputText value="#{playersBean.playerName}"/><br/>
You requested surname: <h:outputText value="#{playersBean.playerSurname}"/>

PlayersBean我们有:

@Named
@RequestScoped
public class PlayersBean {private String playerName;     // this is nullprivate String playerSurname;  // this is null...
}

当应用程序到达index.xhtml时会发生什么? (无查询字符串)

  1. 没有请求参数。 因此,无法从查询字符串初始化视图参数。 view参数在bean中也没有设置任何内容!
  2. 渲染视图(生成HTML标记并将其发送到浏览器),您可以看到两个空文本输入(这些是评估#{playersBean.playerName}#{playersBean.playerSurname} )。 您不能期望看到文本,为空!
  3. 作为用户,请勿在这些文本输入中键入任何内容,然后按“ Send按钮。 实际上,您将提交表单(属于由<h:form> </h:form>界定的部分的数据)。 因此,将提交名称和姓氏(它们是空白),并覆盖/初始化模型中的当前值。 在对视图进行编码(渲染)期间,JSF还将对PlayersBean托管bean的视图参数进行编码(将获得空白)。
  4. 此外,JSF注意到您想要在导航到下一个目标页面( results.xhtml )之前附加视图参数(将其信号告知: ?faces-redirect=true&amp;includeViewParams=true )。 在此请求的前面,已经根据PlayersBean托管bean评估了视图参数。 因此,JSF处理视图参数,并将根据视图参数名称和值计算出的相应查询字符串附加到操作URL。
  5. JSF导航到目标URL(现在包含查询字符串)。 这是可见的,多亏了faces-redirect=true

http://localhost:8080/.../results.xhtml?playernameparam=&playersurnameparam=

注意playernameparamplayersurnameparam!的值playersurnameparam! 由于您已提交空白区域,因此您将看到。 当然,这看起来“丑陋”且毫无用处。 也许您更喜欢将空白视为null值。 为此,您可以在web.xml设置以下上下文参数:

<context-param><param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name><param-value>true</param-value>
</context-param>

现在,清理并构建应用程序,然后在相同的情况下再次运行它。 这次,当您按
发送按钮,您会注意到此链接:

  • http:// localhost:8080 / ch2_6 / faces / results.xhtml

因此,没有查询字符串反映了视图参数的存在! 好吧,您只是指示JSF将提交的空字符串视为null值。 但是,如您所知,附加了视图参数后,“ null值”将被“忽略”。

注意

附加视图参数的方式可以在Mojarra的com.sun.faces.application.view.MultiViewHandler看到。 特别是在:

// Mojarra 2.2.9, MultiViewHandler#addViewParameters()
protected void addViewParameters(FacesContext ctx,String viewId,Map<String,List<String>> existingParameters) {UIViewRoot currentRoot = ctx.getViewRoot();String currentViewId = currentRoot.getViewId();Collection<UIViewParameter> toViewParams = Collections.emptyList();Collection<UIViewParameter> currentViewParams;boolean currentIsSameAsNew = false;currentViewParams = ViewMetadata.getViewParameters(currentRoot);if (currentViewId.equals(viewId)) {currentIsSameAsNew = true;toViewParams = currentViewParams;} else {ViewDeclarationLanguage pdl = getViewDeclarationLanguage(ctx, viewId);ViewMetadata viewMetadata = pdl.getViewMetadata(ctx, viewId);if (null != viewMetadata) {UIViewRoot root = viewMetadata.createMetadataView(ctx);toViewParams = ViewMetadata.getViewParameters(root);}}if (toViewParams.isEmpty()) {return;}for (UIViewParameter viewParam : toViewParams) {String value = null;// don't bother looking at view parameter if it's been overriddenif (existingParameters.containsKey(viewParam.getName())) {continue;}if (paramHasValueExpression(viewParam)) {value = viewParam.getStringValueFromModel(ctx);}if (value == null) {if (currentIsSameAsNew) {value = viewParam.getStringValue(ctx);} else {value = getStringValueToTransfer(ctx, viewParam, currentViewParams);}}// SO, IF VALUE IS NULL, DON'T CONSIDER THIS A VIEW PARAMif (value != null) {List<String> existing = existingParameters.get(viewParam.getName());if (existing == null) {existing = new ArrayList<String>(4);existingParameters.put(viewParam.getName(), existing);}existing.add(value);}}
}

翻译自: https://www.javacodegeeks.com/2015/11/how-view-parameters-are-obtainedattached-fromto-the-url-query-string-examples.html

如何从URL查询字符串获得/附加视图参数(示例)?相关推荐

  1. 字符串url获取参数_如何从URL查询字符串获取示例参数或将其附加到URL查询字符串(示例)?...

    字符串url获取参数 让我们剖析几个简单的用例,并查看视图参数的工作原理(视图参数名称不是强制性的,以匹配通过URL查询字符串传递的请求参数,但在本文中,我们将重点讨论这种情况): 情况1 在inde ...

  2. Nodejs--querystring (URL 查询字符串)

    2019独角兽企业重金招聘Python工程师标准>>> querystring 模块提供了一些实用函数,用于解析与格式化 URL 查询字符串 querystring.parse(st ...

  3. php 字符串hash比较,分析两个 url 查询字符串和 hash 的区别

    分析两个 url 查询字符串和 hash 的区别<?php header("Content-type:text/html; charset=utf-8"); // 分析两个 ...

  4. NPM酷库:qs,解析URL查询字符串

    NPM酷库,每天两分钟,了解一个流行NPM库. Node.js 标准库中有一个库叫querystring,这个库用来处理URL查询字符串: const querystring = require('q ...

  5. java 字符码查询_Java URL查询字符串参数的编码

    URLEncoder应该是走的路.您只需要记住,只编码单个查询字符串参数名称和/或值,而不是整个URL,确保不要查询字符串参数分隔符字符&也不是参数名称 – 值分隔符字符=. String q ...

  6. 通过正则格式化url查询字符串

    看到项目里通过js数组split方法格式化查询字符串的,突发奇想为什么不能用正则呢,性能如何?于是便有了如下代码: var url='www.baidu.com?a=123&b=456& ...

  7. 如何从Amazon API Gateway将查询字符串或路由参数传递到AWS Lambda

    本文翻译自:How to pass a querystring or route parameter to AWS Lambda from Amazon API Gateway for instanc ...

  8. Laravel同时接收路由参数和查询字符串中的参数

    Laravel捕捉路由参数 Laravel允许在controller方法中捕捉路由里定义的参数,如下所示: 路由中定义参数: Route::get('post/{id}', 'PostControll ...

  9. 获取请求url的查询字符串

    在两个页面间通过url传参的时候,需要获取传递的查询字符串,例如获取下面url的name对应的值: www.baidu.com/img?name=lili&age=18&school= ...

最新文章

  1. 霍夫变换(Hough Transform):霍夫变化在图像处理以及点云处理中的直线检测应用
  2. web前段学习day_01:HTML(学习如何搭建页面结构和内容):文本标签、列表标签、图片标签、超链接、表格、表单表单、分区标签、实体引用
  3. java中商业数据计算时用到的类BigDecimal和DecimalFormat
  4. SAP OData Service group - get entity set
  5. Arcgis Server初学笔记(一)
  6. 《MySQL——join语句优化tips》
  7. Effective Java~37. 用EnumMap 代替序数索引
  8. 【BZOJ1834】【codevs1362】网络扩容,最大流+费用流
  9. IOS 深拷贝和浅拷贝应用
  10. 内联函数、默认参数和函数占位参数
  11. 飞思卡尔单片机KEA128之ADC学习
  12. 新版DAEMON Tools Lite打不开 bin 文件解决方法
  13. j2me之诺基亚S40模拟器
  14. ubuntu18.04 虚拟机重启后变成只读模式,怎么恢复?
  15. 11中常见的句法成分
  16. 青春-转自韩寒Sina Blog
  17. 千人虚拟社交体验,多人元宇宙场景真的可行么?
  18. Python实现飞机大战
  19. 物联网的那些事----------01无线通信技术介绍
  20. Mac系统如何运行Windows exe程序?mac打开exe文件方法教程

热门文章

  1. Spring 思维导图,让 Spring 不再难懂(cache篇)
  2. 负载均衡Ribbon和Feign---SpringCloud
  3. 2013蓝桥杯-B-省赛-七、错误票据
  4. IDEA无法加载log文件
  5. java快排原理_Java数据结构与算法——快速排序
  6. 进程与服务的签名_苹果app签名需要注意哪几点
  7. python cmd闪退_使用cmd python模块时,如何使程序正常崩溃?
  8. docker export_docker使用简介
  9. rabbitmq手动确认ack
  10. nginx-配置基于ip或域名的虚拟主机