Mornor
Mornor

Reputation: 3783

Transition from old Java to Play, Servlet issue

I have to move from an old Java code to a new one using Play! Framework.

In the old code, I called a Java servlet using Ext-Js (Javascript Framework) using this way :

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'
        }
    }
});

Now, I would like to use Play! to do the same, but I do not know how to use it.

. In routes.conf:
GET /tree controllers.Application.makeTree()

. In controller.Application:

public static Result makeTree(){
        // What shoul I put here to call the "Servlet"  
    }

I do not want to use Servlet, but I don't know how to do it.

Thank you for you help!

EDIT 1:

Thank you to all of you!

Here is how I eventually manage to achieve my goal:

public class Tree extends Controller
{
    private MenuManager menuManager; 
    String node; 
    String mode; 
    String hash; 
    ObjectNode response; 

    public void createTree() throws IOException{
        this.menuManager = MenuManager.getMenuManager(); 
        getParams(); 
        createJson(mode, node, hash);
    }

    public static Result returnJson() throws IOException{
        Tree t = new Tree(); 
        t.createTree();
        return ok(t.response); 
    }

}

And in routes:

GET     /tree                       controllers.Tree.returnJson()

What do you guys think? Good practice?

Upvotes: 0

Views: 128

Answers (3)

Hakuna Matata
Hakuna Matata

Reputation: 761

In earlier play frameworks you have to create only static methods for each and every request handler in controller. But in the newer version (after play 2.0) you don't need to have static methods you can use normal public methods and configure it in routes prefixed with '@' symbol.

And don't maintain or declare attributes within controller class. Because play is an event driven framework not like oridinary servlet based framework. It provides REST and it doesn't maintain any httpsession like in servlets. Session is available in the form of cookies only.

Below is the remodified version of your code,

public class TreeController extends Controller
{

    public void createTree() throws IOException{
        MenuManager menuManager = MenuManager.getMenuManager(); 
        String mode = request().getQueryString("mode");
    String node = request().getQueryString("node");
    String hash = request().getQueryString("hash");
    TreeNodeDto treeObject = menuManager.buildTree();
    ok(treeObject.toJson());
    }

}

public class BaseDto<T extends BaseDto<T>> implements Serializable{

    public JsonNode toJson() {
        return Json.toJson(this);
    }

    public T fromJson(JsonNode jsonObject) {
        return (T) Json.fromJson(jsonObject, this.getClass());
    }
}

public static class TreeNodeDto extends BaseDto {
    public String hash;
    public String name;
    public Set<TreeNodeDto> children;

    // Override equals and hashcode, because we are using "set" to maintain the child nodes.

    }

routes

GET     /tree                       @controllers.TreeController.createTree()

Hope this will give some ideas.

Cheers..!!!

Upvotes: 1

Hakuna Matata
Hakuna Matata

Reputation: 761

Below is the structure for your http request in play,

 public static Result makeTree() {
            TreeDto treeDto=new TreeDto();
            JsonNode jsonResponse = Json.newObject();
            try {
                treeDto = <<Logic to get the tree objects from db>>;
                if(treeDto != null) {           
                    jsonResponse = Json.toJson(treeDto);
                }
            } catch (XODAOException e) {
                Logger.error("Error while building the tree.", e);
                jsonResponse = generateErrorResponse("Error while building tree.", e);
            } 
            return ok(jsonResponse);
        }

Upvotes: 0

Makis Arvanitis
Makis Arvanitis

Reputation: 1195

Check the WS object: https://www.playframework.com/documentation/2.3.x/JavaWS

It seems that the return from the Servlet is a Json so check how to process json in play here: https://www.playframework.com/documentation/2.3.x/JavaJsonActions

I believe something like that should do it

public static Promise<Result> makeTree() {
    final Promise<Result> resultPromise = WS.url("TreeServlet").setHeader("Content-Type", "application/json").get().map(
            new Function<WSResponse, Result>() {
                public Result apply(WSResponse response) {
                    return ok("Feed title:" + response.asJson().findPath("result"));
                }
            }
    );
    return resultPromise;
}

Upvotes: 0

Related Questions