严重 [RMI TCP Connection(3)-127.0.0.1]

学习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>


  • 20
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
### 回答1: rmi tcp connection(3)-127...1 是指使用 RMI(远程方法调用)协议建立的 TCP 连接,连接的目标地址是本地主机(127...1)。这个连接编号为 3。RMI 是 Java 中用于实现远程方法调用的技术,可以让不同的 Java 程序在不同的机器上相互调用方法,实现分布式计算。 ### 回答2: RMI(远程方法调用)是Java编程语言中的一种机制,它让分布在网络的不同系统之间的Java对象能够相互调用,从而实现分布式计算。在RMI中,TCP/IP是通信协议的基础。 在RMI中,127.0.0.1代表本地回送地址,也就是指本机自己。当我们启用RMI服务时,我们需要在本机上启用RMI服务端,该服务端会监听某个固定的端口,等待客户端的请求。客户端则通过向服务器指定IP地址和端口号来连接到RMI服务端。 当我们在本机上启动一个RMI服务端时,我们需要指定该服务端要监听的端口号。此时,如果客户端和服务端都在同一台机器上,我们可以使用127.0.0.1作为IP地址来让客户端连接到本机上的服务端。此时,在连接信息中,会显示类似于“rmi tcp connection(3)-127.0.0.1”的信息,其中的“3”代表连接的端口号,而“127.0.0.1”代表连接的IP地址,也就是本机自己。 在实际开发中,我们可以使用RMI来实现分布式计算,比如在多台机器之间共享计算资源、分担计算任务等。由于RMI使用TCP/IP协议进行通信,因此可以保证通信的可靠性和稳定性。同时,RMI也提供了多种安全机制,可以保证在分布式计算的应用中,数据的安全性和完整性。 ### 回答3: RMI是一种Java远程方法调用的技术,用于在Java应用程序之间进行远程调用。这些应用程序可以运行在不同的机器上而不仅仅是本机,因此需要通过TCP连接来进行通信。而127.0.0.1是本机地址,表示的是本机的网络接口,也就是说,RMI TCP Connection(3)-127.0.0.1是指在本机上的第三个RMI连接。 在Java中,使用RMI可以将一个Java对象的方法暴露给其他Java应用程序调用,而且不需要了解对象方法的实现细节,只需要知道方法的接口即可。RMI中使用了Java的序列化机制来保证所调用的对象可以在不同的虚拟机、不同的机器之间进行传输。因此,RMI连接需要使用TCP进行通信,而127.0.0.1可以用来表示连接是在本机上进行的。 RMI TCP Connection(3)-127.0.0.1RMI开启的第三个TCP连接,在本机上进行。启动RMI服务后,RMI会创建一个RMI注册表作为服务器,并等待客户端的连接。当客户端需要调用远程对象的方法时,就需要开启一个TCP连接来进行通信。当第三个客户端连接上来时,RMI会将其标识为RMI TCP Connection(3)-127.0.0.1。如果有更多的客户端连接上来,将按照相同的格式增加序号。 总之,RMI TCP Connection(3)-127.0.0.1实际上是RMI服务在本地机器上的一个TCP连接,标识了该连接的顺序和本地IP地址。这个连接是用来进行远程方法调用的,在Java应用程序之间传输对象及其方法调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

N3verL4nd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值