Apache Tomcat 서버를 통해 작은 Jess 애플리케이션을 코딩하고 있습니다. 나는 사용자로부터 입력을 받아서 Jess 결과를 출력하기 위해 서블릿을 사용하고있다. Tomcat 디렉토리의 webapps 아래 폴더에 내 파일이 있습니다. 예외 나 오류가 기록되지는 않지만 jess.jar에서 결과 목록을 반환하는 응용 프로그램의 마지막 단계가 작동하지 않습니다.Iessator는 Jess 서블릿 애플리케이션에 대한 결과를 반환하지 않습니다.
사용자의 질문은 jess .clp 파일의 'java.util.Iterator'를 통해 jsp에 성공적으로로드됩니다. 클래스 파일은 답변을 jess 슬롯에 넣은 다음 규칙에서 생성 된 사실을 반환하는 다음 두 단계를 수행하도록 코딩됩니다. 질문에 대한 답변을 슬롯에 넣는 두 번째 단계가 효과가 있다고 생각하지만 작성된 사실을 표시하는 마지막 단계는 효과가 없습니다.
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);
}
}
}
반복자 ITER 질문 결과 벌금을 표시하는 이전 서블릿에서 추가 제스에서 쿼리 결과 : 일부 지원을하시기 바랍니다 제공 할 수있는 경우
나는 아래의 질문에 자바 코드를 붙여 넣습니다. 위의 코드에서 iter.hasNext()는 41 행에서 작동하고 ident의 슬롯 값을 오류없이 전달합니다. 나는 'ident'와 'text'의 슬롯 값을 사용하여 질문에 대한 응답으로 답변을 작성합니다. 이 단계에서는 명백한 오류가 발생하지 않습니다.
마지막 단계는 주장 된 답변 사실에서 생성 된 결과 사실을 수집하는 것이지만 수집하는 것으로 보이는 분석 사실은 없습니까? 43 행의 if-else 문이 실행되고 'results.jsp'가 아닌 'error-results.html'이 표시됩니다. 내 오류가 무엇입니까? 기본적으로 Iterator 결과는 어떤 이유로 든 다음에 없다고 생각합니다.
내 Jess .clp 파일을 붙여 넣습니다. 다른 사람이 볼 필요가 있습니다.
감사합니다. 감사합니다.
의견에 감사드립니다. 나는 그것이 도움이 될 수 있다고 확신한다, 나는 그것을 통해 일하고 다시 게시 할 것이다. 나는 (.clp 파일에) 모든 것을 보았고, 아무런 대답도 없다는 사실이 사용자 입력으로부터 주장 된 것처럼 보인다. 위의 내부 if 문을 사용하는 while 루프는 Jess 작업 메모리에 답변 사실을 추가하지 않는다는 것을 의미한다. 이것은 저에게 작업 할 무언가를 주었고 여러분의 의견과 함께 제가 더 살펴 보겠습니다. – Zain