SpringMVC的Controller返回各种视图
来源:互联网 发布:卡通睡衣品牌知乎 编辑:程序博客网 时间:2024/05/16 06:10
转载:原文链接
SpringMVC的Controller可以返回各种各样的视图,比如:
- jsp
- json
- velocity
- freeMarker
- xml
- pdf
- excel
- html
那么应该何如去处理呢?这里就涉及到了SpringMVC当中的视图解析器(viewResolver)。而上述的每一种视图(view)就对应了一种视图解析器。可以将视图解析器大致地分成两类:
1) 基于URL的视图解析器(UrlBasedViewResolver);
2) 其它解析器;
所谓的UrlBasedViewResolver,就是将返回值作为最终视图的URL的一部分,然后和相关配置组合起来,就是最终视图地址URL。
我们来看一下UrlBasedViewResolver的解析器有哪些:
1.返回JSP
返回JSP是最简单的一种,JSP视图的视图解析器对应为:InternalResourseViewResolver,也是一个UrlBasedViewResolver解析器。其对应的解析器的配置一般如下:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/></bean>
使用该例子,我们好好地理解一下什么是“基于URL”的视图解析器。比如:我们的Controller中最后的返回处理代码为:
return "index";
那么“基于URL”的视图解析器,就会将返回值“index”作为最后的视图的URL的一部分。然后,结合上面配置的:
<property name = "prefix" value = "/WEB-INF/jsp/" /><property name = "suffix" value = ".jsp" />
最终得到:
"/WEB-INF/jsp/" + "index" + ".jsp" => "/WEB-INF/jsp/index.jsp"
这就是所谓的”基于URL“的视图解析器的工作方式。
2.返回HTML页面
我们知道,在Servlet中,我们是可以直接在其中打印输出HTML字符流到最终页面的,比如下面来自阿里巴巴的支付宝的接入示例中的代码:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); //建立请求 String sHtmlText = AlipaySubmit.buildRequest(sParaTemp,"get","确认"); response.getWriter().println(sHtmlText); }/** 建立请求,以表单HTML形式构造(默认) * @param sParaTemp 请求参数数组 * @param strMethod 提交方式。两个值可选:post、get * @param strButtonName 确认按钮显示文字 * @return 提交表单HTML文本 */ public static String buildRequest(Map<String, String> sParaTemp, String strMethod, String strButtonName) { //待请求参数数组 Map<String, String> sPara = buildRequestPara(sParaTemp); List<String> keys = new ArrayList<String>(sPara.keySet()); StringBuffer sbHtml = new StringBuffer(); sbHtml.append("<!doctype html><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">"); sbHtml.append("<title>支付宝即时到账交易接口</title></head><body>"); sbHtml.append("<form id=\"alipaysubmit\" name=\"alipaysubmit\" action=\"" + ALIPAY_GATEWAY_NEW + "_input_charset=" + AlipayConfig.input_charset + "\" method=\"" + strMethod + "\">"); for (int i = 0; i < keys.size(); i++) { String name = (String) keys.get(i); String value = (String) sPara.get(name); sbHtml.append("<input type=\"hidden\" name=\"" + name + "\" value=\"" + value + "\"/>"); } //submit按钮控件请不要含有name属性 sbHtml.append("<input type=\"submit\" value=\"" + strButtonName + "\" style=\"display:none;\"></form>"); sbHtml.append("<script>document.forms['alipaysubmit'].submit();</script>"); sbHtml.append("</body></html>"); return sbHtml.toString(); }
很显然,Servlet直接将HTML的字符流输出到了浏览器端,那么在SpringMVC中该如何做呢?其实,在SpringMVC中我们也是可以如下实现的:
@RequestMapping(value="/getPage") public void writeSubmitHtml(Reader reader, Writer writer, Httpsession session) throws IOException { User user = (User)session.getAttribute(ConstantConfig.LONGIN_USER); StringBuffer sbHtml = new StringBuffer(); sbHtml.append("<!doctype html><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">"); sbHtml.append("<title>支付宝即时到账交易接口</title></head><body>"+ user.getNo() +"</body></html>"); writer.write(sbHtml.toString()); }
我们看到,我们直接使用了参数Writer writer,返回值为void,其实参数Writer writer也可以换成PrintWriter writer,直接写出HTML字符流。
我们也知道,在Servlet中,我们是可以直接forward或者redirect到HTML页面,所以我们也可以如下,在SpringMVC中返回到HTML页面:
@RequestMapping(value="/htmlView") public void htmlView(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ request.getRequestDispatcher("index.html").forward(request, response); //response.sendRedirect("http://www.baidu.com"); }
这里,我们体会到了:SpringMVC它是建立在Servlet之上的,所以在Servlet中能够做到的,同样在SpringMVC中能够做到。
3.返回JSON格式
返回JSON格式在SpringMVC中有多种处理方式:
1)使用SpringMVC自带的MappingJackson2JsonView来处理。
2)自己写代码将返回值JSON格式化,然后直接用PrintWriter类型的对象写出就行了。
3-1 直接用PrintWriter类型的对象写出JSON格式
@RequiresRoles(value={"student"}) @RequestMapping(value="/queryScoreForStudent") public void queryScoreForStudent(ScoreQueryParam param, HttpSession sesion, PrintWriter printWriter){ Student student = (Student)sesion.getAttribute(ConstantConfig.LONGIN_STUDENT); param.setStudentId(student.getId()); PageBean<StudentScore> scoreList = this.studentCourseService.queryScoreForStudent(param); if(scoreList != null && scoreList.getSize() > 0){ Map<String, Object> map = new HashMap<>(); map.put("result", "ok"); map.put("data", scoreList); printWriter.write(JSON.toJSONString(map)); } }
如上代码所示,我们在方法中加入了PrintWriter printWriter参数,最后的返回结果使用了fastjson库来格式化最后的返回对象map。然后使用printWriter写出。我们看到,方法上的注解并没有使用@ResponseBody。当然,最好这里是在方法上加上@ResponseBody,但是因为返回的map已经是JSON格式的,所以并不需要配置MappingJackson2JsonView。
3-2 使用MappingJackson2JsonView配合@ResponseBody来返回JSON格式
首先需要进行相关的视图解析器的配置:
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="mediaTypes"> <map> <entry key="atom" value="application/atom+xml"/> <entry key="html" value="text/html"/> <entry key="json" value="application/json"/> </map> </property> <property name="viewResolvers"> <list> <!-- <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/> --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean> </list> </property> <property name="defaultViews"> <list> <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" /> </list> </property></bean>
这里用到了ContentNegotiatingResolver,“内容协商视图解析器”,其实就是根据返回什么类型的视图,就协商使用哪种视图解析器。如果返回jsp就使用InternalResorceViewResolver视图解析器,如果返回JSON格式就使用MappingJackson2JsonView来处理。在
<property name = "viewResolver">
下的
<list>
标签下,还可以加入其它各种视图的视图解析器的配置。
配置了MappingJackson2JsonView之后,就没有必要在自己手动JSON格式化了,上面的例子,可以改写成:
@RequiresRoles(value={"student"}) @RequestMapping(value="/queryScoreForStudent") @ResponseBody public Map<String, Object> queryScoreForStudent(ScoreQueryParam param, HttpSession sesion){ Map<String, Object> map = new HashMap<>(); Student student = (Student)sesion.getAttribute(ConstantConfig.LONGIN_STUDENT); param.setStudentId(student.getId()); PageBean<StudentScore> scoreList = this.studentCourseService.queryScoreForStudent(param); System.out.println(JSON.toJSONString(scoreList)); if(scoreList != null && scoreList.getSize() > 0){ map.put("result", "ok"); map.put("data", scoreList); } return map; }
其他格式Velocity, FreeMarker, XML, PDF, Excel等视图的处理,待补充。
- SpringMVC的Controller返回各种视图
- SpringMVC 的 Controller 返回各种视图的处理方式
- SpringMVC 的 Controller 返回各种视图的处理方式
- SpringMvc的Controller返回各种视图的处理方式
- SpringMVC 的 Controller 返回各种视图的处理方式
- 推荐 SpringMVC 的 Controller 返回各种视图的处理方式(3))
- SpringMVC 的 Controller 返回各种视图的处理方式(ViewResolver)
- SpringMVC Controller 的返回类型
- springmvc的controller返回html
- springmvc的controller返回值
- SpringMVC Controller接收前台ajax的GET或POST请求返回各种参数
- SpringMVC Controller接收前台ajax的GET或POST请求返回各种参数
- springMVC controller返回值void 视图解析器如何解析
- SpringMvc的Controller的返回值
- SpringMVC Controller 返回值的可选类型
- SpringMVC Controller 返回值的可选类型
- SpringMVC Controller 返回值的可选类型
- SpringMVC - Controller 返回值的可选类型
- 学生酒精消费预警分类模型建立
- 洛谷 P1064 金明的预算方案
- Java语言基础 数组的排序算法
- 动态规划 HDU-2577
- HDU - 5999 The Third Cup is Free 贪心
- SpringMVC的Controller返回各种视图
- 【LeetCode】 143. Reorder List
- jdk8中的lambda表达式
- Java语言基础 数组的二分查找法
- 值得信任的邀约--记我的阿里云
- python 爬虫 一键爬取 淘宝天猫宝贝页面主图颜色图和详情图
- 【PAT】1086. Tree Traversals Again
- 第十一章:用core.async掌握并发过程
- 基于JAVA的ARP欺骗的程序实现