java - 迭代器不返回 Jess servlet 应用程序的结果

标签 java jsp tomcat servlets jess

我正在通过 Apache Tomcat 服务器编写一个小型 Jess 应用程序。我正在使用 servlet 来获取用户的输入并输出 Jess 结果。我的文件位于 Tomcat 目录中 webapps 下的一个文件夹中。我没有记录任何异常或错误,但从 jess.jar 返回结果列表的应用程序的最后阶段不起作用。

用户的问题通过“java.util.Iterator”从 jess .clp 文件成功加载到 jsp 上。一个类文件被编码以执行接下来的两个步骤,将答案放入 jess 槽中,然后从规则中返回结果创建的事实。我认为将问题的答案放入插槽的第二步是有效的,但显示创建的事实的最后一步是行不通的。

如果可以提供一些帮助,我将在下面粘贴有问题的 java 代码:

import jess.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Iterator;

public class Results extends BaseServlet {

public void doGet(HttpServletRequest request,
                   HttpServletResponse response)
    throws IOException, ServletException {
    checkInitialized();

    ServletContext servletContext = getServletContext();
    Iterator iter = (Iterator)request.getSession().getAttribute("queryResult1"); 
    String[] answers = (String[]) request.getParameterValues("answers");
    String sessionNumberString =
        (String) request.getSession().getAttribute("sessionNumber");
    String userNameString =
        (String) request.getSession().getAttribute("username");
    if (answers == null ||
        sessionNumberString == null || userNameString == null) {
        dispatch(request, response, "/index.html");
        return;
    }

    try {
        Rete engine = (Rete) servletContext.getAttribute("engine");

        engine.run();

        int sessionNumber = Integer.parseInt(sessionNumberString);
        Value sessionNumberValue = new Value(sessionNumber, RU.INTEGER);
        Value userNameValue = new Value(userNameString, RU.ATOM);
        Fact session = new Fact("session", engine);
        session.setSlotValue("session-number", sessionNumberValue);
        session.setSlotValue("user-name", userNameValue);
        engine.assertFact(session);


         while (iter.hasNext()) {
                Token token = (Token) iter.next();
                Fact fact = token.fact(1);
                String identity =
                    fact.getSlotValue("ident").stringValue(null);

                for (int i=0; i<answers.length; ++i) {
                Fact answer = new Fact("answer", engine);
                answer.setSlotValue("ident", new Value(identity, RU.ATOM));
                answer.setSlotValue("text", new Value(answers[i], RU.ATOM));
                engine.assertFact(answer);
            }
        }

        engine.run();
        Iterator result =
            engine.runQuery("all-analysis", new ValueVector());

        if (result.hasNext()) {
            request.setAttribute("queryResult2", result);
            dispatch(request, response, "/results.jsp");
        } else
            dispatch(request, response, "/error-results.html");

    } catch (JessException je) {
        throw new ServletException(je);
    }

}
}

Iterator iter 是从前面的servlet 追加的jess 的查询结果,它可以很好地显示问题结果。在上面的代码中,iter.hasNext() 似乎在第 41 行附近工作,并且没有错误地传递了 ident 的槽值。我希望 'ident' 和 'text' 的槽值按照问题被回答的顺序创建答案 detemplate 事实。此步骤不会产生明显的错误。

最后一步是从断言的答案事实中收集创建的结果事实,但似乎没有收集分析事实?第 43 行的 if-else 语句被执行并显示“error-results.html”而不是我想要的“results.jsp”。我的错误是什么?基本上我认为 Iterator 结果由于某种原因没有下一个。

我将粘贴我的 Jess .clp 文件,有人需要查看它。

感谢您的帮助,谢谢。

最佳答案

首先,查询结果是指向内部数据结构的指针,因此它们是 transient 的。您打算立即食用它们。在上面的代码中,我看到您调用了 Rete.run() 并在遍历先前执行的查询结果之前断言了一些事实。不要那样做!运行查询后,您应该立即将所需的结果提取到某种集合(ListMap)中,然后根据需要传递该集合。

其次,我们需要查看*.clp 文件来对此进行诊断,但我认为我们不应该——我宁愿帮助您自己做。这里一定有四件事之一出错了:

  1. 您使用查询结果的方式是破坏性的;
  2. 您认为此处所断言的事实不正确;
  3. 规则没有产生您期望的结果;
  4. 查询 all-analysis 没有返回您期望的结果。

您需要做的是依次反驳这些,直到找到问题为止。首先,修改程序,使查询结果仅在使用后立即使用,并且绝对在遍历它们时不要断言事实!

其次,在您断言并检查新事实后,使用 Jess 工具(如 save-facts 函数)转储工作内存的内容。

第三,在 run() 之后再次使用 save-facts,再次检查您要查找的答案是否确实存在。

最后,如果你的最终查询仍然没有给出正确的结果,那么它一定是不正确的,所以仔细看看吧!

祝您顺利找到问题。

关于java - 迭代器不返回 Jess servlet 应用程序的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22640445/

相关文章:

java - 使用用户定义的方法在java中将行打印到控制台

java - 如何将 URL 作为路径变量传递

java - 在域外使用 Java 进行 NTLM 身份验证

jsp - EL中逻辑运算符 "not"是什么意思

java - windows下tomcat中的system.out.println写到哪里了?

tomcat8 正在运行,但没有 pid 文件

java - Tomcat5.5中的上下文信息

java - 当存在重复标签时,在JAVA中解析XML

java - 显示映射的 2 个表的结果后,我应该在哪里关闭 Hibernate session 对象?

java - 包括一些返回 401 的页面