Jsp java.lang.IllegalArgumentException:Servlet映射指定未知的Servlet名称GCMBroadcast

Jsp java.lang.IllegalArgumentException:Servlet映射指定未知的Servlet名称GCMBroadcast,jsp,tomcat,servlets,illegalargumentexception,servlet-mapping,Jsp,Tomcat,Servlets,Illegalargumentexception,Servlet Mapping,我正试图在我的android应用程序中加入GCM(谷歌云消息)。为此,我一直在关注。下面的评论报告了成功,所以问题肯定在我这边,而不是教程 信息- 我正在运行最新的Eclipse for Java EE Tomcat版本8(最新版本) 这是尝试运行tomcat服务器时出现的控制台错误: Caused by: java.lang.IllegalArgumentException: Servlet mapping specifies an unknown servlet name GCMBr

我正试图在我的android应用程序中加入GCM(谷歌云消息)。为此,我一直在关注。下面的评论报告了成功,所以问题肯定在我这边,而不是教程

信息- 我正在运行最新的Eclipse for Java EE Tomcat版本8(最新版本)

这是尝试运行tomcat服务器时出现的控制台错误:

    Caused by: java.lang.IllegalArgumentException: Servlet mapping specifies an unknown servlet name GCMBroadcast
        at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:3071)
        at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:3050)
        at org.apache.catalina.startup.ContextConfig.configureContext(ContextConfig.java:1372)
        at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1176)
        at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:771)
        at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:305)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5066)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        ... 6 more
下面是我的项目层次结构,它正是需要的

My web.xml代码:

    <?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID"
    version="3.0">
    <servlet>
        <servlet-name>com.avilyne.gcm.GCMBroadcast</servlet-name>
        <servlet-class>com.avilyne.gcm.GCMBroadcast</servlet-class>
    </servlet> 
    <servlet-mapping>
        <servlet-name>GCMBroadcast</servlet-name>
        <url-pattern>/gcmbroadcast</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

com.avilyne.gcm.GCMBroadcast
com.avilyne.gcm.GCMBroadcast
GCMBroadcast
/gcmbroadcast
index.jsp
My index.jsp文件:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<%
    // retrieve our passed CollapseKey and Message parameters, if they exist.
    String collapseKey = "GCM_Message";
    String message  = "Generic Broadcast Message";

    Object collapseKeyObj =  request.getAttribute("CollapseKey");

    if (collapseKeyObj != null) {
        collapseKey = collapseKeyObj.toString();
    }

    Object msgObj =  request.getAttribute("Message");

    if (msgObj != null) {
        message = msgObj.toString();
    }

%>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Android GCM Broadcast</title>

</head>
<body>

    <h2>GCM Broadcast Demo</h2>

    <form action="GCMBroadcast" method="post">
        <label>Broadcast Message </label>
        <br /><input type="text" name="CollapseKey" value="<%=collapseKey %>" />
        <br/><textarea name="Message" rows="3" cols="60" ><%=message %> </textarea> 
        <br/><input type="submit" name="submit" value="Submit" />
        </form>   
    </body>
</html>

Android GCM广播
GCM广播演示
广播信息



我的GCMBroadcast.java文件(我认为没有必要共享该文件,但我不会冒险):

package com.avilyne.gcm;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入javax.servlet.ServletException;
导入javax.servlet.annotation.*;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入com.google.android.gcm.server.Message;
导入com.google.android.gcm.server.multicastersult;
导入com.google.android.gcm.server.Sender;
/**
*Servlet实现类GCMBroadcast
*/
@WebServlet(“/GCMBroadcast”)
公共类GCMBroadcast扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
//这里的发送者ID是我创建时生成的“浏览器密钥”
//为我的Google API项目创建了API密钥。
私有静态最终字符串发送器\u ID=“aizasycwryyyfpdw3ge7omvi2vserkofvsc7yasd”;
//这是一个*作弊*它是来自Android设备的硬编码注册ID
//使用上面显示的相同项目id向GCM注册。
私人静态最终字符串机器人_BIONIC=“APA91bEju-EB74DWRCHLVT5GH7YFIVZNOR8GryPSFBMCWPLMJEGTYMDF7CYR3OL-F9KqmTey016drxmWAkYa4WQv9pQ_KVRZI1VUKQL6OBBYGPKV7UBSM6PYOBW0DEK3VEH60V3LVHDTLZTLZTWIBDxQTJU_”;
//此数组将保存用于广播消息的所有注册ID。
//对于这个演示,它将只有被捕获的DROID_仿生id
//当我们通过Eclipse运行Android客户端应用程序时。
私有列表androidTargets=new ArrayList();
/**
*@参见HttpServlet#HttpServlet()
*/
公共GCMBroadcast(){
超级();
//我们将只添加硬编码的*作弊*目标设备注册id
//为了这个演示。
androidTargets.add(DROID_仿生);
}
//这个doPost()方法是从index.jsp文件中的表单调用的。
//它将广播传递的“消息”值。
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)引发ServletException、IOException{
//我们将从JSP页面收集“CollapseKey”和“Message”值
字符串collapseKey=“”;
字符串userMessage=“”;
试一试{
userMessage=request.getParameter(“消息”);
collapseKey=request.getParameter(“collapseKey”);
}捕获(例外e){
e、 printStackTrace();
返回;
}
//com.android.gcm.server.Sender的实例,该实例执行
//将消息传输到Google云消息服务。
发送方=新发送方(发送方ID);
//此消息对象将保存正在传输的数据
//对于这个演示,它是一个简单的文本
//字符串,但肯定可以是JSON对象。
Message Message=new Message.Builder()
//如果使用相同的.collapseKey()发送多条消息
//android目标设备,如果在之前的消息中处于脱机状态
//传输时,将仅在以下情况下接收该密钥的最新消息:
//它回到了在线状态。
.collapseKey(collapseKey)
.timeToLive(30)
.delayWhileIdle(真)
.addData(“消息”,用户消息)
.build();
试一试{
//用于多播消息。第二个参数
//sender.send()的值必须是寄存器ID的数组。
multicastersult result=sender.send(message,androidTargets,1);
if(result.getResults()!=null){
int canonicalRegId=result.getCanonicalId();
如果(canonicalRegId!=0){
}
}否则{
int error=result.getFailure();
System.out.println(“广播故障:+错误”);
}
}捕获(例外e){
e、 printStackTrace();
}
//我们将把CollapseKey和Message值传递回index.jsp,仅此而已
//我们可以在表单中再次显示它。
setAttribute(“CollapseKey”,CollapseKey);
setAttribute(“Message”,userMessage);
getRequestDispatcher(“index.jsp”).forward(请求、响应);
}
}
在教程中,这家伙在使用Tomcat7,而我在使用8。我认为这不应该是个问题。 我想这就是我要说的。对这个问题进行分类将非常非常有帮助。
我非常感谢大家抽出时间:)

您的Servlet名称不匹配。servlet和servlet映射标记中的servlet名称必须相同。错误消息很清楚:

原因:java.lang.IllegalArgumentException:Servlet映射 指定未知的servlet名称GCMBroadcast

尝试:

 <servlet>
        <servlet-name>GCMBroadcast</servlet-name>
        <servlet-class>com.avilyne.gcm.GCMBroadcast</servlet-class>
    </servlet> 
    <servlet-mapping>
        <servlet-name>GCMBroadcast</servlet-name>
        <url-pattern>/gcmbroadcast</url-pattern>
    </servlet-mapping>

GCMBroadcast
com.avilyne.gcm.GCMBroadcast
GCMBroadcast
/gcmbroadcast

OMG是的,谢谢!我必须根据一个指南更改第一个serverlet名称,该指南中说
 <servlet>
        <servlet-name>GCMBroadcast</servlet-name>
        <servlet-class>com.avilyne.gcm.GCMBroadcast</servlet-class>
    </servlet> 
    <servlet-mapping>
        <servlet-name>GCMBroadcast</servlet-name>
        <url-pattern>/gcmbroadcast</url-pattern>
    </servlet-mapping>