【问题标题】:JSF Ajax working platform dependendJSF Ajax 工作平台依赖
【发布时间】:2018-07-17 14:14:23
【问题描述】:

我正在开发一个使用 jsf 作为输出的小应用程序。 基本上,应用程序使用 url 参数调用,使用它来查询肥皂接口和数据库以获取更多数据,然后计算一些推荐的产品。

我根据接口的一些存根实现了计算,然后在分支中实现了查询 - 并注意到 ajax 停止工作。 我使用 ajax 根据过滤器输入更新推荐列表。

坏事:即使重置到我的稳定分支,它也不会再次工作。 现在我认为它可能是 maven,基于以下实验:

  1. 我在远程机器(运行 debian)上安装了一个新的服务器实例(glassfish 5.0.1 的夜间版本)。
  2. 我用我的 jenkins 部署了一个稳定分支的构建

    -->一切正常!

  3. 然后我在本地机器上安装了相同 glassfish-zip 的新实例,将 .war 从远程机器复制到本地实例

    -->一切正常!

  4. 最后,我检查了 Eclipse 中的 stable 分支,启动了 maven (m2e) 构建并在我的本地机器上部署了 .war

    -->Ajax 不工作,什么也没有发生。

我只是不明白,因为 maven 应该独立运行机器,至少我认为。我已经将编码设置为 UTF-8,所以应该没有平台依赖性。

我实现了一些跟踪日志,并且可以看到,甚至没有调用支持 bean 中的方法。没有记录错误。

感谢您的每一个提示,如果有帮助,我很乐意提供更多信息。下面附加了一些初始信息。

干杯

提姆


我使用 java 8、glassfish 5.0.1、eclipse Oxygen.3a (4.7.3a) 和 m2e 和 egit。

这是过滤栏的 xhtml 的一部分:

<ui:composition
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
    xmlns:t="http://myfaces.apache.org/tomahawk">
<label for="drop" class="toggle">Angebote filtern &#9662;</label>
<h:panelGroup id="filterleiste">
            <h:form id="filterleiste_hForm">
                <p id="filtertitel">Filterauswahl</p>
                <p id="filtererklärung">Hier kannst du Filter auswählen, um die Angebote zu finden, die dich interessieren.</p>

                <!-- FILTERFRAGE EMPFEHLUNG -->
                <h:panelGroup class="filterfrage" id="filterfrage_empfehlung">
                    <div class="filterfrage_header">Empfehlungen:</div>
                    <h:selectOneRadio value="#{resultpage.filter.zeigeNurEmpfehlungen}" layout="pageDirection" immediate="true">
                        <f:selectItem itemValue="#{true}" itemLabel="nur meine Empfehlungen anzeigen"/>
                        <f:selectItem itemValue="#{false}" itemLabel="alle Angebote anzeigen"/>
                        <f:ajax event="click"/>
                    </h:selectOneRadio>
                </h:panelGroup>

                <!-- FILTERFRAGE BEREITS BESUCHT -->
                <h:panelGroup class="filterfrage" id="filterfrage_besucht">
                    <div class="filterfrage_header">Bereits besuchte Angebote:</div>
                    <h:selectOneRadio value="#{resultpage.filter.zeigeBesuchte}" layout="pageDirection" immediate="true">
                        <f:selectItem itemValue="#{true}" itemLabel="anzeigen"/>
                        <f:selectItem itemValue="#{false}" itemLabel="ausblenden"/>
                        <f:ajax event="click"/>
                    </h:selectOneRadio>
                </h:panelGroup>
                <h:commandButton type="button" class="button filterbutton" value="Filter anwenden">
                    <f:ajax render=":angebotsdarstellung" listener="#{resultpage.updateView}"/>
                </h:commandButton>

                <!-- FILTERFRAGE THEMA -->
                <label for="filterklapper_themen" class="klapper_unterfilter">Themen filtern &#9662;</label>
                <input type="checkbox" class="filterklapper" id="filterklapper_themen" />               
                <div id="filterklapper_themen" class="filterklapper">
                    <h:panelGroup class="filterfrage" id="filterfrage_themen">
                        <h:selectBooleanCheckbox value="#{resultpage.filter.zeigeAlleThemen}">
                            <f:ajax listener="#{resultpage.filter.zeigeAlleThemenClick}" render="filterfrage_themen"/>
                        </h:selectBooleanCheckbox>
                        <label class="filterfrage_antwortcontainer exclusive_item">
                            alle Themen
                        </label>
                        <!-- Angebotsthemen -->
                        <ui:repeat var="thema" value="#{resultpage.filter.alleThemen}" varStatus="status">
                            <h:selectBooleanCheckbox value="#{resultpage.filter.themenGewaehlt[status.index]}">
                                <f:ajax listener="#{resultpage.filter.zeigeEinzelneThemenClick}" render=":filterleiste_hForm:filterfrage_themen"/>
                            </h:selectBooleanCheckbox>
                            <h:outputLabel class="filterfrage_antwortcontainer filterfrage_eingerueckt" rendered="#{thema.isUnterbereich}">#{thema.darstellung}</h:outputLabel>
                            <h:outputLabel class="filterfrage_antwortcontainer" rendered="#{!thema.isUnterbereich}">#{thema.darstellung}</h:outputLabel>
                        </ui:repeat>
                    </h:panelGroup>
                    <h:commandButton type="button" class="button filterbutton" value="Filter anwenden">
                        <f:ajax render=":angebotsdarstellung" listener="#{resultpage.updateView}"/>
                    </h:commandButton>
                </div>
               [...]
            </h:form>
            </h:panelGroup>
</ui:composition>

标记为 [...],我已经删除了一些与“FILTERFRAGE THEMA”基本相同的部分,以编程方式从枚举构建复选框。

上面的组合包含在主页中,它只围绕过滤器栏(filterleiste.xhtml)和显示过滤器结果的部分(angebotsleiste.xhtml)构建结构。

<h:html
	xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<h:head>
<!-- includings css files and setting metadata -->
</h:head>
<h:body>
	<div class="container-wrap">
		<div class="container">

			<!-- some static html -->
			<section>
				<ui:include src="/WEB-INF/filterleiste.xhtml" </ui:include>
				<ui:include src="/WEB-INF/angebotscontainer.xhtml"></ui:include>
			</section>
			<!-- some more html -->
		</div>
	</div>
</h:body>
</h:html>

这是支持 bean

@ManagedBean(name = "resultpage", eager = true)
@SessionScoped
@Data
public class ResultPage {
List<Empfehlung> gefilterteEmpfehlungen;
List<Empfehlung> alleEmpfehlungen;
private AngebotsSelector angebotsSelector;
private Umfrageergebnis umfrageergebnis;
boolean tempBool;
FilterObjekt filter;
private static final Logger LOGGER = LogManager.getLogger(ResultPage.class.getName());

public ResultPage() throws KfkException {
    this.updateAll(null);
    this.filter = new FilterObjekt();
    this.gefilterteEmpfehlungen = this.filter.filtereEmpfehlungen(alleEmpfehlungen);
}

public void updateAll(AjaxBehaviorEvent event) throws KfkException {
    LOGGER.trace("Aktualisiere Datenbasis");
    this.angebotsSelector = Guice.createInjector(new KfkModul()).getInstance(AngebotsSelector.class);
    this.alleEmpfehlungen = this.angebotsSelector.ermittleEmpfehlungen(0);
    this.umfrageergebnis = this.angebotsSelector.getUmfrageergebnis();
}

public void updateView(AjaxBehaviorEvent event) {
    //this does not appear in the log
    LOGGER.debug(String.format("Updating view on filter object %S", this.filter.toString()));
    this.gefilterteEmpfehlungen = this.filter.filtereEmpfehlungen(alleEmpfehlungen);
}
}

后台的FilterObjekt 类基本上只保存所有选中复选框的属性,然后根据这些属性减少给定的列表。 所以我排除了很多实际上没有被调用的方法,因为调用它们的方法本身没有被调用。

@Data
public class FilterObjekt {

    private static final Logger LOGGER = LogManager.getLogger(FilterObjekt.class.getName());

    private Map<Integer, Boolean> themenGewaehlt;
    private boolean zeigeAlleThemen;
    private final ArrayList<Angebotsthemen> alleThemen = new ArrayList<Angebotsthemen>(
        Arrays.asList(Angebotsthemen.values()));

    private Map<Integer, Boolean> aufwaendeGewaehlt;
    private boolean zeigeAlleAufwaende;
    private final ArrayList<Zeitspannen> alleAufwaende = new ArrayList<Zeitspannen>(
        Arrays.asList(Zeitspannen.values()));

    private Map<Integer, Boolean> formateGewaehlt;
    private boolean zeigeAlleFormate;
    private final ArrayList<Formate> alleFormate = new ArrayList<Formate>(Arrays.asList(Formate.values()));

    private Map<Integer, Boolean> zeitraeumeGewaehlt;
    private boolean zeigeAlleZeitraeume;
    private final ArrayList<Zeitraeume> alleZeitraeume = new ArrayList<Zeitraeume>(Arrays.asList(Zeitraeume.values()));

    private boolean zeigeNurEmpfehlungen;
    private boolean zeigeBesuchte;

    public List<Empfehlung> filtereEmpfehlungen(List<Empfehlung> recommendationList) {
        LOGGER.traceEntry(String.format("Filtere %s Empfehlungen", recommendationList.size()));
        ArrayList<Empfehlung> result = new ArrayList<>();
        for (Empfehlung recom : recommendationList) {
            if (this.empfehlungPasstFilter(recom))
                result.add(recom);
        }
        return result;
    }
}

【问题讨论】:

  • 浏览器控制台有错误吗?在eclipse中调试它怎么样?在FacesServlet 类中设置一个断点(您需要下载 Mojarra 源代码,eclipse 会自动完成)并查看它是否被命中。您还可以在视图中设置h:messages 标签,看看那里是否有任何类型的消息。
  • 您好,感谢您的回复。我在浏览器控制台或 h:messages 标签中没有收到任何消息。我将尝试设置调试,现在我的 eclipse 没有与 glassfish 集成,因为上次我尝试它破坏了我的 glassfish 配置。我再写一次。

标签: ajax maven jsf-2


【解决方案1】:

从头开始重新安装后,它突然又可以工作了。 我真的不知道自上次以来发生了什么变化,但是我没有时间进一步调查,因此猜测这是我这边的一些错误。

【讨论】:

    猜你喜欢
    • 2014-01-18
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2013-04-09
    • 2020-02-04
    • 2011-05-27
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多