java web.xml 中的 servlet 类路径
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25763711/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
servlet-class path in web.xml
提问by user3873909
I am following http://www.vogella.com/tutorials/REST/article.htmltutorial.
我正在关注http://www.vogella.com/tutorials/REST/article.html教程。
I have created the project(Dyanamic web project) by name "JerseyDemoProject",created a package by name "Package1" and i have written the program Hello.java(which is given in the tutorial) in this package.
我创建了一个名为“JerseyDemoProject”的项目(Dyanamic web 项目),创建了一个名为“Package1”的包,我在这个包中编写了程序 Hello.java(在教程中给出)。
I have modified my web.xml as follows
我修改了我的 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">
<display-name>JerseyDemoProject</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>Package1.Hello</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>Package1</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
When i try to "Run on server" ,It gives me 404- not found error. I am using Tomcat server
当我尝试“在服务器上运行”时,它给了我 404- not found 错误。我正在使用Tomcat服务器
Hello class:
同学们好:
package Package1;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
// Plain old Java Object it does not extend as class or implements
// an interface
// The class registers its methods for the HTTP GET request using the @GET annotation.
// Using the @Produces annotation, it defines that it can deliver several MIME types,
// text, XML and HTML.
// The browser requests per default the HTML MIME type.
//Sets the path to base URL + /hello
@Path("/hello")
public class Hello {
// This method is called if TEXT_PLAIN is request
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello() {
return "Hello Jersey";
}
// This method is called if XML is request
@GET
@Produces(MediaType.TEXT_XML)
public String sayXMLHello() {
return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>";
}
// This method is called if HTML is request
@GET
@Produces(MediaType.TEXT_HTML)
public String sayHtmlHello() {
return "<html> " + "<title>" + "Hello Jersey" + "</title>"
+ "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> ";
}
}
UPDATE:
更新:
xml file:
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">
<display-name>JerseyDemoProject</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>Package1</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
class file
类文件
@Path("/hello")
public class Hello {
// This method is called if TEXT_PLAIN is request
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello() {
return "Hello Jersey";
}
// This method is called if XML is request
@GET
@Produces(MediaType.TEXT_XML)
public String sayXMLHello() {
return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>";
}
// This method is called if HTML is request
@GET
@Path("/inhtmlform")
@Produces(MediaType.TEXT_HTML)
public String sayHtmlHello() {
return "<html> " + "<title>" + "Hello Jersey" + "</title>"
+ "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> ";
}
}
URL used
使用的网址
http://localhost:8080/JerseyDemoProject/rest/hello/inhtmlform
Error shown
显示错误
HTTP Status 500 - Error instantiating servlet class com.sun.jersey.spi.container.servlet.ServletContainer
Stacktrace:
堆栈跟踪:
Exception:
javax.servlet.ServletException: Error instantiating servlet class com.sun.jersey.spi.container.servlet.ServletContainer
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Unknown Source)
Rootcause:
java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Unknown Source)
I found tese warnings in my console
我在控制台中发现了这些警告
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files (x86)\Java\jre7\bin;C:\windows\Sun\Java\bin;C:\windows\system32;C:\windows;C:/Program Files (x86)/Java/jre7/bin/client;C:/Program Files (x86)/Java/jre7/bin;C:/Program Files (x86)/Java/jre7/lib/i386;C:\product.2.0\client_1\bin;C:\Informatica1_9891_Install\java\jre\bin\server;C:\Informatica1_9891_Install\tools\odbcdrv;C:\Informatica1_9891_Install\tools\jdbcdrv;C:\Informatica1_9891_Install\tools\datadirect;C:\app\vpalagum\product.2.0\client_2\bin;C:\app\vpalagum\product.2.0\client_1;C:\Program Files (x86)\RSA SecurID Token Common;C:\Program Files\Common Files\Microsoft Shared\Microsoft Online Services;C:\Program Files (x86)\Common Files\Microsoft Shared\Microsoft Online Services;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Box\Box Edit\;C:\Program Files (x86)\Java\jdk7_u15\bin;c:\Program Files (x86)\Microsoft SQL Server\Tools\binn\;C:\Program Files\Perforce;C:\Softwares\eclipse4.2;;.
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:JerseyDemoProject' did not find a matching property.
采纳答案by user3873909
I think the problem was because i am using jersey 2.1 .I removed it,installed Jersey 1.18 JARbundle from https://jersey.java.net/download.html. I added this jar in my WEB-INF lib folder , and also added asm.jar in this folder. (This jar can be found in Jersey1.18 Zip bundle downloaded from the same site) . Then followed @SparkOn 's Answer.It worked!
我认为问题是因为我使用的是球衣 2.1。我删除了它,从https://jersey.java.net/download.html安装了 Jersey 1.18 JARbundle 。我在我的 WEB-INF lib 文件夹中添加了这个 jar,还在这个文件夹中添加了 asm.jar。(这个 jar 可以在从同一站点下载的 Jersey1.18 Zip 包中找到)。然后跟着@SparkOn 的回答。它奏效了!
回答by SparkOn
Because the url pattern specified is
因为指定的 url 模式是
<url-pattern>/rest/*</url-pattern>
Moreover your servlet tag should be like this
此外你的servlet标签应该是这样的
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>Package1</param-value>
</init-param>
</servlet>
you can specify additional path in your resource-method to call it individually like
你可以在你的资源方法中指定额外的路径来单独调用它
@Path("/hello")
public class Hello {
@GET
@Path("/intextform")
@Produces(MediaType.TEXT_PLAIN)
public String helloWorld(){
return "Hello from Jersey!";
}
}
Then right-click on the project and run on server
然后右键单击该项目并在服务器上运行
Try this url
试试这个网址
http://localhost:8080/JerseyDemoProject/rest/hello/intextform
回答by Quick_Silver
Problem is not with Jersey 2.1, problem is with your servlet class. You should use the following servlet class in your web.xml ( for all Jersey 2.x applications )
问题不在于 Jersey 2.1,问题在于您的 servlet 类。您应该在 web.xml 中使用以下 servlet 类(适用于所有 Jersey 2.x 应用程序)
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
instead of :
代替 :
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
Then everything will work fine.
然后一切都会正常进行。
Finally, your servlet should be:
最后,您的 servlet 应该是:
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>Package1</param-value>
</init-param>
</servlet>
回答by zerocool
First please replace <servlet-class>Package1.Hello</servlet-class>
with <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-cl??ass>
in your web.xml and rerun the application
首先请更换<servlet-class>Package1.Hello</servlet-class>
与<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-cl??ass>
在web.xml并重新运行该应用程序
Please try the below URL it should work:
请尝试以下网址,它应该可以工作:
http://localhost:8080/JerseyDemoProject/Package1/rest/hello
Provided that you have mapped your controller to @PATH("/hello")
前提是您已将控制器映射到 @PATH("/hello")