gpt4 book ai didi

java - 为什么表单提交不起作用?

转载 作者:行者123 更新时间:2023-11-30 06:00:02 25 4
gpt4 key购买 nike

我有下一个表格:

<h:form>
<h:selectManyListbox value="#{reports.selectedCategories}"
converter="#{categoryConverter}">
<f:selectItems value="#{reports.categories}"/>
</h:selectManyListbox>
<h:commandButton value="Submit" action="#{reports.action}" />
</h:form>

我使用自定义转换器将类别转换为字符串,反之亦然:

public class CategoryConverter implements Converter {

@Autowired
private CategoryService categoryService;

public Object getAsObject(FacesContext context, UIComponent component, String value) {
System.out.println ("CONVERTER: GET AS OBJECT");
return categoryService.findByName (value);
}

public String getAsString(FacesContext context, UIComponent component, Object value) {
System.out.println ("CONVERTER: GET AS STRING");
return ((Category) value).getName ();
}
}

最后是我的支持 bean 代码:

public class ReportsController {

private Category[] selectedCategories;

public void setSelectedCategories (Category[] categories) {
System.out.println ("SET CATEGORIES");
this.selectedCategories = categories;
}

public Category[] getSelectedCategories () {
System.out.println ("GET CATEGORIES");
return selectedCategories;
}

public void action () {
System.err.println ("ACTION");
}

....
//methods for accessing data

}

当我启动我的应用程序时,我看到正确的列表框,其中包含 2 个项目和一个“提交”按钮。但是当我按下提交时什么也没有发生。我看到的唯一输出是:

GET CATEGORIES
CONVERTER: GET AS STRING
CONVERTER: GET AS STRING

setSelectedCategories () 和 action () 方法都不会被调用。我不明白为什么。有什么建议吗?

UPD:问题更加愚蠢:当我评论与 Category 类相关的所有内容(即我的 selectManyListbox、我的转换器、所有相关的 setter 和 getter)并只留下方法操作时,它仍然没有被调用。

<h:form>
<h:commandButton value="Submit" action="#{reports.action}" />
</h:form>

UPD2:这是阶段监听器的输出

START PHASE RESTORE_VIEW 1
END PHASE RESTORE_VIEW 1
START PHASE APPLY_REQUEST_VALUES 2
END PHASE APPLY_REQUEST_VALUES 2
START PHASE PROCESS_VALIDATIONS 3
END PHASE PROCESS_VALIDATIONS 3
START PHASE UPDATE_MODEL_VALUES 4
END PHASE UPDATE_MODEL_VALUES 4
START PHASE INVOKE_APPLICATION 5
END PHASE INVOKE_APPLICATION 5
START PHASE RENDER_RESPONSE 6
GET STR
END PHASE RENDER_RESPONSE 6

似乎所有阶段都运行良好,但实际上并非如此。我有点困惑。

最佳答案

当 JSF 表单提交失败时,您需要确保以下事项:

  1. UICommand 组件必须嵌套在 UIForm 组件中。

    <h:form>
    <h:commandButton value="submit" action="#{bean.submit}" />
    </h:form>
  2. 您不能相互嵌套多个 UIForm 组件,这是 HTML 规范所禁止的。请注意包含的页面/ subview ,这些帐户位于组件树中!如果 jsp:include 已经在 h:form 内,则需要从包含页面中删除 h:form!

    <h:form>
    <h:form>
    <h:commandButton value="this will not work" action="#{bean.fail}" />
    </h:form>
    </h:form>
  3. 不应该发生验证/转换错误(使用 h:messages 获取所有错误)。

    <h:form>
    <h:commandButton value="submit" action="#{bean.submit}" />
    <h:messages />
    </h:form>
  4. 如果 UICommand 组件嵌套在 UIData 组件中(例如 h:dataTable),请确保完全相同的 DataModel (value 属性后面的对象)被保留。测试这一点的最简单方法是将 bean 放置在 session 范围内。如果这解决了问题,那么您需要检查数据加载逻辑。

  5. 组件和所有父组件的 rendereddisabled 属性不应得出负值。测试这一点的最简单方法是将 bean 放置在 session 范围内。如果这解决了问题,那么您需要检查负责此问题的代码。

  6. 确保没有 PhaseListener 或任何 EventListener 更改请求生命周期以跳过调用操作阶段。

  7. 确保同一请求链中的 Filter/Servlet 没有以某种方式阻止 FacesServlet 的请求。

关于您的实际问题;您没有得到 PropertyNotFoundException 或类似的情况,并且您的 PhaseListener 已经很好地执行了所有适当的生命周期阶段,所以我认为您的问题实际上是由 2 引起的。嵌套表单

关于java - 为什么表单提交不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2049964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com