精华帖 (0) :: 良好帖 (2) :: 新手帖 (6) :: 隐藏帖 (2)
|
|
---|---|
作者 | 正文 |
发表时间:2011-04-21
MVC:M代表的是依赖的业务逻辑组件,功能就是如何获得上述json字符串,V代表视图资源,在这里就是上述字符串,C的功能是怎样解析"localhost:8888/MicroBlog/test.json"这个请求字符串. Spring的注解驱动功能可以将普通的java对象转化为Controller类 package com.microblog.web; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** * Controller类 * @author 晔 * */ @Controller public class TestController { @RequestMapping(value="/test.json",method=RequestMethod.GET) public String getUsers(@PathVariable("namePrefix") String prefix, Model model) { model.addAttribute("json", "[{'id':'1','name':'messi'},{'id':'2','name':'pedro'}]"); System.out.println("hello 你好周杰伦"); return "jsonView"; } } 注解加上去了还不够,这是我在百度上看到的绝大部分情形,想要框架捕获这些注解还要这一手 <context:component-scan base-package="**/web/**" /> 这时候我们要来做Viewer了,很多搞JSON的看到springsource上推荐的那个MappingJacksonJsonView类和超长的英文解释后直接晕了———跟我一样,其实完全没必要,请静静的思考一下,我们要的json是什么?还不是字符串,只不过改了个潮点的名字而已,只要能获得HttpServletResponse对象一切OK package com.microblog.web; import java.io.PrintWriter; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.view.AbstractView; /** * Viewer类 * @author 晔 * */ public class TestView extends AbstractView{ protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { PrintWriter out=response.getWriter(); out.println((String)model.get("json"));//json字符串从这里走向世界 } } 剩下的就简单了,配置TestController产生的视图名字jsonView由对应的视图类TestView处理 <bean id="test" class="com.microblog.web.TestController"/> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> <property name="order" value="1" /> </bean> <bean id="jsonView" class="com.microblog.web.TestView" /> 后记:本来我不想写这篇文章的,有注释完全可以记下我所学到的东西,但是解决这次的问题我访问了大量的关于Spring3.0介绍的英文论坛,发现早在09年的时候国外就对3.0有了成熟的应用了,而我今天才掌握一点皮毛,想起两年前的巴萨是何等的辉煌,而过去一周的巴萨却判若两人,被皇马戏弄于鼓掌,怀古而伤今,由感而发,写下此文,与此时此刻与我有同样心情的同志共勉! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-04-21
我也想用annotation来处理json来的,但是返回的总是不对。后来用了笨办法,使用response打出来,在客户端处理就好了。我也是按照网上说的做的,但就没有找到原因。
|
|
返回顶楼 | |
发表时间:2011-04-21
grandboy 写道 我也想用annotation来处理json来的,但是返回的总是不对。后来用了笨办法,使用response打出来,在客户端处理就好了。我也是按照网上说的做的,但就没有找到原因。 没看到<context:component-scan base-package="**/web/**" />啊,注解要强制框架去捕获的,至于那MappingJacksonJsonView,我是没耐心去看他的文档了,不过我知道sf上有个struts对json的插件,竟然是把Action序列化成json到客户端,如此反常规的做法让我不得不“返璞归真”直接调用response了,不知道你是哪种情况 |
|
返回顶楼 | |
发表时间:2011-04-21
我都用Jackson来序列化,然后直接打出来。你指出这行肯定要有,因为我还有很多@Controller, @Autowired 这些东西呢。我就想把那个JsonView搞出来,但是始终没有成功,不知道原因在哪里。
|
|
返回顶楼 | |
发表时间:2011-04-21
grandboy 写道 我都用Jackson来序列化,然后直接打出来。你指出这行肯定要有,因为我还有很多@Controller, @Autowired 这些东西呢。我就想把那个JsonView搞出来,但是始终没有成功,不知道原因在哪里。 对啊,我也试图研究过renderMergedOutputModel方法,不过里面的有些类看不到源码,也我就搞不定了,求真相 |
|
返回顶楼 | |
发表时间:2011-04-22
http://liukai.iteye.com/blog/975103
看下这篇文章吧,可以全部采用标注的形式 |
|
返回顶楼 | |
发表时间:2011-04-22
@responseBody
done |
|
返回顶楼 | |
发表时间:2011-04-22
3.0提供了@responseBody来返回各种类型的对象,包括json,在配置一个转换器就可以了,官方文档上例子很容易看懂
|
|
返回顶楼 | |
发表时间:2011-04-22
返回json,用@ResponseBody直接输出POJO就可以了吧,POJO包含属性:id,name....
@RequestMapping(value = "/{id}", method=RequestMethod.GET) public @ResponseBody Pojo edit(@PathVariable Integer id){ return service.find(id); } |
|
返回顶楼 | |
发表时间:2011-04-22
引用 这时候我们要来做Viewer了,很多搞JSON的看到springsource上推荐的那个MappingJacksonJsonView类和超长的英文解释后直接晕了———跟我一样,其实完全没必要,请静静的思考一下,我们要的json是什么?还不是字符串,只不过改了个潮点的名字而已,只要能获得HttpServletResponse对象一切OK
用Jackson性能是个考虑 另外在代码里获取HttpServletResponse是不可取的 和Servlet没啥两样了 |
|
返回顶楼 | |