1.返回JSP
返回JSP是最简单的,JSP视图的视图解析器为 InternalResourceViewResolver,也是一个UrlBasedViewResolver解析器。其对应的解析器的配置一般如下:
使用该例子,我们好好理解下什么是 “基于URL” 的视图解析器,比如我们的 Controller 中最后的返回的处理代码为: return "index"; 那么“基于URL” 的视图解析器就会将返回值 “index” 作为最后视图的URL的一部分,然后结合上面的配置和,最后得到最终的URL: "/WEB-INF/jsp/" + "index" + ".jsp" == "/WEB-INF/jsp/index.jsp"
这就是所谓的 “基于URL” 的视图解析器的工作方式。
2.返回 HTML 页面
我们知道在Servlet中,我们是可以直接在其中打印输出HTML字符流到最终页面,比如下面的代码来自阿里巴巴的支付宝的接入示例中的代码:
protectedvoiddoPost(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文本
*/publicstaticString buildRequest(Map sParaTemp, String strMethod, String strButtonName) {
//待请求参数数组Map sPara = buildRequestPara(sParaTemp);
List keys =newArrayList(sPara.keySet());
StringBuffer sbHtml =new StringBuffer();
sbHtml.append("");
sbHtml.append("支付宝即时到账交易接口");
sbHtml.append("
+ "_input_charset=" + AlipayConfig.input_charset + "\" method=\"" + strMethod
+ "\">");
for(inti = 0; i < keys.size(); i++) {
String name = (String) keys.get(i);
String value = (String) sPara.get(name);
sbHtml.append("");
}
//submit按钮控件请不要含有name属性sbHtml.append("");
sbHtml.append("document.forms['alipaysubmit'].submit();");
sbHtml.append("");
return sbHtml.toString();
}
很显然,Servlet直接将HTML的字符流输出到了浏览器端,那么在SpringMVC中该如何做呢?其实在SpringMVC中我们也是可以如下实现的:
@RequestMapping(value="/getPage")
publicvoidwriteSubmitHtml(Reader reader, Writer writer, HttpSession session)throws IOException {
User user = (User) session.getAttribute(ConstantConfig.LONGIN_USER);
StringBuffer sbHtml =new StringBuffer();
sbHtml.append("");
sbHtml.append("支付宝即时到账交易接口"+ user.getNo() +"");
writer.write(sbHtml.toString());
}
我们看到我们直接使用了参数 Writer writer,返回值为 void, 其实参数 Writer writer 也可以换成 PrintWriter writer; 直接写出HTML的字符流。
我们也知道在Servlet中,我们是可以直接forward或者redirecit到html页面,所以我们也可以如下在springmvc中返回到html页面:
@RequestMapping(value="/htmlView")
publicvoidhtmlView(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中有多种处理方式,一种是使用SpirngMVC自带的MappingJackson2JsonView来处理,一种是自己写代码将返回值JSON格式化,然后直接用PrintWrite类型的对象写出就行了。
1)直接用PrintWrite类型的对象写出JSON格式
@RequiresRoles(value={"student"})
@RequestMapping(value="/queryScoreForStudent")
publicvoid queryScoreForStudent(ScoreQueryParam param, HttpSession sesion, PrintWriter printWriter){ Student student = (Student)sesion.getAttribute(ConstantConfig.LONGIN_STUDENT);
param.setStudentId(student.getId());
PageBean scoreList =this.studentCourseService.queryScoreForStudent(param);
if(scoreList !=null&& scoreList.getSize() > 0){
Map map =newHashMap<>();
map.put("result", "ok");
map.put("data", scoreList);
printWriter.write(JSON.toJSONString(map));
}
}
如上代码所示,我们在方法中加入了PrintWriter printWriter参数,最后的返回结果使用了fastjson库来格式化最后的返回的对象map. 然后使用printWriter写出,就行了。我们看到方法上的注解并没有使用 @ResponseBody. 当然最好这里是在方法上加上 @ResponseBody,但是因为返回的map已经是JSON格式的,所以并不需要配置MappingJackson2JsonView !
2)使用MappingJackson2JsonView 配合@ResponseBody来返回JSON格式
首先需要进行相关的视图解析器的配置:
-->
这里用到了ContentNegotiatingViewResolver ,“内容协商视图解析器”,其实就是根据返回什么类型的视图,就协商使用哪种视图解析器。如果返回jsp就使用InternalResourceViewResolver视图解析器,如果返回JSON格式就使用MappingJackson2JsonView来处理。如此而已。在下的 标签下,还可以加入其他的各种视图解析器的配置。
配置了MappingJackson2JsonView之后,就没有必要在自己手动 JSON格式化了,上面的例子,可以改成:
@RequiresRoles(value={"student"})
@RequestMapping(value="/queryScoreForStudent")
@ResponseBody
publicMap queryScoreForStudent(ScoreQueryParam param, HttpSession sesion){ Student student = (Student)sesion.getAttribute(ConstantConfig.LONGIN_STUDENT);
param.setStudentId(student.getId());
PageBean scoreList =this.studentCourseService.queryScoreForStudent(param);
System.out.println(JSON.toJSONString(scoreList));
if(scoreList !=null&& scoreList.getSize() > 0){
Map map =newHashMap<>();
map.put("result", "ok");
map.put("data", scoreList);
return map;
}
}
其他格式Velocity, FreeMarker, XML, PDF, Excel等视图的处理,后面有时间在补上。