Communication between Servlet & Applet fails when it was working
I have an applet (where the user logins) & on pressing login button I send the login details to my servlet. In my applet, the function responsible for sending the login details to the servelt & receiving the servlet response object FAILS.
My problem is: I dont know why my function sendObject( Object o ) fails & I dont know how to fix it. Could you help me understand what is wrong & why?
I am using Apache 7.0. I think that receiving the response (getting the input stream) from the servlet fails but I dont know why & logging in was working fine the other day so I know my WEB-INF folder is set up fine & the web.xml is fine.
My function (I document where the function fails):
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 Console Output:
Result from applet.getCodeBase() = http://localhost:8080/Updater/
In sendObject(): java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:8080/Updater/Updater
From the Apache log:
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 INFO: SessionListener: contextInitialized() 20/02/2011 11:15:23 AM org.apache.catalina.core.ApplicationContext log INFO: Marking servlet Updater as unavailable 20/02/2011 11:15:23 AM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Allocate exception for servlet Updater java.lang.NullPointerException at javax.servlet.GenericServlet.getServletContext(GenericServlet.java:125) at UpdaterServlet.(UpdaterServlet.java:32) // REFER BELOW TO SEE LINE 32 OF THIS FILE 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 S开发者_Python百科ource) at java.lang.Class.newInstance0(Unknown Source) at java.lang.Class.newInstance(Unknown Source) at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:119) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1048) at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:799) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:383) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) at 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) at java.lang.Thread.run(Unknown Source)
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
This is the UpdaterServlet.java file (if you see above theres an error at line 32 of this file):
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>();
It looks like getServletContext()
returns null
; are you also overriding the init(ServletConfig)
method in the UpdaterServlet
? If so, make sure to call super.init(config)
.
This NPE means that the ServletConfig
is not present (from where the ServletContext
is to be returned). This is indeed not available in the constructor of the servlet. The servletcontainer sets it after construction of the servlet. You need to do the desired job in init()
method instead.
@Override
public void init() {
getServletContext().log( "File open/created" ); // LINE 32
localDatabases = new ArrayList <File>();
// ...
}
Unrelated to the concrete problem, the stacktrace also hints that your servlet is in the default package. This will only work in very specific circumstances (certain Apache Tomcat versions in combination with certain JDK versions). I strongly recommend to put the servlet class in a package and alter the web.xml
accordingly so that you aren't dependent on that anymore.
So, does your webserver know what to do on /Updater/Updater
? It looks like not. Take a look at the error log, there should be more information.
精彩评论