【问题标题】:JSF2 DataBinding ProblemJSF2 数据绑定问题
【发布时间】:2011-04-08 16:10:10
【问题描述】:

我在 jsf 2 中提交表单有一点问题:

在我的 web 应用程序中,我有一个函数可以更新我的数据库中的实体。此函数从托管 bean 中获取相关数据。

所以,我的问题是我的视图中的更改没有传递给 managedBean。为了让你清楚,这里有一个例子:

 public String updateProject() {
  projectService.updateProject(projectData.getProjectDTO());
  return ("overview.xhtml");
 } 

prjectData 是我的 ManagedBean。这个不行!未进行任何更新。

 public String deleteProject() {
  projectData.getProjectDTO().setDeleted(true);
  projectService.updateProject(projectData.getProjectDTO());
  return ("overview.xhtml");
 }

在这里,当我通过代码更改值时,它会起作用!所以我猜我的视图外的值没有传递给我的 managedBean。

哪里可能出错?是否有可能我必须调用某个操作才能使数据将我的视图传递给 managedBean?


回答 Gabor 的评论:

我的页面如下所示:

<h:form>
 <h:commandLink action="#{controller.updateProject}" value="Edit" />
 <h:outputLabel for="title" value="Titel" /> 
 <h:inputText id="title" value="#{projectData.projectDTO.title}" />
</h:form>

如果我在此处更改标题并按更新,则不会发生任何事情;-)


我的控制器看起来像:

@ManagedBean
@RequestScoped
public class Controller {

    @ManagedProperty(value = "#{projectData}")
    private ProjectData projectData;
...

由于未知原因,我在 Eclipse 中的调试模式不再起作用,它一直忽略我的断点。我会解决这个问题,然后我会检查实例。对不起-.-

【问题讨论】:

  • 那么您的 JSF 页面是什么样子的?什么应该调用这些函数?
  • 你能打开你的 projectData bean 和 projectDTO 属性的代码吗?
  • 您是否尝试调试它以查看数据是否传递给托管 bean?并检查它是否是同一个实例? (见 BalusC 答案)。
  • 如果无法调试,至少尝试“可怜的人调试”,通过 System.out.println() 将状态打印到控制台。检查您的数据是否已传递给 Controller,在收到的 projectData 上使用 System.out.println()。

标签: java jsf jsf-2


【解决方案1】:

projectDataprojectDTO 都不是您期望的正确实例。这是一个完全不同的例子。您不是急切地重新创建/覆盖bean吗?范围内没有多个 bean 吗?例如不应该是#{controller.projectData.projectDTO.title}吗? controller 中的 projectData 实例不应该是托管属性吗?

【讨论】:

    【解决方案2】:

    你的projectData bean 也是 RequestScoped 吗?尝试更改为 ViewScoped。 RequestScoped bean 为每个请求重新创建,也是 ajax 请求。 projectService的范围是什么?

    【讨论】:

    • projectData 是 SessionScoped,projectService 不是 managedBean,所以它的生命周期由控制器处理
    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 2017-02-16
    • 2011-10-18
    • 2021-01-04
    • 2011-09-12
    相关资源
    最近更新 更多