Я пытаюсь реализовать функцию, в которой компонент h:commandButton
используется для создания строки h:dataTable
при каждом нажатии кнопки. Я тестирую это, используя список строк. Когда страница загружается впервые, функция работает нормально, при нажатии кнопки создается строка со значением «Новый элемент». однако, когда я щелкаю по нему второй раз, кажется, что ArrayList из backbean ActionBean перераспределяется. Что я делаю не так?
Компонент действия:
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.ScopeType;
import jp.co.dir.bf.common.AppLogger;
import jp.co.dir.bf.front.common.BaseBean;
@Scope(ScopeType.CONVERSATION)
@Name("ActionBean")
public class ActionBean extends BaseBean {
private AppLogger appLogger;
private List<String> list = new ArrayList<String>();
public ActionBean() {
appLogger = new AppLogger(Logger.getLogger(ActionBean.class));
}
public void init(){
appLogger.showDebug("The Form is loaded");
appLogger.showDebug("Initial Size: "+ list.size());
}
public AppLogger getAppLogger() {
return appLogger;
}
public void setAppLogger(AppLogger appLogger) {
this.appLogger = appLogger;
}
public List<String> getList(){
return list;
}
public void addToList(){
list.add(new String("New Item"));
/////This is always printing 1 after each add.
appLogger.showDebug("Item added: "+ list.size());
}
public void setList(List<String> list){
this.list = list;
}
}
Xhtml:
<h:commandButton value = "Add New" >
<p:ajax listener = "#{ActionBean.addToList}" update = "table"/>
</h:commandButton>
<h:dataTable id = "table" value = "#{ActionBean.list}" var = "item">
<h:column>
<h:outputText value = "#{item}"/>
</h:column>
</h:dataTable>
Я исправил проблему. Это глупость с моей стороны. Я забыл добавить
@Begin(join = true)
аннотация к init(), поэтому init вызывается при каждой загрузке, а не только один раз для каждого диалога. Надеюсь, кто-то найдет это полезным. Новый код Action Bean
теперь:
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.ScopeType;
import jp.co.dir.bf.common.AppLogger;
import jp.co.dir.bf.front.common.BaseBean;
@Scope(ScopeType.CONVERSATION)
@Name("ActionBean")
public class ActionBean extends BaseBean {
private AppLogger appLogger;
private List<String> list = new ArrayList<String>();
public ActionBean() {
appLogger = new AppLogger(Logger.getLogger(ActionBean.class));
}
@Begin(join = true) ///this is the part that is updated
public void init(){
appLogger.showDebug("The Form is loaded");
appLogger.showDebug("Initial Size: "+ list.size());
}
public AppLogger getAppLogger() {
return appLogger;
}
public void setAppLogger(AppLogger appLogger) {
this.appLogger = appLogger;
}
public List<String> getList(){
return list;
}
public void addToList(){
list.add(new String("New Item"));
/////This is always printing 1 after each add.
appLogger.showDebug("Item added: "+ list.size());
}
public void setList(List<String> list){
this.list = list;
}
}
@balusc Я новичок в JSF, поэтому, хотя я знаю, что пошло не так, я не совсем уверен, почему. Если вас не затруднит, можете дать краткое пояснение?