第二部分 servlet技术

Servlet是位于web服务器端内部的服务器端的java应用程序,可以对web浏览器和其它http客户端程序发送数据进行处理。

1. 生命周期

(1)  在web容器启动或者客户端第一次请求服务器时,容器加载servlet类并将其放到实例池中;

(2)  实例化后调用init()进行初始化操作;

(3)  容器通过service()方法处理不同的http请求,并做出响应;

(4)  关闭web容器时,容器调用destroy()方法进行资源释放,在这之后servlet对象会被当作垃圾被回收器回收。

2. 区别

 

3. 配置servlet类(web.xml)

4.Servlet运行出错

(1)首次运行错误为:

HTTP Status 500 - Error instantiating servlet class test.Test

具体错误为:
type Exception report
message Error instantiating servlet class test.Test
description The server encountered an internal error that prevented it from fulfilling this request.
exception 
javax.servlet.ServletException: Error instantiating servlet class test.Test
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:243
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:241java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)java.lang.Thread.run(Thread.java:744)

root cause 
java.lang.InstantiationExceptionsun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48)
java.lang.reflect.Constructor.newInstance(Constructor.java:526)
java.lang.Class.newInstance(Class.java:374)org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2430
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2419
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
java.lang.Thread.run(Thread.java:744)


note The full stack trace of the root cause is available in the Apache Tomcat/7.0.47 logs.

解决方法:

在书写servlet类时要系列化,即private static final longserialVersionUID = 1L;

解释:serialVersionUID 用来表明类的不同版本间的兼容性。如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会出错。为了在反序列化时,确保类版本的兼容性,最好在每个要序列化的类中加入private static final long serialVersionUID这个属性,具体数值自己定义。用来作为Java对象序列化中的版本标示之用; 
如果一个序列化类没有声明这样一个static final的产量,JVM会根据各种参数为这个类计算一个; 
对于同样一个类,不同版本的JDK可能会得出不同的serivalVersionUID;

 

(2)再次运行出错

解决方法:

去掉web.xml文件中的

<welcome-file-list> 
          <welcome-file>index.html </welcome-file> 
          <welcome-file>index.htm </welcome-file> 
          <welcome-file>index.jsp </welcome-file>              
  </welcome-file-list> 

此时可以正常运行!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐