我有一个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>();
答案 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
上该做什么?看起来不像。看一下错误日志,应该有更多的信息。