NutzCN Logo
精华 关于自定义视图
发布于 3102天前 作者 Symous 2044 次浏览 复制 上一个帖子 下一个帖子
标签:

看了手册中自定义视图的部分还是有些不太明白。

手册中的例子:

public class PdfView implements View{
public void render(HttpServletRequest req, HttpServletResponse resp, Object obj){
// TODO 实现代码 ...
}
}

public class PdfViewMaker implements ViewMaker{
public View make(Ioc ioc, String type, String value){
if("pdf".equalsIgnoreCase(type)){
return new PdfView(value);
}
return null;
}
}

问题:

  1. 在视图工程中使用 new pdfView(value),这个一个参数的构造方法在PdfView中如何实现?
  2. 我想在PdfView中使用req参数进行一些操作,如我想获取到请求参数的值: 请问这个参数我在代码中如何才能获得?
    String callback = req.getParameter("callback");
    水平有限,希望大家回答的详细一些,有例子更好,谢谢!
16 回复
public class PdfView implements View {
    private String type;
	public PdfView(String type) {
	    this. type = type;
	}
	public void render(HttpServletRequest req, HttpServletResponse resp, Object obj) throws Throwable  {
	   // xxx yyy zzz
	}
}

public class PdfViewMaker implements ViewMaker{
    public View make(Ioc ioc, String type, String value){
        if("pdf".equalsIgnoreCase(type)){
            return new PdfView(value);
        }
        return null;
    }
}

// 主模块上加
@Views({PdfViewMaker.class})
public class MainModule{}

我现在想通过自定义视图重新组装我的jsonp,主要的想法是这样的:

待组装的Json集合为一个对象List,暂且命名为list。
根据客户端url中传入的callback参数取其值进行拼接:
String returnResult = req.getParameter("callback")+"("+Json.ToJson(list)+")";

能不能利用上述自定义视图方法给指导一个大致的实现思路,谢谢。

以下是示例

public class MyJsonpView implements View {
	public void render(HttpServletRequest req, HttpServletResponse resp, Object obj) throws Throwable  {
	   resp.setContentType("application/javascript");
	   Writer writer = resp.getWriter();
	   String returnResult = req.getParameter("callback")+"("+Json.ToJson(obj)+")";
	   writer.write(returnResult);
	}
}

PS: 如果定死了是req.getParameter("callback"),那跟UTF8JsonView里面逻辑完全没区别.

按照你说的我使用了UTF8JsonView,

return new UTF8JsonView().setData(list).setJsonp(true);

返回数据格式正常,但是前台仍然无法解析,
请问是不是一般情况下REST和JSONP不能使用如下形式的URL?
xxx/yyy/callback/JSON_CALLBACK

经过我测试:
xxx/yyy?callback=JSON_CALLBACK这种情况是正常的。

前端调用nutz服务代码:

$http.jsonp("http://localhost:8080/Service/lost/site/"+$scope.currentLineID+"/"+$scope.begindate+"/"+$scope.enddate+"/callback/JSON_CALLBACK").success(function(data_site){
      //do something...
    });

nutz服务端代码:

@At("/site/?/?/?/callback/?")
    @GET
    public View lostSite(int lineid, String begintime, String endtime){
        List<rSite> list = new ArrayList<rSite>();
        //执行查询..
        dao.execute(sql);
        return new UTF8JsonView().setData(list).setJsonp(true);

    }

服务端测试结果:
callback([{"siteid":634,"sitename":"电工班","status":null,"arrivetime":null,"unqualifiedcount":31},.........
前端调用结果:
null([{"siteid":634,"sitename":"电工班","status":null,"arrivetime":null.....
重点是前端的callback标识变成了null。

这前端代码就没有传callback参数,注意是参数

$http.jsonp("http://localhost:8080/Service/lost/site/"+$scope.currentLineID+"/"+$scope.begindate+"/"+$scope.enddate+"/callback/JSON_CALLBACK")

改成
js $http.jsonp("http://localhost:8080/Service/lost/site/"+$scope.currentLineID+"/"+$scope.begindate+"/"+$scope.enddate+"/callback?callback=JSON_CALLBACK")

参数!!! 不是指方法参数,指URL里面的表单参数!!!

$http.jsonp("http://localhost:8080/Service/lost/site/"+$scope.currentLineID+"/"+$scope.begindate+"/"+$scope.enddate+"/callback?callback=JSON_CALLBACK")

对应的入口方法

@At("/lost/site/?/?/?")

一直没理解 req.getParameter("callback") 取的是哪里的值?

$http.jsonp("http://localhost:8080/Service/lost/site/"+$scope.currentLineID+"/"+$scope.begindate+"/"+$scope.enddate+"/callback/JSON_CALLBACK")

如果我前端是这么调的服务,那我的 req.getParameter("callback")取到的值不就是JSON_CALLBACK吗。
对应入口:

@At("/lost/site/?/?/?/callback/?")

NO, "/callback/JSON_CALLBACK" 中的JSON_CALLBACK是路径参数, 不是URL参数, req.getParameter("callback") 是取不到的!!

"/callback?callback=JSON_CALLBACK" 这种形式才是URL参数, 这种才能通过req.getParameter("callback")取到.

我就是不想写成?callback=JSON_CALLBACK所以我猜在一直纠结这个问题,
我之前完全可以用xxxx/yyyyy?callback=JSON_CALLBACK,这个是可以调用成功的。

不对吧?
因为我入口定义的是:

@At("/lost/site/?/?/?/callback/?")

也就是说在url里面callback/后面跟的就是一个参数,按说是可以通过getParameter("callback")取到的啊?

我好像搞混了,确实取不到。

要是想写在路径里面

    @At("/site/?/?/?/callback/?")
    @GET
	@Ok("raw:application/javascript")
    public String lostSite(int lineid, String begintime, String endtime, String callback){
        List<rSite> list = new ArrayList<rSite>();
        //执行查询..
        dao.execute(sql);
        return callback + "(" + Json.toJson(list)+");";

    }

谢谢,虽然还是没有达到我想要的效果,但是找到了问题所在,原来跟前台的特性也有关!

添加回复
请先登陆
回到顶部