当前位置: 首页 > 知识库问答 >
问题:

JSF:只能使用带有ajax commandlink的sessionscoped视图

上官景铄
2023-03-14

问题:如果我使用的是SessionScoped bean,代码可以工作,但如果我使用的是ViewScoped bean则不可以。我将System.out.println()添加到代码中,以查看发生了什么。如果我将bean设置为SessionScoped,那么一切都按计划工作。inputText值通过set方法设置,processOrder()方法将“OrderName”字符串添加到“Orders”列表中,并重新呈现DataTable以显示添加的名称。...

对于视域bean,“ordername”值被设置为InputText组件的值,但在ProcessOrder()方法中为“null”,将“null”添加到“orders”列表中,并且DataTable除了null之外没有任何可显示的内容。

如果在添加“orderName”之前,我在processOrder()中手动添加orderName,Orders.add(“some name”),那么“Orders”将保存{“some order”,“null”},并且对Orders的更改仍然不会用Ajax重新呈现。

使用SessionScoped bean而不是使用ViewScoped bean都能很好地工作?我也用CommandLink而不是ActionListener尝试了一个Action属性,同样的故事…适用于SessionScoped,但不适用于ViewScoped。

我在这里只能想到两件事,1)我在AJAX和CommandLink如何协同工作以及ViewScoped如何工作方面缺少了一个关键点(很有可能);或者2)出于某种原因,我如何用CommandLink提交AJAX调用它每次单击时都会刷新页面,从而抹去“Orders”列表的先前值。然而,这仍然不能解释为什么如果我手动在列表中输入订单,它仍然不是用ViewScoped bean在AJAX请求中呈现,而是用SessionScoped bean呈现。

救命啊!!??

下面是我的代码:

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

@Named(value = "testBean")
@ViewScoped
public class DataTableTest implements Serializable {

  private String orderName;
  private List<String> orders = new ArrayList<String>();

  public DataTableTest () {}

  public String getOrderName() {
    return orderName;
  }

  public void setOrderName(String orderName) {
    this.orderName = orderName;
    System.out.println(orderName + " in setOrderName");
  }

  public List<String> getOrders() {
    return orders;
  }

  public String processDataTable(ActionEvent event) {
    System.out.println(orderName + " before getting added to orders list in     processDataTable");
    orders.add(orderName);      // adds the orderName to the orders list, so it can be     viewed in the DataTable
    orderName = null;           // nulling variable so it displays BLANK once again on      the form

    // Loops through and displays order names in the orders list
    for (String name : orders) {
      System.out.println(name + " in orders List");
    }
    return null;
  }
}

下面是我的jsf页面:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">

  <h:head>
    <title>Test</title>
  </h:head>
  <h:body>
    <h:form>
      <h:panelGrid columns="3">
        <h:outputText value="Enter Order Name >>" />
        <h:inputText id="orderName" value="#{testBean.orderName}" label="#    {testBean.orderName}" />
        <h:message for="orderName" />
      </h:panelGrid>
      <h:commandLink value="Enter Order" actionListener="#{testBean.processDataTable}">
        <f:ajax execute="orderName dataTable" render="orderName dataTable" />
      </h:commandLink>
      <h:dataTable id="dataTable" value="#{testBean.orders}" var="order">
        <f:facet name="header">Orders Entered Shown Below: </f:facet>
        <h:column>
          <h:outputText value="#{order}" />
        </h:column>
      </h:dataTable>
    </h:form>
  </h:body>
</html>

共有1个答案

臧梓
2023-03-14

您使用的是CDI-Bean,但是您使用的@viewscoped-注释是特定于JSF的,在CDI-Bean中不起作用。

您可以使用JSF-managedBean

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean(name="testBean")
@ViewScoped
public class DataTableTest implements Serializable { .. }

如果您不能选择更改为managedBean,那么可以查看特定于CDI的@ConversationScope或Seam,其中有一个@ViewScoped注释,它也可以很好地与CDI-Beans一起使用。

 类似资料:
  • 我正在尝试让Spring Boot与JSF一起工作。FacesServlet被初始化,网站用PrimeFaces正确呈现。但是在我调用JSF或Spring-Bean时,没有显示任何内容。 我知道这个问题被问了很多次,但都没有解决我的问题。经过几个小时的搜索,我还是没有找到工作。我是不是漏掉了什么? 设置: null null jsfbean.java SpringBean.java index.x

  • 问题内容: 我目前正在实现一个小型Spring MVC PoC,并且我想使用JSF作为视图技术,因为我公司中的大多数人都习惯于带有Primefaces环境的J2EE。 Spring MVC 3是否支持JSF或仅支持JSP?我读过多篇文章,将两者混为一谈。 我需要创建一个吸引人的UI。使用Spring MVC和JSP作为视图技术,是否有一种简单的方法? 我们的应用程序在多个页面中使用时间表/日历。这

  • 我正在使用带有PRG模式的JSF。(在我的导航规则中使用)。 问题是,当我收到验证错误(例如:用户未设置强制值)时,重定向没有完成(即,一篇文章后面跟着同一页的get)。 情况是: > 用户没有输入强制值并提交表单 发生验证错误,同一视图显示错误消息(无PRG) 用户设置强制值并提交== 用户点击后退按钮= 谁能帮帮我吗? 提前感谢。 斯特凡

  • 主要内容:映射Faces ServletFacelets视图是页面。 您可以通过向页面添加组件来创建网页或视图,将组件连接到后端的值和属性,并在组件上注册转换器,验证器或侦听器。 网页作为前端。 您的应用程序的第一页默认为。 网页(如,在中)的第一部分声明页面的内容类型,即XHTML: 一个完整的文件:index.xhtml 代码内容如下所示 - Facelets HTML标签以开头,用于在网页和核心标签上添加组件用于验证用户输入。 标

  • 我在bitbucket上有一个私有的存储库,其中有一些python代码,是我用git从命令行提取的。然后我将该项目导入Pycharm 2016.3。从命令行我可以推拉,但Pycharm中的git似乎不起作用。我会遇到以下错误:我正在使用ssh身份验证,并且我已将我的.ssh/config设置为使用正确的私钥解析Bitbucket.org。我还将Pycharm配置为使用本机ssh,而不是内置ssh。

  • 我现在的目标是创建一个网格,这将是我的游戏的基础。当玩家从菜单开始游戏时,这个网格应该出现在游戏场景上。稍后,我希望能够根据用户输入更改电路板的大小 1.在eventhandler中创建网格 我的推理是当玩家点击启动游戏的“SinglePlayer”按钮时创建网格。根据这个推理,我将简单地获取根节点(一个组)的子节点,并将gridpane添加到其中 为什么我被困住了 下面的代码段显示处理on bu