2012-05-10 2 views
0

Я использую Tomcat В 7, и Джесс против 7,0java.lang.NoSuchMethodError: uges.servlets.MyQuery: Метод <init>() V не найден

Это исключение я получаю

root cause 

javax.servlet.ServletException: java.lang.NoSuchMethodError: uges.servlets.MyQuery:  method <init>()V not found 
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.jav a:911) 
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:840) 
org.apache.jsp.catalog_jsp._jspService(catalog_jsp.java:121) 
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) 
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 


root cause 

java.lang.NoSuchMethodError: uges.servlets.MyQuery: method <init>()V not found 
org.apache.jsp.catalog_jsp._jspService(catalog_jsp.java:69) 
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) 
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 

и это мой исходный код класса MyQuery package uges.servlets;

import jess.*;; 

public class MyQuery 
{ 

private static QueryResult result; 
public MyQuery(Rete engine) throws JessException 
{ 
    getQuery(engine); 
} 
public QueryResult getQuery(Rete engine) throws JessException 
{ 
    result = engine.runQueryStar("all-products", new ValueVector()); 
    return result; 
} 
public String getString(String str) throws JessException 
{ 
    String srtResult; 
    srtResult = result.getString(str); 
    return srtResult; 

} 
public Float getFloat(String str) throws JessException 
{ 
    float flt; 
    flt = result.getFloat(str); 
    return flt; 

} 
public boolean next() throws JessException 
{ 
    boolean next; 
    next = result.next(); 
    return next; 

} 
} 

и это каталог Servlet пакет uges.servlets;

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

public class Catalog extends BaseServlet { 

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

    try { 
     String customerId = 
      (String) request.getParameter("customerId"); 
     if (customerId == null || customerId.length() == 0) { 
      dispatch(request, response, "/index.html"); 
      return; 
     } 

     request.getSession().invalidate(); 
     HttpSession session = request.getSession(); 

     session.setAttribute("customerId", customerId); 
     session.setAttribute("orderNumber", 
          String.valueOf(getNewOrderNumber())); 

     ServletContext servletContext = getServletContext(); 
     Rete engine = (Rete) servletContext.getAttribute("engine"); 

     //engine.reset(); 
      MyQuery result = new MyQuery(engine); 
      //engine.runQueryStar("all-products", new ValueVector()); 
      request.setAttribute("queryResult",result);    

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

    dispatch(request, response, "/catalog.jsp"); 
} 

private int getNewOrderNumber() throws JessException { 
    ServletContext servletContext = getServletContext(); 
    Rete engine = (Rete) servletContext.getAttribute("engine"); 
    int nextOrderNumber = 
     engine.executeCommand("(get-new-order-number)").intValue(null); 
    return nextOrderNumber; 
} 

public void destroy() { 
    try { 
     ServletContext servletContext = getServletContext(); 
     Rete engine = (Rete) servletContext.getAttribute("engine"); 
     String factsFileName = 
      servletContext.getInitParameter("factsfile"); 
     File factsFile = new File(factsFileName); 
     File tmpFile = 
      File.createTempFile("facts", "tmp", factsFile.getParentFile()); 
     engine.executeCommand("(save-facts " + tmpFile.getAbsolutePath() + 
           " order recommend line-item next-order-number)"); 
     factsFile.delete(); 
     tmpFile.renameTo(factsFile); 

    } catch (Exception je) { 
     // Log error 
    } 
} 


} 

СПЯ catalog.jsp

<HTML> 
<%@ page import="jess.*" %> 
<jsp:useBean id="queryResult" class="uges.servlets.MyQuery" scope="request"/> 

<HEAD> 
<TITLE>Ordering from Tekmart.com</TITLE> 
</HEAD> 

<BODY> 
<H1>Tekmart.com Catalog</H1> 
Select the items you wish to purchase and press "Check Order" to continue. 
<FORM action="/Order/recommend" method="POST"> 
<TABLE border="1"> 
<TR><TH>Name</TH> 
    <TH>Catalog #</TH> 
    <TH>Price</TH> 
    <TH>Purchase?</TH> 
</TR> 
<% while (queryResult.next()) { 
    String partNum = 
      queryResult.getString("part-number");%> 
    <TR> 
    <TD><%= queryResult.getString("name") %></TD> 
    <TD><%= queryResult.getString("part-number") %></TD> 
    <TD><%= queryResult.getFloat("price") %></TD> 
    <TD><INPUT type="checkbox" name="items" 
       value=<%= '"' + partNum + '"'%>></TD> 
    </TR> 
<% } %>     
</TABLE> 
<INPUT type="submit" value="Check Order"> 
</FORM> 
</BODY> 
</HTML> 

Любой ключ будет оценен. Спасибо,

ответ

2

JSP-движок пытается создать экземпляр вашего класса посредством отражения с помощью конструктора no-arg. Вы не определили конструктор no-arg, поэтому эта ошибка возникает. У компонента bean должен быть конструктор no-arg. Если вам нужно установить свойства в компоненте, используйте jsp:set-property.

Если вы совершенно не можете добавить конструктор без аргументов, то вы должны создать его экземпляр за пределами jsp:use-bean тега и добавьте его в надлежащий контекст самостоятельно, как и в

< % 
    pkg.Foo foo = new pcg.Foo(constructor-arg); 
    context.setAttribute("foo", foo); 
% > 

Это нарушает основное требование JavaBean для конструктор no-arg.

Я считаю, что когда он был создан в надлежащем объеме, другие JSP могут ссылаться на него с jsp:use-bean.

+0

спасибо :) но что делать, если я не могу добавить конструктор no-arg .. как я могу установить свойства? не могли бы вы привести мне пример! еще одна вещь, которую я много искал и обнаружил, что такая ошибка связана с чем-то неправильным с версиями банок! любая подсказка ?! – Lama

+0

См. Мой обновленный ответ –

+0

Спасибо за этот ответ, но почему некоторые компоненты необходимо реализовать интерфейс Serialize? –

0

У вас в сервоприводе предварительной обработки уже установить queryResult в области запроса.

request.setAttribute("queryResult",result);    

Так вы не необходимость использования <jsp:useBean> вообще. Удалить следующую строку в целом:

<jsp:useBean id="queryResult" class="uges.servlets.MyQuery" scope="request"/> 

Поскольку ваш сервлет установил его как атрибут запроса, объект уже в EL доступны по ${queryResult}. Но из-за странного дизайна самого класса трудно получить доступ к нему в EL, поэтому вам придется прибегнуть к старой школе scriptlets. Вам нужно сначала его получить request.getAttribute("queryResult").

Для лучшего подхода к проектированию проверьте servlets tag wiki page и Show JDBC ResultSet in HTML in JSP page using MVC and DAO pattern.