0

の値を更新しようとしh:dataTableていますが、1 つの POST で許可されている要求パラメーターの制限に達しました。それをファイアバグした後、テーブル全体が単一行の更新のために送信されていることがわかりました。h:formだけを囲むように を移動しようとしましたa4j:commandButtonが、これはプロパティ値を更新しません。を使用することを考えf:ajaxましたが、そこで言及されているのはすべて s の変更について述べていますManagedBean。それに関する問題は、バッキング クラスが標準の Java アプリケーションでも使用されることです。そのため、Java EE 固有のライブラリへの依存関係を追加せずに、クリーンな POJO として維持したいと考えています。

アップデート

@Luiggi Mendoza のリクエストに応じて、問題を 2 つの Java クラスと 1 つの xhtml を持つSSCCEに分解しました。

testDT.xhtml:

<!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:a4j="http://richfaces.org/a4j"
      xmlns:rich="http://richfaces.org/rich"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"> 

<h:head></h:head> 
<body>
    <rich:panel id="props">

      <h:form>
      <h:dataTable value="#{propertyEditor.properties}" var="prop">
        <h:column>
          <f:facet name="header">
            <h:outputText value="Value"/>
          </f:facet>
          <h:inputText value="#{prop.value}">
            <f:ajax/>
          </h:inputText>
        </h:column>
        <h:column>
          <a4j:commandButton
              value="Update Property"
              action="#{propertyEditor.updateProperty(prop.id)}"
              render="props"
              execute="@this"/>
        </h:column>
      </h:dataTable>
    </h:form>
    </rich:panel>
</body> 
</html>

PropertyEditor.java

package com.test;

import java.io.Serializable;
import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

@Named
@SessionScoped
public class PropertyEditor implements Serializable
{

  private ArrayList<Property> properties = new ArrayList<Property>();

  public PropertyEditor() {}

  @PostConstruct
  private void initProperties() {
    for (int i = 0; i < 510; i++) {
      Property p = new Property(i,"key"+i,"value"+i);
      properties.add(p);
    }
  }

  public ArrayList<Property> getProperties() {
    return properties;
  }

  public void updateProperty(int id) {
    System.out.println("we are updating: " + id);
  }

}

プロパティ.java

package com.test;

public class Property
{
  private int id;
  private String key;
  private String value;
  public Property(int id, String key, String value)
  {
    super();
    this.id = id;
    this.key = key;
    this.value = value;
  }
  public int getId()
  {
    return id;
  }
  public void setId(int id)
  {
    this.id = id;
  }
  public String getKey()
  {
    return key;
  }
  public void setKey(String key)
  {
    this.key = key;
  }
  public String getValue()
  {
    return value;
  }
  public void setValue(String value)
  {
    this.value = value;
  }

}

また、ここに私の構成ファイル (beans.xml、faces-config.xml、および web.xml) があります。

ビーンズ.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:plidm="urn:java:org.jboss.seam.security.management.picketlink"
       xmlns:security="urn:java:org.jboss.seam.security"
       xmlns:s="urn:java:ee"
       xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee
      http://jboss.org/schema/cdi/beans_1_0.xsd">

</beans>

顔-config.xml:

<?xml version="1.0" encoding="UTF-8"?>

<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">

</faces-config>

web.xml:

<?xml version="1.0"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name>DataTableSubmit1</display-name>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
      <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
  </servlet-mapping>
</web-app>

私のWEB-INF/libディレクトリには次のjarもあります。

common-annotations.jar
commons-beanutils.jar
commons-collections.jar
commons-digester.jar
commons-logging.jar
cssparser-0.9.5.jar
guava.jar
jsf-api-2.0.4-b09.jar
jsf-impl-2.0.4-b09.jar
jstl.jar
richfaces-components-api-4.2.0.Final.jar
richfaces-components-ui-4.2.0.Final.jar
richfaces-core-api-4.2.0.Final.jar
richfaces-core-impl-4.2.0.Final.jar
sac-1.3.jar
standard.jar

Java 1.6 を使用して JBoss 7.1.1.Final で実行しています。これでも、1 行を更新しようとするたびにテーブル全体が送信されます。許可されるリクエスト パラメータの数を増やすことができることはわかっていますが、それは完全なハックのようです。firebugで見たときに得られる応答メッセージは次のとおりです。

<?xml version='1.0' encoding='UTF-8'?>
<partial-response><error><error-name>class java.lang.IllegalStateException</error-name><error-message><![CDATA[More than the maximum number of request parameters (GET plus POST) for a single request ([512]) were detected. Any parameters beyond this limit have been ignored. To change this limit, set the maxParameterCount attribute on the Connector.]]></error-message></error></partial-response>

ありがとう

4

1 に答える 1

0

メソッドがパラメーター (または の型)updatePropertyを受け取ると仮定すると、の代わりにを使用する必要があります。intprop.idactionactionListener

解決:

<h:dataTable value="#{propertyEditor.properties}" var="prop">
    <!-- columns with data -->
    <h:column>
        <a4j:commandButton value="Update Property"
            action="#{propertyEditor.updateProperty(prop.id)}"
            render="props notif"/>
    </h:column>
</h:dataTable>

そしてあなたのマネージドBean:

@ManagedBean
@ViewScoped
public class PropertyEditor {

    //attributes, constructor, getters, setters and other methods...

    public void updateProperty(int id) {
        //current implementation...
    }
}

CDI を使用する場合、基本的に同じアプローチですが、注釈が異なります。

@Named
@SessionScoped
public class PropertyEditor {

    //attributes, constructor, getters, setters and other methods...

    public void updateProperty(int id) {
        //current implementation...
    }
}

ここで両方の違いを参照してください:アクションとアクションリスナーの違い

于 2013-03-27T20:38:37.380 に答える