Servlet与&之间的通信Applet在工作时失败

时间:2011-02-20 00:42:18

标签: java apache servlets applet

我有一个applet(用户登录的地方)&按下登录按钮我将登录详细信息发送到我的servlet。在我的applet中,负责将登录详细信息发送到servelt&接收servlet响应对象 FAILS

我的问题是:我不知道为什么我的函数sendObject(Object o)失败&我不知道如何解决它。你能帮我理解什么是错的吗?为什么呢?

我正在使用Apache 7.0。我认为从servlet接收响应(获取输入流)失败但我不知道为什么&登录在前几天工作正常,所以我知道我的WEB-INF文件夹设置正常& web.xml很好。

我的功能(我记录功能失败的地方):

public ArrayList <Object> sendObject( Object o )
{
    try
    {
        URL servletUrl = new URL( this.getCodeBase(), "Updater" ); // "http://localhost:8080/" );
        URLConnection conn = servletUrl.openConnection();

        conn.setDoInput( true );
        conn.setDoOutput( true );
        conn.setUseCaches( false );
        conn.setRequestProperty( "Content-Type", "application/x-java-serialized-object" );

        OutputStream out = conn.getOutputStream();
        ObjectOutputStream objOut = new ObjectOutputStream( out );
        objOut.writeObject( o ); 
        objOut.flush(); 
        objOut.close();

        // receive result from servlet
        System.out.println( "Result from applet.getCodeBase()=" + this.getCodeBase() );
     // The following line is where I get the exception thrown
        InputStream instr = conn.getInputStream();              
        ObjectInputStream inputFromServlet = new ObjectInputStream(instr);
        ArrayList <Object> result = (ArrayList <Object>) inputFromServlet.readObject();
        inputFromServlet.close();
        instr.close();

        System.out.println( "Contents of output is " );
        for (int i=0; i<result.size(); i++)
        {
            System.out.println( "" + result.get(i) );
        }

        return result;
    }
    catch ( IOException e )
    {
        System.out.println( "In sendObject(): " + e );
    }
    catch ( Exception e )
    {
        System.out.println( "In sendObject(): " + e );
    }

    return null;
}    

Java控制台输出:

  

来自applet.getCodeBase()= http://localhost:8080/Updater/的结果   在sendObject()中:java.io.IOException:服务器返回HTTP响应代码:500为URL:http://localhost:8080/Updater/Updater

从Apache日志:

  

20/02/2011 11:15:08 AM org.apache.catalina.core.ApplicationContext log
  INFO:ContextListener:contextInitialized()
  20/02/2011 11:15:08 AM org.apache.catalina.core.ApplicationContext log
  信息:SessionListener:contextInitialized()
  20/02/2011 11:15:23 AM org.apache.catalina.core.ApplicationContext log
  信息:将servlet更新程序标记为不可用
  20/02/2011 11:15:23 AM org.apache.catalina.core.StandardWrapperValve调用
  严重:为servlet更新程序分配异常
  显示java.lang.NullPointerException
      在javax.servlet.GenericServlet.getServletContext(GenericServlet.java:125)
      在UpdaterServlet。(UpdaterServlet.java:32)//请参阅下面的参见本文件的第32行
      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
      at java.lang.reflect.Constructor.newInstance(Unknown Source)
      在java.lang.Class.newInstance0(未知来源)
      在java.lang.Class.newInstance(未知来源)
      在org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:119)
      在org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1048)
      at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:799)
      在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135)
      在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
      在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
      在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
      在org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
      在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
      在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:383)
      在org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
      在org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:188)
      在org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:288)
      at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(Unknown Source)
      at java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source)
      在java.lang.Thread.run(未知来源)

... localhost_access_log:

  

127.0.0.1 - - [20 / Feb / 2011:11:15:12 +1100]“GET /Updater/index.html HTTP / 1.1”304 -
  127.0.0.1 - - [20 / Feb / 2011:11:15:15 +1100]“GET /Updater/UpdaterApplet.class HTTP / 1.1”304 -
  127.0.0.1 - - [20 / Feb / 2011:11:15:15 +1100]“GET /Updater/ContentTree.class HTTP / 1.1”304 -
  127.0.0.1 - - [20 / Feb / 2011:11:15:15 +1100]“GET /Updater/ContentMap.class HTTP / 1.1”304 -
  127.0.0.1 - - [20 / Feb / 2011:11:15:15 +1100]“GET /Updater/UpdaterApplet$1.class HTTP / 1.1”304 -
  127.0.0.1 - - [20 / Feb / 2011:11:15:15 +1100]“GET /Updater/SQLInterface.class HTTP / 1.1”304 -
  127.0.0.1 - - [20 / Feb / 2011:11:15:23 +1100]“GET /Updater/ObjSerializationInterface.class HTTP / 1.1”304 -
  127.0.0.1 - - [20 / Feb / 2011:11:15:23 +1100]“POST / Updater / Updater HTTP / 1.1”500 3117

这是UpdaterServlet.java文件(如果您在上面看到此文件第32行的错误):

public class UpdaterServlet extends HttpServlet
{
// Class Variables:
private static final long serialVersionUID = 1L;
private ArrayList <File> localDatabases;
private ArrayList <ArrayList <Object>> input;
private ArrayList <ArrayList <Object>> output;

// Class Methods:

public UpdaterServlet()
{
    getServletContext().log( "File open/created" ); // LINE 32
    localDatabases = new ArrayList <File>();

3 个答案:

答案 0 :(得分:1)

看起来getServletContext()会返回null;你是否也覆盖了init(ServletConfig)中的UpdaterServlet方法?如果是,请务必致电super.init(config)

答案 1 :(得分:1)

此NPE表示ServletConfig不存在(从ServletContext返回的位置)。这确实在servlet的构造函数中不可用。 servletcontainer在构造servlet之后将其设置为。您需要使用init()方法完成所需的工作。

@Override
public void init() {
    getServletContext().log( "File open/created" ); // LINE 32
    localDatabases = new ArrayList <File>();
    // ...
}

与具体问题无关,堆栈跟踪还暗示您的servlet在默认包中。这仅适用于非常特定的情况(某些Apache Tomcat版本与某些JDK版本结合使用)。我强烈建议将servlet类放在一个包中并相应地更改web.xml,这样你就不再依赖它了。

答案 2 :(得分:0)

那么,您的网络服务器是否知道在/Updater/Updater上该做什么?看起来不像。看一下错误日志,应该有更多的信息。