J'ai créé un système d'information avec 3 couches (Client, Serveur, Base de données) en Java. J'utilise pour les communications entre le client et le serveur Tomcat 7 server, Servlet, HTTP restfull API. Classe Obchod dans le serveur créant de nouvelles instances de classes de données qui communiquent avec la base de données.

Topiquement, lorsque je démarre le serveur, aucune instance de classes de données n'est créée et lorsque le client envoie une demande de données, le serveur crée une instance de classes de données et charge toutes les données de la base de données vers des tableaux locaux, puis envoie les données demandées au client, après cette demande, toutes les données sont perdues et serveur en attente de demandes ...

J'ai donc besoin de ces instances qui stockent les données dans des tableaux restent en vie pour les prochaines demandes.

Classe 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.xml dans un projet Web dynamique (Eclipse)

<?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

0
1000Bugy 22 déc. 2015 à 21:04

2 réponses

Meilleure réponse

Dans web.xml, j'ajoute simplement listener:

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

Et dans 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"));
    }
0
1000Bugy 26 déc. 2015 à 02:13

C'est ainsi que fonctionne Java Servlet. Regardez cette image: entrez la description de l'image ici

Dans l'ensemble:

  • Le ServletContext vit aussi longtemps que la webapp vit. C'était partagé entre toutes les demandes de toutes les sessions.
  • Le HttpSession vit tant que le client interagit avec l'application Web avec l'instance du navigateur et la session n'a pas expiré du côté serveur encore. Il a été partagé entre toutes les demandes de la même session.
  • le HttpServletRequest et HttpServletResponse vivent aussi longtemps que le le client l'a envoyé jusqu'à ce que la réponse complète (la page Web) soit arrivée. Il n'est pas partagé ailleurs.
  • Tout Servlet, Filter and Listener vit aussi longtemps que la webapp vit. Ils sont partagés parmi toutes les demandes dans toutes les sessions.
  • Tout attribute que vous avez défini ServletContext, HttpServletRequest and HttpSession vivra comme tant que l’objet en question vit.

Pourquoi souhaitez-vous stocker des données dans des tableaux dans votre application?

Pour améliorer les performances ?? Utilisez caching, les valeurs seront donc stockées dans le cache et les méthodes n'interrogeront pas la base de données avec la plage de temps spécifiée.

Si vous souhaitez avoir des informations à jour , modifiez les valeurs dans DB à l'aide de Transactions. Lorsque user A mettra à jour la valeur, le prochain utilisateur récupérera la nouvelle valeur directement à partir de DB.

1
m.aibin 22 déc. 2015 à 18:28