@红薯 你好,想跟你请教个问题:oschina android手机客户端访问api获取的信息是xml格式数据,如新闻列表api是http://www.oschina.net/action/api/news_list,以前听你讲过oschina服务器端生成xml用的是velocity模板,但是aciton和vm走的是两条路,web app页面需要的数据可以通过在toolbox中配置然后在模板页面中获取,但是返回给手机客户端的xml数据在ApiAction类中news_list()方法中是怎么将数据填充到*.vm xml模板中的呢?难道也是在toolbox中配的,但是它的url不符合全局URLMappingFilter啊,还请老大赐教!oschina是怎么实现的呢?谢谢!
import java.io.IOException; import javax.servlet.ServletException; import my.mvc.RequestContext; public class ApiAction extends BaseAction { public void docDetail(RequestContext ctx) throws ServletException, IOException{ String docId = ctx.param("id", "");//对应doc的id System.out.println("docId="+docId); ctx.forward("/doc/xml/docDetail/"+docId);//请求转发给docDetail.vm //ctx.redirect("/doc/xml/docDetail/"+docId); } }但是提示找不到页面文件,如果用ctx.redirect就是正常的,同时地址栏地址发生了变化。为什么我用forward不行呢? 默认情况下,forward是不会被filter拦截的(需要配置),也就是说URLMappingFilter在这里是不起作用的,所以你的forward路径应该改成这样:
ctx.forward("/doc/xml/docDetail?docId="+docId);这里不能用redirect哦,不然你的action还有什么意义呢? 还有,模板文件最好放到WEB-INF目录下,作为API不应该让用户可以直接访问到,不然你在action里做的权限控制就白做了。 ######非常感谢,已经按照您说的修改了,但是页面返回的数据格式好像不是xml,麻烦看一下我下面的跟帖!###### 一样用的啊! 你说的这种情况action仅仅是用来做一些权限控制之类的,然后forward到对应的模板,数据还是在toolbox里面取。 ###### @tsl0922 非常感谢,按照您的思路,比如请求的url地址为:http://localhost:8080/action/api/docDetail?id=50 我的ApiAction是这样写的
import java.io.IOException; import javax.servlet.ServletException; import my.mvc.RequestContext; public class ApiAction extends BaseAction { public void docDetail(RequestContext ctx) throws ServletException, IOException{ String docId = ctx.param("id", "");//对应doc的id System.out.println("docId="+docId); ctx.forward("/doc/xml/docDetail/"+docId);//请求转发给docDetail.vm //ctx.redirect("/doc/xml/docDetail/"+docId); } }但是提示找不到页面文件,如果用ctx.redirect就是正常的,同时地址栏地址发生了变化。为什么我用forward不行呢? ######@tsl0922 按照您的方法修改如下:
public class ApiAction extends BaseAction { public void docDetail(RequestContext ctx) throws ServletException, IOException{ String docId = ctx.param("id", "");//对应doc的id System.out.println("docId="+docId); ctx.forward("/WEB-INF/www/doc/xml/docDetail.vm?id="+docId);//请求转发给docDetail.vm } }docDetail.vm模板文件如下:
#set($layout="shell/xmllayout.vm") #set($docid = $link.param('id',0)) #set($doc=$doc_tool.detail($docid)) <diabetes> <doc> <id>$!{doc.id}</id> <title>$!{doc.title}</title> <author>$!{doc.author}</author> <source>$!{doc.source}</source> </doc> </diabetes>其中布局模板xmllayout.vm
<?xml version="1.0" encoding="UTF-8"?> ${screen_content}页面执行结果为 查看源码为: 为什么返回的页面形式跟oschina不一样,好像不是xml格式,oschina的一篇详细新闻的xml返回格式截图 这是什么原因的,还请 @tsl0922 指点啊!######回复 @tsl0922 : 谢谢,加了response.setContentType("text/xml;charset=UTF-8")终于成功!得给 @tsl0922 设置最佳答案!######回复 @27号 : +1 Content-Type 设置成 text/xml 就可以了######应该是response的content-type影响的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。