如何保持Tomcat 7类的实例

时间:2015-12-22 18:04:19

标签: java eclipse tomcat servlets

我在Java中创建了3层(客户端,服务器,数据库)的信息系统。我用于客户端和服务器Tomcat 7 serverServletHTTP restfull API之间的通信。服务器中的类Obchod创建与数据库通信的新数据类实例。

当我启动服务器时,没有创建数据类的实例,当客户端发送数据请求时,服务器创建数据类的实例,并将所有数据从数据库加载到本地数组,然后将请求的数据发送到客户端,在此请求之后所有数据丢失,服务器等待请求......

所以我需要这个存储数据的实例,以便为下一个请求保持活跃状态​​。

班级Obchod

@Path("/obchod")
public class Obchod
{
    int size = 20;

    // Data classes
    Uzivatel     u = new Uzivatel(size);
    Zbozi        z = new Zbozi(size);
    Skladem      s = new Skladem(size);
    ProdaneZbozi p = new ProdaneZbozi(size);
    KoupeneZbozi k = new KoupeneZbozi(size);


    @POST
    @Path("/addUser")
    @Consumes(MediaType.APPLICATION_JSON)
    public void addUser(String str)
    {
        JSONObject obj = new JSONObject(str);   
        u.pridej(Integer.toString(u.maxID() + 1), obj.getString("Jmeno"), obj.getString("Prijmeni"), obj.getString("Datum_Narozeni"), obj.getString("Pozice"));
    }
    ...
    //next methods
    ...
}
动态Web项目(Eclipse)中的

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" version="3.0">
  <display-name>WSdemo</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>JAVA WS</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>obchod</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
  </servlet>

    <servlet-mapping>
        <servlet-name>JAVA WS</servlet-name>
        <url-pattern>/*</url-pattern>
   </servlet-mapping>
</web-app>

Solution

2 个答案:

答案 0 :(得分:1)

这就是Java Servlet的工作方式。请看这张图片:enter image description here

整体而言:

  • 只要网络应用程序存在,ServletContext就会存在。它已经 在所有会话中的所有请求中共享。
  • 只要客户端与webapp进行交互,HttpSession就会存在 浏览器实例和会话没有在服务器端超时 然而。它在同一会话中的所有请求中共享。
  • HttpServletRequestHttpServletResponse只要活过{。}} 客户端已将其发送到完整响应(网页) 到达。它没有在别处分享。
  • 只要网络应用程序存在,任何Servlet, Filter and Listener都会存在。他们正在分享 在所有会议的所有请求中。
  • 您设置的任何attribute ServletContext, HttpServletRequest and HttpSession将生活为 只要有问题的物体存在。

为什么要在应用程序中的数组中存储数据?

提高性能?? 使用caching,因此值将存储在缓存中,并且方法不会在指定的时间范围内查询数据库。

如果您想获得更新信息,请使用Transactions更改数据库中的值。当user A更新值时,下一个用户将直接从DB获取新值。

答案 1 :(得分:0)

在web.xml中,我只需添加listener

  <listener>
        <listener-class>obchod.Obchod</listener-class>
  </listener>

在Obchod.java中:

@Path("/obchod")
public class Obchod  implements ServletContextListener
{
    int size = 20;

    public void contextInitialized(ServletContextEvent event)
    {
        ServletContext sc = event.getServletContext();
        sc.setAttribute("Uzivatel", new Uzivatel(size));
        sc.setAttribute("Zbozi", new Zbozi(size));
        sc.setAttribute("Skladem", new Skladem(size));
        sc.setAttribute("ProdaneZbozi", new ProdaneZbozi(size));
        sc.setAttribute("KoupeneZbozi", new KoupeneZbozi(size));   
    }

    @POST
    @Path("/addUser")
    @Consumes(MediaType.APPLICATION_JSON)
    public void addUser(@Context ServletContext context, String str)
    {
        Uzivatel u = (Uzivatel) context.getAttribute("Uzivatel");

        JSONObject obj = new JSONObject(str);   
        u.pridej(Integer.toString(u.maxID() + 1), obj.getString("Jmeno"), obj.getString("Prijmeni"), obj.getString("Datum_Narozeni"), obj.getString("Pozice"));
    }