jsf - 如何修复 JSF 请求范围的 CDI Bean
问题描述
我是 JSF 的新手,我正在使用一个 JPA 实体开展一个小项目,但今天在开展该项目时我有几个疑问和一些问题。我对 JSF 的所有知识都来自书本。
问题如下:
当我单击列表所有按钮时,列表加载正常并显示我在数据库中的数据,但是当我单击行列中的删除按钮时,它什么也不做,似乎刷新页面。如果我将 bean 的范围更改为 SessionScope 它工作正常。我阅读的大多数书籍都展示了使用 RequestScope 进行 CRUD 操作的示例,而其他一些互联网文章也展示了相同的示例。
创建和更新操作在另一个 xhtml 页面(crearBeneficiario.xhtml 和actualizarBeneficiario.xhtml)中以另一种形式处理并且工作正常。
我在 Payara Server 5.192 和 Eclipse IDE 4.12 上使用 JSF 2.3
如果您能带领我走上正确的道路,我将不胜感激。
我附上一些图片 图片 1 删除前点击 图片 2 删除后点击
在我的 listarBeneficiario.xhtml(部分代码)中,我必须遵循表单和数据表
<h:form>
<button type="submit" class="btn btn-block btn-sm" jsf:action="#{navigationController.goCrearBeneficiario()}">Nuevo beneficiario</button>
<hr />
<button type="submit" class="btn btn-block btn-sm" jsf:action="#{beneficiarioController.listBeneficiariosTodos()}">Listar Todos</button>
<hr />
</h:form>
<h:form>
<h:dataTable value="#{beneficiarioController.beneficiarios}" var="b" styleClass="table table-hover"headerClass="verderuralp-color white-text">
<h:column>
<f:facet name="header">Nombre</f:facet>
<h:outputText value="#{b.nombre}" />
</h:column>
<h:column>
<f:facet name="header">A. Paterno</f:facet>
<h:outputText value="#{b.apellidoPaterno}" />
</h:column>
<h:column>
<f:facet name="header">A. Materno</f:facet>
<h:outputText value="#{b.apellidoMaterno}" />
</h:column>
<h:column>
<f:facet name="header">CURP</f:facet>
<h:outputText value="#{b.curp}" />
</h:column>
<h:column>
<h:commandButton action="#{beneficiarioController.deleteBeneficiario(b.beneficiarioId)}" value="Eliminar"/>
</h:column>
</h:form>
这是我的 CDI Bean(部分代码)
@Data
@NoArgsConstructor
@Named
@RequestScoped
public class BeneficiarioController
implements Serializable
{
private static final long serialVersionUID = 1L;
private String mensaje;
private String desde;
private String hasta;
private String busqueda;
private BeneficiarioDto beneficiarioDto = new BeneficiarioDto();
private List<Beneficiario> beneficiarios = new ArrayList<Beneficiario>();
@EJB
private BeneficiarioService beneficiarioService;
public void deleteBeneficiario( Beneficiario b ) {
try {
beneficiarioService.deleteBeneficiario( b.getBeneficiarioId() );
mensaje = "El beneficiario fue dado de baja";
} catch ( EntidadNoEncontrada e ) {
mensaje = e.getMessage();
}
beneficiarios = beneficiarioService.listBeneficiariosPorEstado( true );
}
public void listBeneficiariosTodos() {
this.beneficiarios = beneficiarioService.listBeneficiariosPorEstado( true );
}
解决方案
答案就像@Kukeltje 说的
通过在请求和会话之间使用 sope 仍然可以按照您的方式使用它:viewscoped。非常适合这个
推荐阅读
- c++ - 如何正确编写 PKCS#7 签名文件?
- android - 当Android中Firebase数据库中的数据发生变化时向App发送数据
- python - 无法进行转义查询
- c# - 将秒的浮点数转换为分秒的浮点数
- excel - 如何在字符串的文本搜索中处理通配符
- bootstrap-datepicker - 将 Bootstrap Datepicker 上的选定日期作为字符串获取?
- javascript - 如何更改日期选择器内的日期选择器设置?
- javascript - 对 Promise 的关闭不能与异步影响的值一起使用吗?
- java - CNE 收到意外操作:android.intent.action.BATTERY_CHANGED
- c++ - 如何创建将检查我的校验和的测试(如何使我的代码损坏内存)