IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Play! Java Discussion :

Se débarasser des servlets


Sujet :

Play! Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2013
    Messages : 88
    Points : 57
    Points
    57
    Par défaut Se débarasser des servlets
    Bonjour la communauté !

    Je dois pour un travail migrer un ancien code Java (Servlet, JSP etc ...) vers un tout nouveau en utilisant le framework play (excellente découverte par ailleurs).

    Dans le "vieux" code, j'appellais un Servlet de cette façon en Javascript (Ext-JS) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    function getTree()
    {
    var store = Ext.create('Ext.data.TreeStore', 
    {
        root: 
        {
            text: 'System',
            id: 'root',
            expanded: true
        },
        proxy: 
        {
            type: 'ajax',
            url: 'TreeServlet',
            extraParams:
            {
                mode:'getChildren'
            },
            reader:
            {
                type:'json',
                root:'result'
            }
        }
    });
    Et je récupérai cette requête via un Servlet (TreeServlet) en utilisant la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected void service(...)
    La question est : Comment me débarrasser de ce Servlet ?

    Ce que j'ai déjà fait :
    - Dans routes.conf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GET /tree controllers.Application.makeTree()
    - Dans Application.controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static Result makeTree(){
            // Que mettre ici ?   
        }
    Pour plus de clarté, voici ce qui se passait dans mon TreeServlet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    @WebServlet("/TreeServlet")
    public class TreeServlet extends HttpServlet 
    {
    	/**
             * The log4J logger. See http://logging.apache.org/log4j/1.2/index.html for more info.
             */
    	private static Logger log=Logger.getLogger(new Throwable().getStackTrace()[0].getClassName());
     
    	private static final long serialVersionUID = 1L;
     
    	private MenuManager menuManager;
     
        /**
         * Default constructor. 
         */
        public TreeServlet() 
        {
     
        }
     
        @Override
        public void init() throws ServletException 
        {
        	super.init();
    		this.menuManager=MenuManager.getMenuManager();
    		if (menuManager==null)
    		{
    			log.error("Impossible to get the MenuManager in TreeServlet");
    			return;
    		}
        }
     
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        {
    		JSONObject resultJson;
    		String mode=request.getParameter(Constants.HTTP_MODE);
    		String node=request.getParameter(Constants.HTTP_NODE);
    		String hash=request.getParameter(Constants.HTTP_HASH);
     
                    // Bla bla et création de JSON
         }
    Un tout grand merci d'avance à vous

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    août 2006
    Messages
    3 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2006
    Messages : 3 267
    Points : 4 106
    Points
    4 106
    Par défaut
    Dans ta route, tu peux préciser des paramètres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GET /tree/:id controllers.Application.makeTree()
    ou même des objets.

    A toi de renseigner la valeur via ton appel Javascript.

    Coté code Java, tu peux utiliser la classe Json et ses méthodes statiques:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public static Result makeTree(){
      return ok(Json.toJson(TON_OBJET_JAVA);
    }

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2013
    Messages : 88
    Points : 57
    Points
    57
    Par défaut
    Merci de ta réponse !

    J'ai trouvé une solution en "bypassant" le problème, mais je ne pense pas que cela soit une bonne pratique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    public class Tree 
    {
    	private MenuManager menuManager; 
    	String node; 
    	String mode; 
    	String hash; 
     
    	public Tree(){
    		this.menuManager = MenuManager.getMenuManager(); 
    		getParams(); 
    	}
     
    	public void getParams(){
    		/*Retrieve the get Parameters*/
    		DynamicForm params = Form.form().bindFromRequest();
    		this.mode = params.get(Constants.HTTP_MODE); 
    		this.node = params.get(Constants.HTTP_NODE); 
    		this.hash = params.get(Constants.HTTP_HASH);  
    		Logger.info("Mode : "+this.mode+" Node : " +this.node+ "Hash : " +this.hash);
    	}
    Que j'appelle dans controllers.Application comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public static Result makeTree() {        
        	new Tree(); 
        	return ok(); 
    }
    Qu'en penses-tu ?

    Également, je dois ré-envoyer un JSON via une méthode de ma classe Tree que j'avais construit de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private void sendResponse(HttpServletResponse response,JSONObject resultJson,boolean success) throws IOException, JSONException 
    {
            resultJson.put(Constants.JSON_SUCCESS, success);
    	response.getWriter().write(resultJson.toString());
    	response.setStatus(HttpServletResponse.SC_OK);
    }
    Mais tu t'en doutes sûrement, je ne veux plus utiliser d'objet HttpServletResponse.

    Dés lors :
    1. Comment gérer cette situation avec Play!
    2. Comment récupérer le JSON ainsi créer ?

    Je pense que ces liens peuvent aider, mais je ne trouve pas vraiment comment :
    https://www.playframework.com/docume...n/2.3.x/JavaWS
    https://www.playframework.com/docume...avaJsonActions

    Un tout grand merci de ton aide en tout cas

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    août 2006
    Messages
    3 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2006
    Messages : 3 267
    Points : 4 106
    Points
    4 106
    Par défaut
    La méthode ok() que je t'ai indiquée, retourne une réponse HTTP 200 OK équivalente à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    response.getWriter().write(resultJson.toString());
    response.setStatus(HttpServletResponse.SC_OK);
    Tu as juste à lui passer en paramètre l'objet Json construit.
    Soit c'est un objet Java à toi.
    Soit tu le construit comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ObjectNode result = Json.newObject();
    result.put("exampleField1", "foobar");
    result.put("exampleField2", "Hello world!");

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mars 2013
    Messages : 88
    Points : 57
    Points
    57
    Par défaut
    De fait ...

    Je viens d'implémenter ce que tu m'as dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Tree extends Controller
    {
        // Bla bla bla ...   
     
        private static Result sendResponse(JSONObject resultJson, boolean success){
    		resultJson.put(Constants.JSON_SUCCESS, success); 
    		return ok(Json.toJson(resultJson)); 		
    	}
    }
    Mais, cela ne fonctionne pas.

    Dans l'ordre, voici ce qu'il se passe :

    En premier :
    J'appel la méthode pour afficher la page, dans la classe Application :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class Application extends Controller {
     
        public static Result displayCafca() {
            return ok(display.render());
        }
    }
    Ensuite :
    Dans display.scala.html, j'appel un script javascript :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <script type="text/javascript" src="@routes.Assets.at("javascripts/tree.js")"></script>

    Dans ce script :
    J'appel la classe tree (cf, code javascript dans le premier message), que je référence en utilisant le fichier routes.conf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GET     /tree						controllers.Application.makeTree()
    Ce qui me ramène à controller.Application, ou j'éxécute la méthode makeTree() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static Result makeTree() throws IOException {        
        	new Tree(); 
        	return ok(); 
    }

    Et dans Tree.java, je renvoie un JSON (cf. premières lignes de ce message)

    Ma question est donc la suivante : Où est-ce que je rates une étape ?

Discussions similaires

  1. Problême d'exécution des servlets sur tomcat
    Par naima2005 dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 07/05/2006, 07h54
  2. comment se débarasser des trojans
    Par astan31 dans le forum Sécurité
    Réponses: 5
    Dernier message: 03/04/2006, 16h33
  3. Bouton input avec des servlet
    Par koolyce dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 26/02/2006, 13h05
  4. [Tomcat] Liste des servlets et sessions associées
    Par frala dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 08/02/2006, 14h53
  5. [tomcat] Ou s'inscrit les System.out.println des servlets ?
    Par Shiryu44 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 06/04/2005, 09h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo