从旧 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()
希望这会提供一些想法。
干杯..!!!
我必须使用 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()
希望这会提供一些想法。
干杯..!!!