当前位置 : 主页 > 编程语言 > java >

jsp – java.lang.IllegalArgumentException:Servlet映射指定一个未知的servlet名称GCMBroadc

来源:互联网 收集:自由互联 发布时间:2021-06-25
我正在尝试在我的 Android应用程序中加入GCM(谷歌云消息).为此,我一直关注 this tutorial.下面的评论报告成功,所以问题肯定在我身边,而不是教程. 信息- 我正在为Java EE运行最新的Eclipse Tom
我正在尝试在我的 Android应用程序中加入GCM(谷歌云消息).为此,我一直关注 this tutorial.下面的评论报告成功,所以问题肯定在我身边,而不是教程.

信息-
我正在为Java EE运行最新的Eclipse
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

这是我的项目层次结构正是它需要的方式.

我的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>

我的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>

我的GCMBroadcast.java文件(我认为没有必要共享,但没有任何机会):

package com.avilyne.gcm;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.android.gcm.server.Message;
import com.google.android.gcm.server.MulticastResult;
import com.google.android.gcm.server.Sender;

/**
 * Servlet implementation class GCMBroadcast
 */
@WebServlet("/GCMBroadcast")
public class GCMBroadcast extends HttpServlet {
    private static final long serialVersionUID = 1L;

    // The SENDER_ID here is the "Browser Key" that was generated when I
    // created the API keys for my Google APIs project.
    private static final String SENDER_ID = "AIzaSyCWryYfPDw3Ge7oMvI2vSeRKoFvsc7yasd";

    // This is a *cheat*  It is a hard-coded registration ID from an Android device
    // that registered itself with GCM using the same project id shown above.
    private static final String DROID_BIONIC = "APA91bEju-eB74DWRChlVt5gh7YfIVzNOr8gRYPisFbmcwBPlMJeGTYmdF7cYR3oL-F9KqmTey016drxmWAkYa4WQv9pQ_KvRzI1VUkql6ObbYGPkV7UBsm6pYoBw0dEk3veh60v3lVhDtLztWIbDc3XqtjU_fE_0g";

    // This array will hold all the registration ids used to broadcast a message.
    // for this demo, it will only have the DROID_BIONIC id that was captured 
    // when we ran the Android client app through Eclipse.
    private List<String> androidTargets = new ArrayList<String>();

    /**
     * @see HttpServlet#HttpServlet()
     */
    public GCMBroadcast() {

        super();

        // we'll only add the hard-coded *cheat* target device registration id 
        // for this demo.
        androidTargets.add(DROID_BIONIC);

    }

    // This doPost() method is called from the form in our index.jsp file.
    // It will broadcast the passed "Message" value.
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // We'll collect the "CollapseKey" and "Message" values from our JSP page
        String collapseKey = "";
        String userMessage = "";

        try {
            userMessage = request.getParameter("Message");
            collapseKey = request.getParameter("CollapseKey");
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }

        // Instance of com.android.gcm.server.Sender, that does the
        // transmission of a Message to the Google Cloud Messaging service.
        Sender sender = new Sender(SENDER_ID);

        // This Message object will hold the data that is being transmitted
        // to the Android client devices.  For this demo, it is a simple text
        // string, but could certainly be a JSON object.
        Message message = new Message.Builder()

        // If multiple messages are sent using the same .collapseKey()
        // the android target device, if it was offline during earlier message
        // transmissions, will only receive the latest message for that key when
        // it goes back on-line.
        .collapseKey(collapseKey)
        .timeToLive(30)
        .delayWhileIdle(true)
        .addData("message", userMessage)
        .build();

        try {
            // use this for multicast messages.  The second parameter
            // of sender.send() will need to be an array of register ids.
            MulticastResult result = sender.send(message, androidTargets, 1);

            if (result.getResults() != null) {
                int canonicalRegId = result.getCanonicalIds();
                if (canonicalRegId != 0) {

                }
            } else {
                int error = result.getFailure();
                System.out.println("Broadcast failure: " + error);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        // We'll pass the CollapseKey and Message values back to index.jsp, only so
        // we can display it in our form again.
        request.setAttribute("CollapseKey", collapseKey);
        request.setAttribute("Message", userMessage);

        request.getRequestDispatcher("index.jsp").forward(request, response);

    }

}

在教程中,当我使用8时,这个人正在使用Tomcat 7.我不认为这应该是一个问题.
这就是我想要告诉的全部内容.排序这个问题真的非常非常有用.
我非常感谢你们所有的时间:)

您的Servlet名称不匹配. servlet和servlet-mapping标记中的servlet-name必须相同.错误消息很明确:

Caused by: java.lang.IllegalArgumentException: Servlet mapping
specifies an unknown servlet name 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>
网友评论