java - 在 JSF primefaces 中动态生成日期标签

标签 java jsf-2 primefaces

在一个页面中,我有一个持续时间为 priod(整数月)的 InputText 框和一个用于选择初始日期的 p:calendar 输入。 我需要为从初始日期开始的所有月份生成标签(月-年)。 例如,如果持续时间为 3,初始日期为 10-dec-2014,则应生成以下三个标签: 2014年12月 2015年1月 2015年2月 我试着在没有支持 bean 的情况下做到这一点:

<c:forEach var="i" begin="1" end="${myBean.duration}">
                        <p:outputLabel value=" ${i+myVar} ${year+1900} " />
                        <h:panelGrid columnClasses="input, slider" columns="2">
                            <p:inputText id="inputTxt_${i}" style="width:70px;" />
                            <p:slider for="inputTxt_${i}"
                                style="padding-left: 100px; margin-left:5px">
                                <p:ajax event="slideEnd" />
                            </p:slider>
                        </h:panelGrid>

但是这样我无法正确生成标签。 任何人都知道如何通过使用带有或不带有提交按钮的 JSF 或 Backing bean 来做到这一点(例如使用 event="keyup"或 event="dateSelect"等事件)??

最佳答案

我认为您的 xhtml-Structure 不正确。

  • 您缺少结尾 </c:forEach>
  • 如果在代码片段末尾关闭,您将得到 {i} slider

假设您想要一个 slider 和 {i}日期输出

  • 建立一个 BackingBean 来保存你的值
  • 值是:“monthCount”保存整数,“dateList”保存(计算的)日期
  • listener-根据 slider 输入的整数计算日期的方法public void listenerMonthCount(SlideEndEvent ae)

    <h:form id="form">
        <h:panelGrid columns="2">
            <p:inputText id="monthCount" style="width:70px;" value="#{backingBean.monthCount}" />
            <p:slider for="monthCount" style="padding-left: 100px; margin-left:5px" maxValue="12">
                <p:ajax event="slideEnd" process="@form" listener="#{backingBean.listenerMonthCount}" update="form" />
            </p:slider>
        </h:panelGrid>
        <ui:repeat var="month" value="#{backingBean.dateList}">
            <h:outputText value="#{month}">
                <f:convertDateTime pattern="MMM-yyyy" />
            </h:outputText>
            <br />
        </ui:repeat>
    </h:form>
    

更详细的解释: p:ajax -标签不仅需要event -属性,还需要被告知要做什么。所以定义监听器listener="#{backingBean.listenerMonthCount}" .为了让监听器知道新选择的 monthValue,必须将其传输到服务器 process="@form"用于将这种形式的所有值从客户端传输到服务器。 update="form"指示在处理完监听器后更新所有值。

<ui:repeat> - block 包含输出的渲染。它遍历 List<Date>并将每个项目分配给变量 month .这是用 f:convertDataTime 打印和格式化的它将 Java-DateFormatPattern 作为 pattern -属性。

在你的 Backing-Bean 中你本质上需要这个

private int monthCount = 0; // +getter/setter

private List<Date> dateList = new ArrayList<Date>(); // +getter/setter

public void listenerMonthCount(SlideEndEvent ae) {
    dateList.clear(); // clear the list to remove entries from possible old runs
    if (monthCount > 0) {
        Date now = new Date();
        dateList.add(now); // add first date
        Calendar cal = Calendar.getInstance();
        for (int i = 1; i < monthCount; i++) {
            cal.setTime(dateList.get(dateList.size() - 1)); // get last date from list and set calendar
            cal.add(Calendar.MONTH, 1);// add one month
            dateList.add(cal.getTime()); // add calculated date
        }
    }
}

关于java - 在 JSF primefaces 中动态生成日期标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26732768/

相关文章:

java - JSF bean 访问失败

css - Primefaces TreeTable css 样式

Java:为什么程序会跳过字符输入?

java - 无法将字符串转换为长

java - 如何在 Android 上恢复 SSL session

jsf - 是方向 ="horizontal"在 p :tree is available in primefaces-3. 3.1

html - 将带有 HTML 代码的字符串注入(inject)并解释为 JSF 页面的组件

css - 如何使用xhtml在css中使用roboto字体

java - 尝试使用 Rally Java 工具包更新用户故事时出现 "Could not update: Could not write changes in Unit Of Work"错误

java - Gradle:多项目构建 - 如何确定需要重建的项目?