の値を更新しようとし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>
ありがとう