从旧 Java 过渡到 Play,Servlet 问题

Transition from old Java to Play, Servlet issue

我必须使用 Play 从旧 Java 代码转移到新代码!框架。

在旧代码中,我使用 Ext-Js(Javascript Framework)调用了一个 Java servlet:

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

现在,我想使用 Play!做同样的事情,但我不知道如何使用它。

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

在controller.Application:

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

我不想用Servlet,但是我不知道怎么用。

谢谢你的帮助!

编辑 1:

谢谢大家!

以下是我最终实现目标的方式:

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

}

并且在路线中

GET     /tree                       controllers.Tree.returnJson()

大家怎么看?好的做法?

检查 WS 对象:https://www.playframework.com/documentation/2.3.x/JavaWS

似乎来自 Servlet 的 return 是一个 Json 所以检查如何处理 json 在这里播放:https://www.playframework.com/documentation/2.3.x/JavaJsonActions

我相信类似的事情应该做到这一点

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

下面是您的 http 请求的结构,

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

在较早的播放框架中,您必须仅为控制器中的每个请求处理程序创建静态方法。 但是在较新的版本中(play 2.0 之后)你不需要静态方法,你可以使用普通的 public 方法并在以 '@' 符号为前缀的路由中配置它。

并且不要在控制器中维护或声明属性 class。 因为 play 是一个事件驱动的框架,不像普通的基于 servlet 的框架。 它提供 REST,并且不像在 servlet 中那样维护任何 httpsession。 会话仅以 cookie 的形式提供。

以下是您的代码修改后的版本,

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.

    }

路线

GET     /tree                       @controllers.TreeController.createTree()

希望这会提供一些想法。

干杯..!!!