从旧的Java过渡到Play,Servlet问题

Transition from old Java to Play, Servlet issue

本文关键字:Servlet 问题 Play 过渡到 Java      更新时间:2023-09-26

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

在旧代码中,我使用 Ext-JS(Javascript 框架)调用了 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()

.在控制器中。应用:

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()

你们怎么看?好的做法?

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

并且不要在控制器类中维护或声明属性。因为游戏是一个事件驱动的框架,不像基于原始的 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()

希望这会给出一些想法。

干杯。。!!!

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

似乎从 Servlet 返回的是一个 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);
        }