在 Azure Tomcat 上部署 Java Web 应用程序和 Web 服务的区别
Difference in deploying Java web application and web service on Azure Tomcat
我在 Azure 的 Tomcat servlet 容器上部署时遇到了问题。我通过 FTP 连接到创建的网络应用程序 space,将 war
文件复制到正确的文件夹。
myWebApp
我已经在 Azure 上成功部署了一个 Spring MVC 简单 Web 应用程序。 URL 模式如下,两者均按预期工作:
http://myWebApp.azurewebsites.net/myWebApp
部署在 Azure 上 Tomcat
http://localhost:8080/myWebApp
部署在本地 Tomcat
密钥文件在下面web.xml
:
<web-app ... xsd schemas ... >
<display-name>myWebApp</display-name>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>... not important ...</context-param>
<listener>... not important ...</listener>
</web-app>
myWebService
好吧,当我想以同样的方式部署一个简单的 Web 服务并查看其内容时,问题就来了。
我决定使用 jersey
库。这是唯一的示例 class:
@Path("Sample")
public class Sample {
@GET
@Path("/")
@Produces(MediaType.TEXT_XML)
public String Method() {
return "<tag>" + 123 + "</tag>";
}
}
在 clean install
和 运行ning 在 URL http://localhost:8080/myWebService/Sample
上的本地 Tomcat 服务器上之后,它正确地给了我 XML <tag>123</tag>"
.
我希望像以前的 myWebApp 一样在 Azure 上部署,并尝试在 URL http://myWebService.azurewebsites.net/myWebService
上 运行。它给了我 404
错误,说请求的资源不可用。
这里肯定是 web.xml
:
<web-app ... xsd schemas ... >
<display-name>myWebService</display-name>
<servlet>
<servlet-name>Jersey REST Service</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>nch.webservices</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
我错过了什么,我做错了什么?我注意到 url-pattern
中的两个 web.xml
文件之间的区别是:
- myWebApp 使用
/
- myWebService 使用
/*
当我在 myWebService 上使用 <url-pattern>/</url-pattern>
时,它要么在本地主机上不起作用。感谢帮助。如果需要,请随时询问更多信息(希望问题尽可能简短)。
根据您的描述和代码,我尝试成功重现您的 myWebService
问题。 404
访问 http://myWebService.azurewebsites.net/myWebService
of myWebService
的问题是由于 url-pattern
不匹配 class Method
url Sample
,请看下面的解释。
- 在class
Sample
中,class注解@Path("Sample")
和方法注解@Path("/")
为方法Method
表示可访问url 对于 myWebService
项目中 class Sample
的方法 Method
是 http://myWebService.azurewebsites.net/myWebService/Sample/
.
url-pattern
值/
表示只匹配urlhttp://myWebService.azurewebsites.net/myWebService/
.
您的情况有两种解决方案。
推荐。使用通配符 /*
而不是 /
作为 url-pattern
并访问 url http://myWebService.azurewebsites.net/myWebService/Sample/
。并建议将class注解@Path("Sample")
改为@Path("/Sample")
以便阅读和理解。
只把class注解@Path("Sample")
改成@Path("")
或者@Path("/")
不改url-pattern
,但是任何路径注解其他 classes 将不会被匹配。
我在 Azure 的 Tomcat servlet 容器上部署时遇到了问题。我通过 FTP 连接到创建的网络应用程序 space,将 war
文件复制到正确的文件夹。
myWebApp
我已经在 Azure 上成功部署了一个 Spring MVC 简单 Web 应用程序。 URL 模式如下,两者均按预期工作:
http://myWebApp.azurewebsites.net/myWebApp
部署在 Azure 上 Tomcathttp://localhost:8080/myWebApp
部署在本地 Tomcat
密钥文件在下面web.xml
:
<web-app ... xsd schemas ... >
<display-name>myWebApp</display-name>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>... not important ...</context-param>
<listener>... not important ...</listener>
</web-app>
myWebService
好吧,当我想以同样的方式部署一个简单的 Web 服务并查看其内容时,问题就来了。
我决定使用 jersey
库。这是唯一的示例 class:
@Path("Sample")
public class Sample {
@GET
@Path("/")
@Produces(MediaType.TEXT_XML)
public String Method() {
return "<tag>" + 123 + "</tag>";
}
}
在 clean install
和 运行ning 在 URL http://localhost:8080/myWebService/Sample
上的本地 Tomcat 服务器上之后,它正确地给了我 XML <tag>123</tag>"
.
我希望像以前的 myWebApp 一样在 Azure 上部署,并尝试在 URL http://myWebService.azurewebsites.net/myWebService
上 运行。它给了我 404
错误,说请求的资源不可用。
这里肯定是 web.xml
:
<web-app ... xsd schemas ... >
<display-name>myWebService</display-name>
<servlet>
<servlet-name>Jersey REST Service</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>nch.webservices</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
我错过了什么,我做错了什么?我注意到 url-pattern
中的两个 web.xml
文件之间的区别是:
- myWebApp 使用
/
- myWebService 使用
/*
当我在 myWebService 上使用 <url-pattern>/</url-pattern>
时,它要么在本地主机上不起作用。感谢帮助。如果需要,请随时询问更多信息(希望问题尽可能简短)。
根据您的描述和代码,我尝试成功重现您的 myWebService
问题。 404
访问 http://myWebService.azurewebsites.net/myWebService
of myWebService
的问题是由于 url-pattern
不匹配 class Method
url Sample
,请看下面的解释。
- 在class
Sample
中,class注解@Path("Sample")
和方法注解@Path("/")
为方法Method
表示可访问url 对于myWebService
项目中 classSample
的方法Method
是http://myWebService.azurewebsites.net/myWebService/Sample/
. url-pattern
值/
表示只匹配urlhttp://myWebService.azurewebsites.net/myWebService/
.
您的情况有两种解决方案。
推荐。使用通配符
/*
而不是/
作为url-pattern
并访问 urlhttp://myWebService.azurewebsites.net/myWebService/Sample/
。并建议将class注解@Path("Sample")
改为@Path("/Sample")
以便阅读和理解。只把class注解
@Path("Sample")
改成@Path("")
或者@Path("/")
不改url-pattern
,但是任何路径注解其他 classes 将不会被匹配。