学习Servlet时碰到的一个bug。
Connected to server
[2017-01-08 04:40:33,100] Artifact jspRun:war exploded: Artifact is being deployed, please wait...
08-Jan-2017 16:40:33.570 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Servlet]]
at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:441)
说说解决的思路:
因为不记得对项目做了哪些更改,所以
重新配置一次Servlet环境,没有出现任何问题。
说明我们Tomcat与Intellij是没有问题的。
那么问题只能出现在:
1、代码问题。
2、当前项目属性设置问题。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
/**
* Created by N3verL4nd on 2017/1/4.
*/
@WebServlet(name = "testServlet", urlPatterns = {"test.do"})
public class testServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>TEST</title>");
out.println("</head>");
out.println("<body>");
out.println(request.getRequestURI() + "<br />");
out.println(request.getContextPath() + "<br />");
out.println(request.getServletPath() + "<br />");
Enumeration<String> names = request.getHeaderNames();
while (names.hasMoreElements()){
String name = names.nextElement();
out.println(name + ":" + request.getHeader(name) + "<br />");
}
out.println("</body>");
out.println("</html>");
out.close();
}
}
以上是测试代码,经检查是
@WebServlet(name = "testServlet", urlPatterns = {"test.do"})
使用出错。
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
public @interface WebServlet
This annotation is used to declare the configuration of an Servlet .
If the name attribute is not defined, the fully qualified name of the class is used.
At least one URL pattern MUST be declared in either the value or urlPattern attribute of the annotation, but not both.
The value attribute is recommended for use when the URL pattern is the only attribute being set, otherwise the urlPattern attribute should be used.
The class on which this annotation is declared MUST extend HttpServlet .
E.g. @WebServlet("/path")}
public class TestServlet extends HttpServlet ... {
E.g. @WebServlet(name="TestServlet", urlPatterns={"/path", "/alt"})
public class TestServlet extends HttpServlet ... {
Since:
Servlet 3.0 (Section 8.1.1)
|
使用@WebServlet将一个继承于javax.servlet.http.HttpServlet的类定义为Servlet组件。
@WebServlet有很多的属性:
asyncSupported:声明Servlet是否支持异步操作模式。
description: Servlet的描述。
displayName: Servlet的显示名称。
initParams: Servlet的init参数。
name: Servlet的名称。
urlPatterns: Servlet的访问URL。
value: Servlet的访问URL。
Servlet的访问URL是Servlet的必选属性,可以选择使用urlPatterns或者value定义。
urlPatterns或者value的写法有以下几种:
1.完全匹配 要求以/开始,名称与url一致.
2.使用通配符 *
3.目录匹配 以/开始,以*结束.
4.扩展名匹配. 不能以/开始,以*.xxx对束
参考:
http://www.cnblogs.com/fangjian0423/p/servletContainer-tomcat-urlPattern.html
详细解释:
@WebServlet
@WebServlet 用于将一个类声明为 Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为 Servlet。该注解具有下表给出的一些常用属性(以下所有属性均为可选属性,但是 vlaue 或者 urlPatterns 通常是必需的,且二者不能共存,如果同时指定,通常是忽略 value 的取值):
表 1. @WebServlet 主要属性列表
属性名
类型
描述
name |
String |
指定 Servlet 的 name 属性,等价于 <servlet-name>。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。 |
value |
String[] |
该属性等价于 urlPatterns 属性。两个属性不能同时使用。 |
urlPatterns |
String[] |
指定一组 Servlet 的 URL 匹配模式。等价于 <url-pattern> 标签。 |
loadOnStartup |
int |
指定 Servlet 的加载顺序,等价于 <load-on-startup> 标签。 |
initParams |
WebInitParam[] |
指定一组 Servlet 初始化参数,等价于 <init-param> 标签。 |
asyncSupported |
boolean |
声明 Servlet 是否支持异步操作模式,等价于 <async-supported> 标签。 |
description |
String |
该 Servlet 的描述信息,等价于 <description> 标签。 |
displayName |
String |
该 Servlet 的显示名,通常配合工具使用,等价于 <display-name> 标签。 |
下面是一个简单的示例:
@WebServlet(urlPatterns = {"/simple"}, asyncSupported = true,
loadOnStartup = -1, name = "SimpleServlet", displayName = "ss",
initParams = {@WebInitParam(name = "username", value = "tom")}
)
public class SimpleServlet extends HttpServlet{ … }
如此配置之后,就可以不必在 web.xml 中配置相应的 <servlet> 和 <servlet-mapping> 元素了,容器会在部署时根据指定的属性将该类发布为 Servlet。它的等价的 web.xml 配置形式如下:
<servlet>
<display-name>ss</display-name>
<servlet-name>SimpleServlet</servlet-name>
<servlet-class>footmark.servlet.SimpleServlet</servlet-class>
<load-on-startup>-1</load-on-startup>
<async-supported>true</async-supported>
<init-param>
<param-name>username</param-name>
<param-value>tom</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SimpleServlet</servlet-name>
<url-pattern>/simple</url-pattern>
</servlet-mapping>
分享到:
相关推荐
严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Error-附件资源
3. **Java代码中的异常处理**: - 在Servlet或JSP中,你可以使用`try-catch`语句块来捕获和处理异常。例如: ```java try { // 代码可能抛出异常的地方 } catch (Exception e) { // 处理异常,可能包括记录...
- **RMI-IIOP**:RMI-IIOP允许RMI与CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)协议进行互操作,扩大了RMI的适用范围。 - **EJB**:在J2EE体系中,EJB(Enterprise JavaBeans)...
在这个名为“RMI-File-Submission-System-master”的项目中,我们看到了一个利用RMI实现的文件提交系统。下面将详细解析这个系统的实现原理和关键知识点。 首先,RMI的核心概念是分布式计算,它使得不同计算机间的...
《RMI-EA-Pro-V2.6-demo_mt4_:智能交易系统在Metatrader 4平台的应用详解》 RMI EA Pro V2.6 (demo) 是一款专为MetaTrader 4(MT4)交易平台设计的智能交易系统(Expert Advisor,简称EA),其主要功能是自动化...
在这个名为"java-RMI-math-operator-server-client.zip_Math Class"的项目中,我们可以看到一个简单的Java RMI实现,用于执行基本的数学运算。 该项目的核心在于实现一个远程接口,该接口定义了可以在服务器上执行...
《RMI多核MIPS CPU程序手册》是针对RMI公司设计的基于MIPS架构的多核处理器的编程指南。这份文档,XLR_Programmers_Manual_Revision_2.01.pdf,提供了全面的指导,帮助开发者理解和利用RMI多核MIPS处理器的特性进行...
在这个"RMI-remote-file-transfer.rar"项目中,我们看到的是一个利用RMI实现在不同计算机之间进行文件传输的应用。 首先,我们要理解RMI的基本原理。RMI系统包含两部分:服务器端(Server)和客户端(Client)。...
jar包,官方版本,自测可用
3. 集成文档:可能包含了如何将RMI与Spring框架整合的教程,指导开发者如何在Spring环境中使用RMI-IIOP实现服务的发布和消费。 4. 相关资料:可能包含了关于RMI、IIOP和CORBA的基础知识,以及相关的技术文章和研究,...
【rmi-lite 1.0】是一个轻量级的Java Remote Method Invocation (RMI)实现,它是Java RMI技术的一个简化版本,适用于那些不需要完整RMI功能但仍然希望利用远程对象交互的项目。RMI是Java平台上的一个核心特性,它...
jar包,官方版本,自测可用
java rmi上传文件 在这次的项目中,对于客户端与服务器之间的通信,想了许多办法,由于做的是富客户端应用,最终将技术选定在了RMI和Java-sockets两种之间,其中RMI的灵活性不高,客户端和服务器端都必须是java编写...
jar包,官方版本,自测可用
做为java分布式计算的基础... 3.RMI服务器实现及编码 4.RMI客户机实现及编码 5.使RMI穿过防火墙--定制rmiSocket 6.Spring中的rmi应用 7.类似RMI的相关开源技术实现 -------具体请下载附件或登陆www.NetJava.cn
Java RMI(Remote Method Invocation,远程方法调用)是一种在分布式环境中实现对象间通信的技术,它允许一个Java对象调用另一个在不同Java虚拟机(JVM)上的对象的方法。RMI是Java EE平台中的核心组件之一,常用于...
3. **ORB(对象请求代理)**:在RMI-IIOP中,ORB是关键组件,负责解析和转发客户端的请求,以及将结果返回给客户端。 **客户端服务器交互流程:** 1. **客户端初始化ORB**:客户端创建ORB实例,设置必要的配置,如...
3. **Replication拦截器**:可能基于FT-CORBA的实现,确保RMI调用的结果在多个节点间同步,以实现数据复制和高可用性。 4. **配置系统**:允许用户根据需求配置拦截器链,选择启用哪些拦截器,以及如何设置多播和...
jar包,官方版本,自测可用