6
回答
spring mvc 动态返回问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
请求一下大家的一个问题.
在spring mvc中想动态返回以及渲染,现在是移动互联网时代.单纯做pc已经不行了.


一个需求: 
统一URL根据不同的请求媒体类型返回不同的结果视图,由服务器渲染好,怎么渲染自己实现.
比如url . /user/findAllUsers
手机客户端要求能返回json或者xml或者更多 
pc ajax客户端 要求全部支持 (json/xml/html)
手机浏览器端: 要求返回json或者xml


例子:


一般情况下手机客户端:
/user/findAllUsers?media-type=json
返回: json data


一般情况下的手机浏览器客户端都是ajax.一般处理要求json
/user/findAllUsers?media-type=json
返回: json data


pc ajax客户端一般情况都是json和html
/user/findAllUsers?media-type=html
返回可嵌入的一个用户列表视图


id , name , ...
1 , 名称




pc 静态网页客户端一般情况都是返回静态html
/user/findAllUsers?media-type=html


返回一个用户列表视图


id , name , ...
1 , 名称


我尝试过使用一个参数来实现.
if(mediaType==JSON){
返回json渲染的视图
}else if(.....){ ....}


这样做很笨,很生硬的编码,另外我也尝试过使用spring mvc的configureContentNegotiation 配置,不行.
还有人说过全部返回json.你觉得这样可靠吗?跟本无法解决对爬虫的或者更多视图问题.还有你想下现在一般手机端或者ipad下的网页端都是跳转到另外的
那样开发量大了.后台一般要配合.还有什么的.

举报
lanmingle
发帖于3年前 6回/835阅
共有6个答案 最后回答: 3年前

不太明白你的意思,为什么用if else就生硬了?
定义统一的渲染接口,并以media-type做参数,所有handler都在业务逻辑处理完后,将结果数据以及media-type传给这个渲染接口。不过这个接口的内部实现,理论上还是要用if else来判断需要返回的数据类型,不是吗?


--- 共有 2 条评论 ---
CoserSeu回复 @蓝明乐 : 都不满意就别用现成的框架了,个人愚见,尝试一下自己用filter配合strategy模式设计一个简单的策略分配框架,在filter中根据请求参数为servlet分配策略实例,在servlet业务执行中统一调用策略接口执行不同策略。个人感觉这样还是可以的。 3年前 回复
lanmingle本来就是if else .我就是想让他自动调用那代码. 3年前 回复

之前写过一个框架 可以支持你说的这些东西 并且不需要参数 

你可以不加参数 尝试根据请求的User-Agent类型 来判断请求客户端的类型 从而来做适配

--- 共有 1 条评论 ---
lanmingle我说额.这两个没啥区别,我上面写的只是一个例子.实际情况下是去这个的. 3年前 回复

引用来自“朱宏青”的评论

之前写过一个框架 可以支持你说的这些东西 并且不需要参数 

你可以不加参数 尝试根据请求的User-Agent类型 来判断请求客户端的类型 从而来做适配

是的,通过user-agent类型来判断,返回不同的请求jsp画面,或者采用bootstrap开放前端,利用其自适应特点
--- 共有 2 条评论 ---
Justic_0111回复 @蓝明乐 : 你是指浏览器兼容性问题吗?? 3年前 回复
lanminglebootstrap? 它局限太多了,真正的客户端用不上. 3年前 回复
只返回json,pc用mvvm框架解析,客户端直接用,目前都这么做
--- 共有 3 条评论 ---
Dreampiehttp://iresty.jd-app.com 3年前 回复
Dreampie没有让你一个url啊,也是多个, 3年前 回复
lanmingle对啊.目前很多都是这样做的. 哎我现在就是想不用这样.一个url对应着多个多种视图返回. 3年前 回复

楼主,你这个需求是合理的 同一个URL 对应不同的终端或者是不同的请求方式,显示不同的数据 比如返回HTML,JSON,XML

如果我没记错的话 主要是配置@RequestMapping method与headers来区分请求方式和终端来源

具体请查阅SPRING 文档

--- 共有 1 条评论 ---
lanminglespring 文档我都看了N次了.就是没有发现有很好的解决方案. 3年前 回复
顶部