gpt4 book ai didi

jsp - java.lang.IllegalArgumentException : Servlet mapping specifies an unknown servlet name GCMBroadcast 异常

转载 作者:行者123 更新时间:2023-11-28 21:46:38 28 4
gpt4 key购买 nike

我正在尝试将 GCM(Google 云消息传递)整合到我的 Android 应用程序中。为此,我一直在关注this tutorial .它下面的评论报告成功,所以问题肯定在我这边,而不是教程。

信息-我正在为 Java EE 运行最新的 EclipseTomcat 版本 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);

}

}

在教程中,这个人使用的是 Tomcat 7,而我使用的是 Tomcat 8。我认为这应该不是问题。我想这就是我需要告诉的全部内容。解决这个问题真的非常非常有帮助。我提前感谢大家抽出时间:)

最佳答案

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

关于jsp - java.lang.IllegalArgumentException : Servlet mapping specifies an unknown servlet name GCMBroadcast 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31709397/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com