一部のフィールドが読み取り専用として定義されているJSF2フォームがありますが、ユーザーはアクセスできませんが、送信する必要があります。私が直面している問題は、フォームを送信すると、読み取り専用フィールドがnullと評価されることです。スレッドを読みました<h:inputText readonly = "true">のデータは、いくつかの提案でコマンドボタンをクリックすると消えますが、それらがどのように機能するか理解できなかったか、フォームに問題があります。
これが私のフォームにあるものです:
<h:inputTextarea id="attLFld" value="#{cc.attrs.inc.attL}" rows="8" cols="40"
onblur="lookupL(this.value)" >
<rich:validator/>
</h:inputTextarea>
<h:inputText id="attLIFld" value="#{cc.attrs.inc.attLI}" size="14" readonly="true" />
<a4j:jsFunction name="lookupL" execute="attLFld"
render="attLFld,attLIFld"
action="#{incController.lookupL}">
</a4j:jsFunction>
そして、これが私のコントローラーメソッドです
public void lookupL()
{
newInc.setAttLI("1234");
}
上記のスレッドで提案されているように、タグreadonlyが設定されたinputTextフィールドを作成しようとしました
<h:inputText id="attLIFld" value="#{cc.attrs.inc.attLI}" size="14" readonly="#{facesContext.renderResponse}" />
しかし、それは私にはうまくいきませんでした。
残念ながら、その提案は私にはうまくいきませんでした。フォームに何か問題があると思いますが、何がわかりません。どんな助けでも大歓迎です。
これがxhtmlの抜粋です(私はRichfaces 4を使用しています)
<composite:implementation>
<h:panelGrid columns="3" border="0">
<h:panelGrid columns="1" border="0">
<rich:panel id="rpA">
<f:facet name="header">
<h:outputText value="Field Group A"/>
</f:facet>
<h:panelGrid columns="2" columnClasses="titleCell" border="0">
<h:outputLabel for="fldA1" value="Field A1:" />
<h:inputTextarea id="fldA1" value="#{cc.attrs.mybean.fldA1}" rows="8" cols="40" immedite="true" onblur="lookup(this.value)" >
<rich:validator/>
</h:inputTextarea>
<h:outputLabel for="fldA2" value="Field A2:" />
<h:inputText id="fldA2" value="#{cc.attrs.mybean.fldA2}" size="14" readonly="true" />
<h:outputLabel for="fldA3" value="Field A3:"/>
<h:inputText id="fldA3" value="#{cc.attrs.mybean.fldA3}" readonly="#{facesContext.renderResponse}" size="14"/>
</h:panelGrid>
</rich:panel>
</h:panelGrid>
<h:panelGrid id="pgButtons" columns="1" border="0">
<a4j:commandButton type="button" value=">>>>" action="#{myBeanController.copyFields}" immediate="true"
execute="fldA1,fldA2,fldA2H,fldA3,fldA3H"
render="fldB1,fldB2,fldB3"/>
</h:panelGrid>
<rich:panel id="rpB">
<f:facet name="header">
<h:outputText value="Field Group B"/>
</f:facet>
<h:panelGrid columns="2" columnClasses="titleCell" border="0">
<h:outputLabel for="fldB1" value="Field B1:" />
<h:inputTextarea id="fldB1" value="#{cc.attrs.mybean.fldB1}" rows="8" cols="40" immediateue="true" >
<rich:validator/>
</h:inputTextarea>
<h:outputLabel for="fldB2" value="Field B2:" />
<h:inputText id="fldB2" value="#{cc.attrs.mybean.fldB2}" size="14" readonly="true" />
<h:outputLabel for="fldB3" value="Field B3:"/>
<h:inputText id="fldB3" value="#{cc.attrs.mybean.fldB3}" readonly="#{facesContext.renderResponse}" size="14"/>
</h:panelGrid>
</rich:panel>
</h:panelGrid>
<div id="hiddenFields">
<h:inputHidden value="#{cc.attrs.mybean.fldA2H}" id="fldA2H" />
<h:inputHidden value="#{cc.attrs.mybean.fldA3H}" id="fldA3H"/>
</div>
<a4j:jsFunction name="lookup" execute="fldA1"
render="fldA1,fldA2,fldA3,,fldA2H,fldA3H"
action="#{myBeanController.lookup}">
<a4j:param name="loc" assignTo="#{cc.attrs.mybean.fldA1}" />
</a4j:jsFunction>
</composite:implementation>
ここで私がやろうとしているのは、フィールドA1に何かを入力してから、A2フィールドとA3フィールドにデータを入力し、ボタンをクリックしてそれらすべてのAxフィールドをBxフィールドにコピーすることです。最初の部分は実行できますが、ボタンをクリックすると、表示(ただし読み取り専用)フィールドと非表示フィールドの両方がコントローラーメソッドcopyFieldsでnullと評価されます。
@Model
public class MyBeanController {
private MyBean newMBean;
private MyBean mBean;
@Produces
@Named
public MyBean getNewMBean() {
return newMBean;
}
@Produces
@Named
public MyBean getMBean() {
return mBean;
}
public void setNewMBean(MyBean mBean) {
this.mBean = mBean;
}
@PostConstruct
public void initNewMBean() {
newMBean = new MyBean();
}
public void lookup() {
newMBean.setFldA2("boo");
newMBean.setFldA2H("boo");
newMBean.setFldA3("hoo");
newMBean.setFldA3H("hoo");
}
public String copyFields() {
newMBean.setFldB1(newMBean.getFldA1());
newMBean.setFldB2(newMBean.getFldA2H());
newMBean.setFldB3(newMBean.getFldA3H());
return null;
}