标签: viewparams

什么可以使用<f:metadata>,<f:viewParam>和<f:viewAction>?

任何人都可以澄清我们如何在一般情况下使用,或者在现实世界中使用这个代码片段?

<f:metadata>
    <f:viewParam id="id" value="#{bean.id}" />
    <f:viewAction action="#{bean.init}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)

jsf jsf-2 viewparams viewaction

146
推荐指数
1
解决办法
12万
查看次数

ViewParam vs @ManagedProperty(value ="#{param.id}")

定义View Params之间有什么区别:

<f:metadata>
  <f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>
Run Code Online (Sandbox Code Playgroud)

并在ManagedBean中定义属性,如下所示:

@ManagedProperty(value = "#{param.id}")
private Integer id;
Run Code Online (Sandbox Code Playgroud)

jsf jsf-2 managed-bean viewparams managed-property

95
推荐指数
2
解决办法
5万
查看次数

使用includeViewParams的JSF2重定向允许用户输入解析为文本字段的EL表达式

我有一个定义视图参数的JSF2 XHTML页面,这允许一个具有可收藏的URL.XHTML页面包含以下参数:

<f:metadata>
  <f:viewParam name="searchName" value="#{nbsearchpage.searchName}" />
  <!-- More view parameters omitted here for brevity -->
  <f:event listener="#{nbsearchpage.searchPreRender}" type="javax.faces.event.PreRenderViewEvent" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)

在同一页面上,我有一个文本字段和一个允许用户更改searchName的按钮:

<h:form id="some-id">
  <h:inputText value="#{nbsearchpage.searchName}" />
  <h:commandButton value="search" action="#{nbsearchpage.search}" />
</h:form>
Run Code Online (Sandbox Code Playgroud)

最后,nbsearchpage bean中的action方法search()返回同一页面,但包括参数:

?faces-redirect=true&amp;includeViewParams=true
Run Code Online (Sandbox Code Playgroud)

它为用户提供了一个很好的URL.当用户在搜索字段中输入"IBM"时,URL将重定向到

?searchName=IBM 
Run Code Online (Sandbox Code Playgroud)

它非常好用.但现在用户可以在searchName文本字段中输入EL表达式,并评估EL表达式.例如,当用户在文本字段中输入"#{2 + 2}"时,URL将被重定向到

?searchName=4
Run Code Online (Sandbox Code Playgroud)

这就是我认为我们不应该做的事情,允许用户出于安全原因输入EL表达式.我正在使用Glassfish 3.1.1.

有任何想法如何防止这种自动EL解析?我认为JSF2中的视图参数概念存在一个根本性的缺陷并且具有重定向功能?我遇到了与重定向无法生存的视图范围相同的问题,为此我必须创建一个自己的范围.(我本可以使用闪存范围).

redirect el jsf-2 viewparams

13
推荐指数
1
解决办法
6618
查看次数

在post之后处理JSF中的视图参数

我有几个页面需要userId才能工作,因此以下代码:

userpage.xhtml

<!-- xmlns etc. omitted -->
<html>
<f:metadata>
    <f:viewParam name="userId" value="#{userPageController.userId}"/>
</f:metadata>
<f:view contentType="text/html">
<h:head>
</h:head>
<h:body>
    <h:form>
        <h:commandButton action="#{userPageController.doAction}" value="post"/>
    </h:form>
</h:body>
</f:view>
Run Code Online (Sandbox Code Playgroud)

userPageController.java

@Named
@ViewScoped
public class userPageControllerimplements Serializable {
    private static final long serialVersionUID = 1L;

    @Inject protected SessionController sessionController;
    @Inject private SecurityContext securityContext;
    @Inject protected UserDAO userDAO;

    protected User user;
    protected Long userId;

    public UserPage() {
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Long …
Run Code Online (Sandbox Code Playgroud)

jsf-2 viewparams

12
推荐指数
1
解决办法
1万
查看次数

JSF bean:设置ViewParam后调用@PostConstruct函数

我有一个product.xhtml和一个ProductBean.我使用/ product/{id}来访问产品,所以我在product.xhtml中有一个viewParam,其值为value = ProductBean.id.问题是在bean内部我使用带有PostConstruct注释的init函数来填充产品的细节.为此,我需要id来调用外部函数.我想虽然在viewParam设置bean的id之前调用了init,因此在init中我无法调用外部函数,因为id尚未设置.我做错了什么,如何解决这个问题?

UPDATE

我发现了什么问题.我认为viewParam方法适用于CDI bean,但ManagedProperty方法适用于JSF bean.

我现在还有另一个问题.我的CDI bean是RequestScoped,当渲染product.xhtml时,bean被创建,我猜想以后会被丢弃.有趣的是,我在该bean中有一个函数,当我调用时,我可以读取id(我认为这是因为连接到视图参数)而不是任何其他属性.任何想法如何解决这一问题?

postconstruct jsf-2 managed-bean viewparams

11
推荐指数
1
解决办法
9034
查看次数

includeViewParams = true将null模型值转换为查询字符串中的空字符串

给出<p:selectOneMenu>如下.

<f:metadata>
    <f:viewParam name="id" value="#{testManagedBean.id}" converter="javax.faces.Long"/>
</f:metadata>

<p:selectOneMenu value="#{localeBean.language}" onchange="changeLanguage();">
    <f:selectItem itemValue="en" itemLabel="English" />
    <f:selectItem itemValue="hi" itemLabel="Hindi" />
</p:selectOneMenu>

<p:remoteCommand action="#{testManagedBean.submitAction}"
                 name="changeLanguage"
                 process="@this"
                 update="@none"/>
Run Code Online (Sandbox Code Playgroud)

相应的托管bean:

@ManagedBean
@RequestScoped
public final class TestManagedBean {

    private Long id; //Getter and setter.

    public TestManagedBean() {}

    public String submitAction() {
        return FacesContext.getCurrentInstance().getViewRoot().getViewId() + "?faces-redirect=true&includeViewParams=true";
    }
}
Run Code Online (Sandbox Code Playgroud)

指示的参数<f:viewParam>是可选的.例如,使用URL访问页面,如下所示.

https://localhost:8181/Project-war/private_resources/Test.jsf

由于id是可选参数,<p:selectOneMenu>因此如果未按如下方式提供,则将空参数附加到URL(更改语言时).

https://localhost:8181/Project-war/private_resources/Test.jsf?id=

这不应该发生.如果未提供空参数,则不应附加空参数,并且URL应与第一个类似.

有没有办法防止空参数被传递到URL时没有传递?


这仅与<f:viewParam>- 指定的转换器相关联javax.faces.Long.

如果删除此转换器,则在未提供参数的情况下,参数不会附加到URL.

虽然完全没有必要指定转换器,但我有如下所示的转换器将id通过URL作为查询字符串参数传递给JPA实体.

@ManagedBean
@RequestScoped
public final class …
Run Code Online (Sandbox Code Playgroud)

jsf viewparams jsf-2.2

8
推荐指数
1
解决办法
1714
查看次数

使用GET提交JSF表单

如何将表单提交到同一页面并使用GET参数?

JSF页面内容:

<f:metadata>
    <f:viewParam name="item1" value="#{bean.item1}"/>
    <f:viewParam name="item2" value="#{bean.item2}"/>
</f:metadata>

...

<h:form>
  <h:inputText value="#{bean.item1}"/>
  <h:inputText value="#{bean.item2}"/>

  <h:button value="Submit" >
      <f:param name="item1" value="#{bean.item1}"/>
      <f:param name="item2" value="#{bean.item2}"/>
  </h:button>
</h:form>
Run Code Online (Sandbox Code Playgroud)

如果我请求页面:form.jsf?item1 = foo&item2 = bar,它将填充文本字段,但表单提交到自身似乎不起作用.

forms jsf http-get jsf-2 viewparams

7
推荐指数
1
解决办法
7040
查看次数

自动在URL中包含视图参数

我有简单的jsf页面与视图参数和加载方法,正在处理这些参数:

<f:metadata>
 <f:viewParam name="param1" value="#{bean.param1}"/>
 <f:viewParam name="param2" value="#{bean.param2}"/>
 <f:viewParam name="param3" value="#{bean.param3}"/>
 <f:event type="preRenderView" listener="#{bean.load()}"/>
</f:metadata>
Run Code Online (Sandbox Code Playgroud)

我还设置了一些初始值@PostConstruct.如何将用户重定向到包含这些参数(非空)的新位置.例如用户在浏览器中输入:

domain.com/page.jsf
Run Code Online (Sandbox Code Playgroud)

并被重定向到:

domain.com/page.jsf?param1=valueA
Run Code Online (Sandbox Code Playgroud)

因为param1已设置@PostConstruct.

另一个问题 - 我在页面上有链接引用相同的视图:

<h:link value="clickme">
 <f:param name="param3" value="otherValue"/>
</h:link>
Run Code Online (Sandbox Code Playgroud)

当用户进入页面?param1=someValue并点击链接时,被重定向到?param3=otherValue但我想重定向到?param1=someValue&param3=otherValue.我知道我可以添加更多的参数,<h:link>但是在每个参数中添加每个可能的参数都是困难的<h:link>

PS.我从这个主题JSF 2和Post/Redirect/Get使用BalusC提示

jsf post-redirect-get jsf-2 viewparams

7
推荐指数
1
解决办法
1万
查看次数

元数据组件需要嵌套在af:metadata标签中.建议:在<f:metadata>中包含必要的组件

我经历了不同的来源,如:

似乎问题已在jsf 2.2.1中得到修复,其中当我尝试使用时,我面临问题,下面是我的配置:

所引用:

<!DOCTYPE html>
<html lang="#{languageBean.language}"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
    xmlns:fn="http://xmlns.jcp.org/jsp/jstl/functions"
    xmlns:p="http://primefaces.org/ui" xmlns:o="http://omnifaces.org/ui"
    xmlns:of="http://omnifaces.org/functions">
<!-- Enables CTRL+SHIFT+D for activating Facelets debug window -->
<ui:debug />
<f:view locale="#{languageBean.language}" encoding="UTF-8" contentType="text/html">
<!-- Client templates can insert f:metadata here, and this will NOT show up in the showcase page source code -->
<ui:insert name="meta" />

<c:set var="contextPath" value="${pageContext.request.contextPath}"
    scope="application" />
<f:loadBundle var="messageResource" basename="MessageResource" />
<h:head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
    <meta http-equiv="X-UA-Compatible"
        content="EmulateIE8,IE=edge,chrome=1" />
    <meta http-equiv="pragma" content="no-cache" />
    <meta …
Run Code Online (Sandbox Code Playgroud)

jsf viewparams jsf-2.2

7
推荐指数
1
解决办法
3566
查看次数

<f:viewParam>的验证/转换错误不会本地化为<f:view locale>,而是默认语言环境

<f:viewParam>在JSF页面上有一个标记,它在转换和验证后将GET参数设置为相应的托管bean.

如果发生转换或验证错误,则从资源束中获取相应的错误消息并显示在<p:messages>(也可能是<p:growl><h:messages>)上.

该应用程序是多语言的.因此,当选择其他语言时,应以该语言显示消息,但它始终根据默认语言环境显示消息en(对于英语).

Test.xhtml:

<!DOCTYPE html>
<html lang="#{localeBean.language}"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">

    <f:view locale="#{localeBean.locale}">
        <f:metadata>
            <f:viewParam name="id" converter="#{myConverter}" />
        </f:metadata>
        <h:head>
            <title>Test</title>
        </h:head>
        <h:body>
            <h:messages />
        </h:body>
    </f:view>
</html>
Run Code Online (Sandbox Code Playgroud)

转换器:

@FacesConverter("myConverter")
public final class MyConverter implements Converter
{
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value)
    {
        ResourceBundle bundle = context.getApplication()
            .evaluateExpressionGet(context, "#{messages}", ResourceBundle.class);
        String message = bundle.getString("id.conversion.error");
        throw new ConverterException(
            new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null));
    }

    @Override
    public String getAsString(FacesContext …
Run Code Online (Sandbox Code Playgroud)

validation jsf localization jsf-2 viewparams

7
推荐指数
1
解决办法
670
查看次数