这可能是个愚蠢的问题,但我想知道根本原因。
我正在使用jersey实现一个简单的Web服务。我已经声明了一个全局变量i并初始化为0; 我在sayPlainTextHello()方法中将i设置为10但是当我在sayXMLHello()中显示i时它仍为0;这种行为背后的原因是什么。
服务器端代码
@Path("/hello")
public class Hello
{
int i = 0;
@GET
@Path("/string")
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello()
{
i = 10;
System.out.println("string hello");
System.out.println("i in string " + i);
return "Hello";
}
@GET
@Path("/xml")
@Produces(MediaType.TEXT_XML)
public String sayXMLHello()
{
System.out.println("i in xml"+i);
System.out.println("xml hello");
return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + " </hello>";
}
这是我的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" 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>com.vogella.jersey.first</display-name>
<welcome-file-list>
<welcome-file>home.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class> com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<!-- Register resources and providers under com.vogella.jersey.first package. -->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.spaneos.webservices</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
</web-app>
答案 0 :(得分:1)
资源类的默认范围是每请求(或请求范围)。对于每个请求,将创建一个新资源实例来处理该特定请求。
您可以使您的类单例作用域,这意味着将只为整个应用程序创建一个对象,但由于某些原因可能不需要这样做。
如果你做想让你的资源类单例作用域,那么你只需用@com.sun.jersey.spi.resource.Singleton
Hello
班级
那就是说,除非你有直接的要求让资源类成为有状态,否则我的目标是让这些类保持无状态。