2014-03-25 4 views
0

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 파일을 붙여 넣습니다. 다른 사람이 볼 필요가 있습니다.

감사합니다. 감사합니다.

답변

0

우선 쿼리 결과는 내부 데이터 구조를 가리키는 포인터이며 일시적인 것입니다. 당신은 즉시 그들을 소비하기위한 것입니다. 위의 코드에서 나는 Rete.run()을 호출하고 이전에 실행 된 쿼리의 결과를 반복하기 전에 많은 수의 사실을 주장합니다. 그렇게하지 마! 쿼리를 실행 한 후에는 필요한 결과를 즉시 어떤 종류의 컬렉션 (List 또는 Map)으로 추출한 다음 필요에 따라 해당 컬렉션을 전달해야합니다.

둘째, *.clp 파일을 진단해야합니다.하지만 필자는 그렇게 생각하지 않습니다. 차라리 직접 도와 줄 수는 있습니다. 네 가지 중 하나가 여기서 잘못 될 것입니다.

  1. 쿼리 결과를 사용하는 방식이 문제가됩니다.
  2. 여기에 주장 된 사실은 정확하지 않습니다.
  3. 규칙에 따라 원하는 결과가 산출되지 않습니다.
  4. 쿼리 all-analysis은 예상 한 결과를 반환하지 않습니다.

당신이해야 할 일은 문제를 발견 할 때까지 이들 각각을 순서대로 반증하는 것입니다. 먼저, 쿼리 결과가 사용 직후에만 사용되도록 프로그램을 수정하고 확실히은 반복 할 때 사실을 주장하지 않습니다!

둘째, 새 사실을 여기에 표시하고 확인한 후에 작업 메모리 내용을 덤프하려면 Jess 기능 (예 : save-facts 기능)을 사용하십시오.

셋째, run() 다음에 save-facts을 다시 사용하여 찾고있는 답변이 실제로 존재하는지 확인하십시오.

마지막으로 여전히 최종 결과가 올바른 결과를 제공하지 않으면 올바르지 않으므로 자세히 살펴보십시오!

행운을 비네.

+0

의견에 감사드립니다. 나는 그것이 도움이 될 수 있다고 확신한다, 나는 그것을 통해 일하고 다시 게시 할 것이다. 나는 (.clp 파일에) 모든 것을 보았고, 아무런 대답도 없다는 사실이 사용자 입력으로부터 주장 된 것처럼 보인다. 위의 내부 if 문을 사용하는 while 루프는 Jess 작업 메모리에 답변 사실을 추가하지 않는다는 것을 의미한다. 이것은 저에게 작업 할 무언가를 주었고 여러분의 의견과 함께 제가 더 살펴 보겠습니다. – Zain