我有一个托管beanmyBean1
,它有以下方法:
private String selectedSalleOrAc;
private String selectedSalleOrAcId;
public void effacerJourDialog(Object o){
if(o instanceof Salle){
this.selectedSalleOrAc = "1";
this.selectedSalleOrAcId = ((Salle)o).getId() + "";
}
if(o instanceof Appareil){
this.selectedSalleOrAc = "2";
this.selectedSalleOrAcId = ((Appareil)o).getId() + "";
}
Map<String, Object> options = new HashMap<>();
options.put("modal", true);
options.put("resizable", false);
options.put("closable", true);
options.put("width", 660);
options.put("height", 700);
options.put("closeOnEscape", true);
options.put("contentWidth", 660);
options.put("contentHeight", 700);
// Affichage du dialogue
Map<String, List<String>> params = new HashMap<>();
List<String> values = new ArrayList<>();
values.add(this.selectedSalleOrAcId);
values.add(this.selectedSalleOrAc);
params.put("selectedSalleOrAcId", values);
params.put("selectedSalleOrAc", values);
RequestContext.getCurrentInstance().openDialog("/planningSalleAppareil/effacerJour", options, params);
}
//Getters and Setters
因此,EffacerJourDialog
方法将打开一个对话框,并传递给它两个参数(SelectedSalleoracid
和SelectedSalleorac
)。
<f:metadata>
<f:viewParam name="selectedSalleOrAcId" value="#{myBean2.selectedSalleOrAcId}" />
</f:metadata>
<f:metadata>
<f:viewParam name="selectedSalleOrAc" value="#{myBean2.selectedSalleOrAc}" />
</f:metadata>
<ui:define name="menu">
<p:menuitem onclick="$('#form\\:valider').click();"
value="#{messages.valider}"
icon="ui-icon-nouveau"/>
<p:menuitem action="#{myBean2.retour()}"
immediate="true"
value="#{messages.annuler}"
icon="ui-icon-supprimer" />
</ui:define>
<ui:define name="content">
<h:form id="form" styleClass="ui-panel-form" >
<p:growl id="messages" showDetail="true" showSummary="true"/>
<p:commandButton id="validerEffacerJour"
action="#{myBean2.effacerJour}"
update="messages"/>
<p:panel>
<p:panelGrid>
<p:row>
<p:column>
<h:outputLabel id="jour0"
for="jour"
value="#{messages.Jour}" />
</p:column>
<p:column>
<p:selectOneMenu id="jour"
value="#{myBean2.jourAEffacer}"
required="true"
requiredMessage="Jour de la semaine : vous devez indiquer une valeur.">
<f:selectItem itemLabel="Selectionnez un jour" itemValue="" />
<f:selectItem itemLabel="#{messages.Jour1}" itemValue="1" />
<f:selectItem itemLabel="#{messages.Jour2}" itemValue="2" />
<f:selectItem itemLabel="#{messages.Jour3}" itemValue="3" />
<f:selectItem itemLabel="#{messages.Jour4}" itemValue="4" />
<f:selectItem itemLabel="#{messages.Jour5}" itemValue="5" />
<f:selectItem itemLabel="#{messages.Jour6}" itemValue="6" />
<f:selectItem itemLabel="#{messages.Jour7}" itemValue="7" />
</p:selectOneMenu>
</p:column>
</p:row>
</p:panelGrid>
</p:panel>
</h:form>
</ui:define>
然后命令按钮ValiderEffacerJour
将从MyBean2
调用方法EffacerJour
:
private Integer jourAEffacer;
private String selectedSalleOrAc;
private String selectedSalleOrAcId;
public void effacerJour(){
Object selectedObject = null;
if(selectedSalleOrAc.equals("1")){
selectedObject = salleService.trouver(Integer.parseInt(selectedSalleOrAcId));
}
else if(selectedSalleOrAc.equals("2")){
selectedObject = appareilService.trouver(Integer.parseInt(selectedSalleOrAcId));
}
planningService.effacerJour(selectedObject, this.jourAEffacer);
}
//Getters and setters
但我在行中得到了一个NullPointerException:
if(selectedSalleOrAc.equals("1")){
所以我在这一行上附加了一个dubugger,我得到了这个:
您可以注意到,变量selectedsalleorac
具有空值,而selectedsalleoracid
具有字符串值。
解决办法就是使用:
<f:metadata>
<f:viewParam name="selectedSalleOrAcId" value="#{myBean2.selectedSalleOrAcId}" />
<f:viewParam name="selectedSalleOrAc" value="#{myBean2.selectedSalleOrAc}" />
</f:metadata>
而不是:
<f:metadata>
<f:viewParam name="selectedSalleOrAcId" value="#{myBean2.selectedSalleOrAcId}" />
</f:metadata>
<f:metadata>
<f:viewParam name="selectedSalleOrAc" value="#{myBean2.selectedSalleOrAc}" />
</f:metadata>
如何从Servlet访问JSF ViewScope托管bean? (假设所讨论的托管bean已经创建,但尚未销毁)
问题内容: 我一直在用@ViewScoped Managed-Bean来敲打我的头。我正在使用primeface的“计划”组件以显示一些事件。当用户单击特定按钮时,使用ajax在viewscoped bean中调用一个方法,但是每次我得到一个“ java.io.NotSerializableException”时,如果我更改托管bean范围以请求该问题,就会消失。 我究竟做错了什么?有任何想法吗?
我正计划将一个web应用程序从使用JSF托管bean转换为使用CDI托管bean。我知道我需要做以下工作: 在WEB-INF中添加空beans.xml文件。 将所有JSF@ManagedBean替换为CDI@Named Annotations。 用CDI或OmniFaces作用域注释替换所有JSF作用域注释。 将所有JSF@ManagedProperty替换为CDI@Inject Annotati
托管bean它是一个纯Java类,它包含一组属性和一组,方法。 以下是托管bean方法执行的常见功能: 验证组件的数据 处理组件触发的事件 执行处理以确定应用程序必须导航的下一页 它也可以作为JFS框架的模型。 JSF托管Bean示例 请看看下面一段示例代码 - 您可以通过以下方式使用此。 通过配置成XML文件。 通过使用注释。 通过XML文件配置托管Bean 在xml文件配置是比较旧方法。 在这
主要内容:使用XML配置,使用@ManagedBean注解JSF 托管bean(Managed Bean)是JSF注册的常规Java Bean类。托管bean包含getter和setter方法,业务逻辑。JSF托管bean作为UI组件的Model。 它存储JSF xhtml页面使用的数据。借助JSF框架,可以从JSF页面访问托管Bean。 在JSF 1.2中,我们必须在JSF配置文件(如)中注册受管理的bean。 从JSF 2.0可以使用注解注册管理be
我有一个JSF的问题,CDI项目。我做了大量研究,发现在CDI中没有注释。我用对话框解决基于ajax的页面的问题。我想将变量从DataTable传递到dialog。为此,我不能使用bean,因为在请求结束后会丢弃值。有人能帮我解决吗?我不能使用,但这是一个糟糕的做法。或者只保存这一个变量到会话谁知道。你们能给我一些提示如何优雅地解决这个问题吗? 以下是错误消息: