jFinal支持Rest风格吗?可以想spring mvc那样支持post body json自动转换成bean吗?

Caspar_Du 发布于 2013/10/15 10:03
阅读 2K+
收藏 1

@JFinal 你好,想跟你请教个问题:

Final支持Rest风格吗?因为目前好多项目不做页面的都是SOA模式的。只需要提供restful后台接口,而前台是分离的,可以是web、也可以手机或其他终端。

1、如果需要实现 GET  POST PUT DELETE方法,像spring mvc那样支持post body json自动转换成bean吗?类似@RequestParam @RequestBody @PathVariable之类的注解。要实现这些用jfinal可以吗?

2、jfinal 有任务调度框架吗?想spring task 那样的可以指定调度规则的任务配置吗?



以下是问题补充:

@Caspar_Du:补充:其实jf目前的url控制和json xml返回已经基本满足、但是对于post过来的json格式数据,有没有简单封装后的获取方法,并且能直接转换为medel。难道要自己从HttpServletRequest中获取输入流? (2013/10/15 11:08)
加载中
0
缪斯的情人
缪斯的情人

引用来自“诺森德7号”的答案

引用来自“缪斯的情人”的答案

1.GET  POST风格的rest支持的,但是 PUT DELETE由于http协议兼容性原因,没有完全支持,目前即使支持的restful框架也都有兼容性问题,所以不建议使用。

2.json2bean,你目前需求和我当前的SOA项目情况差不多,都是对外提供服务接口,json作为传输协议格式。客户端需封装个简单的json反序列化的工具类。给你个示例(我使用的json-lib):

工具类:
    public static <T> T query(String json, Class<?> clzz) throws Exception {
        T t = null;
        try {
            JsonConfig jsc = new JsonConfig();
            jsc.setAllowNonStringKeys(true);
            object = JSONObject.fromObject(json,jsc);
            t = (T) object.toBean(object, clzz);
        } catch (Exception e) {
            logger.error("json解析错误:" + e.getCause() + e.getMessage());
            throw new RuntimeException(e);
        }
        return t;

    }
调用:
            Role role = ZFQuery.query(client.post(host + "/api/role/show?id="
                    + params), Role.class);

客户端通过httpclient向服务端请求数据,返回数据为json格式,然后通过工具类直接反序列化为bean
3.任务调度,在jfinal-ext中有扩展
你这这个例子是查询接口,可以将返回的json串,反序列化为bean。但是如果是需要发送请求的接口呢?比如保存一个对象的接口,以application/json格式post的是json串,服务端需要将此json串序列化成bean。这个好像getModel不起作用,只能读http请求的数据流得到post json串,这样太麻烦了。还有JF的Model是没get set方法的。这jsonTobean可以用?

1.由于我客户端不作数据存取操作,由服务端提供json数据,因此,弃用jfinal的model,改为javabean。

2.虽然使用javabean,但是获取数据时任然可以使用getModel。看示例:

public void save() throws Exception {
        Role role = this.getModel(Role.class);
        ResultInfo result = null;
        String requestUrl = null;
        if (StringKit.isBlank(role.getId())) {
            requestUrl = host + "/api/role/create";
            msg = "添加角色:" + role.getName();
        } 
        result = ZFQuery.save(client.post(requestUrl, role));
        this.render(new JsonRender(result).forIE());
    }

注意此处使用了工具类中client.post(url,Object)接口,该方法提供了将javabean序列化为json。实现大体如下:
     * 
     * @param url
     * @param clzz 待序列化对象
     * @return {'error':1,"ret":"成功"}
     * @throws Exception
     */
    public String post(String url, Object clzz) throws Exception {
        Method[] methods = clzz.getClass().getMethods();
        String key = "";
        String value = "";
        Map<String, String> maps = new HashMap<String, String>();
        for (Method f : methods) {
            key = f.getName();
            if (key.startsWith("get")) {
                key = key.substring(3).toLowerCase();
                value = BeanUtils.getProperty(clzz, key);
                maps.put(key, value);
            }
        }
        String result = JsonUtils.toJSONObject(maps).toString();
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("result", result);
        return this.post(url, map);

    }
保存方法就一句核心代码,很简单
3.另外一种方式,不使用javabean,全部用Record保存数据。

0
红星xx
红星xx
有 getModel()
bca
bca
可口可乐了
bca
bca
''''''
0
缪斯的情人
缪斯的情人

1.GET  POST风格的rest支持的,但是 PUT DELETE由于http协议兼容性原因,没有完全支持,目前即使支持的restful框架也都有兼容性问题,所以不建议使用。

2.json2bean,你目前需求和我当前的SOA项目情况差不多,都是对外提供服务接口,json作为传输协议格式。客户端需封装个简单的json反序列化的工具类。给你个示例(我使用的json-lib):

工具类:
    public static <T> T query(String json, Class<?> clzz) throws Exception {
        T t = null;
        try {
            JsonConfig jsc = new JsonConfig();
            jsc.setAllowNonStringKeys(true);
            object = JSONObject.fromObject(json,jsc);
            t = (T) object.toBean(object, clzz);
        } catch (Exception e) {
            logger.error("json解析错误:" + e.getCause() + e.getMessage());
            throw new RuntimeException(e);
        }
        return t;

    }
调用:
            Role role = ZFQuery.query(client.post(host + "/api/role/show?id="
                    + params), Role.class);

客户端通过httpclient向服务端请求数据,返回数据为json格式,然后通过工具类直接反序列化为bean
3.任务调度,在jfinal-ext中有扩展
0
Caspar_Du
Caspar_Du

引用来自“缪斯的情人”的答案

1.GET  POST风格的rest支持的,但是 PUT DELETE由于http协议兼容性原因,没有完全支持,目前即使支持的restful框架也都有兼容性问题,所以不建议使用。

2.json2bean,你目前需求和我当前的SOA项目情况差不多,都是对外提供服务接口,json作为传输协议格式。客户端需封装个简单的json反序列化的工具类。给你个示例(我使用的json-lib):

工具类:
    public static <T> T query(String json, Class<?> clzz) throws Exception {
        T t = null;
        try {
            JsonConfig jsc = new JsonConfig();
            jsc.setAllowNonStringKeys(true);
            object = JSONObject.fromObject(json,jsc);
            t = (T) object.toBean(object, clzz);
        } catch (Exception e) {
            logger.error("json解析错误:" + e.getCause() + e.getMessage());
            throw new RuntimeException(e);
        }
        return t;

    }
调用:
            Role role = ZFQuery.query(client.post(host + "/api/role/show?id="
                    + params), Role.class);

客户端通过httpclient向服务端请求数据,返回数据为json格式,然后通过工具类直接反序列化为bean
3.任务调度,在jfinal-ext中有扩展
你这这个例子是查询接口,可以将返回的json串,反序列化为bean。但是如果是需要发送请求的接口呢?比如保存一个对象的接口,以application/json格式post的是json串,服务端需要将此json串序列化成bean。这个好像getModel不起作用,只能读http请求的数据流得到post json串,这样太麻烦了。还有JF的Model是没get set方法的。这jsonTobean可以用?
返回顶部
顶部