springmvc 通过@RequestMapping映射路径到方法体执行业务,业务执行之后,会有返回值,springmvc 根据返回值类型不同,解析出不同的视图。
任何视图的渲染,springmvc都会利用取出放在模型中的数据,例如@ModelAttribute存放的数据,或者方法参数中,绑定成实体类的数据
/** * 任何方法的执行都会先执行这个方法,获取模型数据 */
@ModelAttribute
public Task getTask() {
Task task = new Task();
task.setTaskDetail("mydetai");
task.setTaskName("mytaskName");
return task;
}
/** * task不管是不是有@ModelAttribute 都会绑定到模型数据中 */
public void saveTask(@ModelAttribute Task task){
}
访问值为空时,可以利用HttpServletResponse自己操作response。
@RequestMapping("/rmvc1")
public void rmvc1(HttpServletResponse response) throws IOException {
response.getWriter().write("ffff");//向客户端写入ffff
}
返回值为ModelAndView时,可以定义model和view,也会把模型数据添加到ModelAndView中,在前端可以通过${task.taskName}
@RequestMapping("/rmvc2")
public ModelAndView rmvc2() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("view/viewtest");
modelAndView.addObject("name", "modelAndView");
return modelAndView;
}
返回值为Model ,ModelMap ,Map时,返回的路径为类级别@RequestMapping路径加上方法级别的@RequestMapping路径,如下面的返回路径为”/task/rmvc3”,模型数据会自动添加到其中
@RequestMapping("/rmvc3")
public Model rmvc3(Model model){
model.addAttribute("name", "name");
return model ;
}
@RequestMapping("/rmvc4")
public Map rmvc4(Map map){
map.put("name", "map");
return map ;
}
@RequestMapping("/rmvc5")
public ModelMap rmvc5(ModelMap modelMap){
modelMap.put("name", "modelMap");
return modelMap ;
}
返回值为View 时,可以以编码的方式自定一个view,然后springmvc解析这个view
首先我们来定义一个view,这个view是用来下载excel的,记得加入poi依赖
/** * excel视图 * @author liuxg * @date 2016年4月9日 下午4:08:10 */
@Component("taskListExcelView")
public class TaskListExcelView extends AbstractExcelView {
@SuppressWarnings("unchecked")
@Override
protected void buildExcelDocument(Map<String, Object> model, HSSFWorkbook workbook, HttpServletRequest request,
HttpServletResponse response) throws Exception {
List<Task> tasks = (List<Task>) model.get("tasks");
response.setHeader("Content-disposition", "inline;filename="+new String("任务列表".getBytes() , "iso8859-1") + ".xls");
HSSFSheet sheet = workbook.createSheet("tasks");
HSSFRow header = sheet.createRow(0);
header.createCell(0).setCellValue("任务名");
header.createCell(1).setCellValue("任务详细");
header.createCell(2).setCellValue("创建时间");
int rowNum = 1 ;
for(Task task : tasks){
HSSFRow row = sheet.createRow(rowNum++);
row.createCell(0).setCellValue(task.getTaskName());
row.createCell(1).setCellValue(task.getTaskDetail());
row.createCell(2).setCellValue(task.getCreateTime());
}
}
}
然后我们直接返回view就行
@RequestMapping("/rmvc6")
public View rmvc6(ModelMap modelMap){
List<Task> tasks = new ArrayList<Task>();
Task t = new Task();
t.setCreateTime(new Date());
t.setTaskDetail("taskDetail");
t.setTaskName("taskName");
Task t1 = new Task();
t1.setCreateTime(new Date());
t1.setTaskDetail("taskDetail");
t1.setTaskName("taskName");
tasks.add(t1);
tasks.add(t);
modelMap.put("tasks",tasks);
return new TaskListExcelView() ;
}
当返回字符串String时候,可以利用InternalResourceViewResolver直接返回jsp页面
@RequestMapping("/rmvc7")
public String rmvc7(){
return "view/viewtest" ;
}
可以利用forward:和redirect:进行页面调整,forward和redirect的区别,redirect可以在浏览器地址栏上看到跳转的路径,forward浏览器地址栏的路径还是老的请求路径
@RequestMapping("/rmvc8")
public String rmvc8(){
return "redirect:rmvc5" ;
}
@RequestMapping("/rmvc9")
public String rmvc9(){
return "forward:rmvc5" ;
}
springmvc默认是注册了InternalResourceViewResolver视图解析器进行解析路径,默认是直接跳转到jsp页面,我们还可以注册BeanNameViewResolver来生成一个pdf,json,excel,xml的视图
首先我们把BeanNameViewResolver注册进来
<mvc:view-resolvers>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
<!-- 配置视图资源前缀与后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</mvc:view-resolvers>
然后我们就可以利用BeanNameViewResolver来解析各种视图了
生成excel视图
/** * excel视图 * @author liuxg * @date 2016年4月9日 下午4:08:10 */
@Component("taskListExcelView")
public class TaskListExcelView extends AbstractExcelView {
@SuppressWarnings("unchecked")
@Override
protected void buildExcelDocument(Map<String, Object> model, HSSFWorkbook workbook, HttpServletRequest request,
HttpServletResponse response) throws Exception {
List<Task> tasks = (List<Task>) model.get("tasks");
response.setHeader("Content-disposition", "inline;filename="+new String("任务列表".getBytes() , "iso8859-1") + ".xls");
HSSFSheet sheet = workbook.createSheet("tasks");
HSSFRow header = sheet.createRow(0);
header.createCell(0).setCellValue("任务名");
header.createCell(1).setCellValue("任务详细");
header.createCell(2).setCellValue("创建时间");
int rowNum = 1 ;
for(Task task : tasks){
HSSFRow row = sheet.createRow(rowNum++);
row.createCell(0).setCellValue(task.getTaskName());
row.createCell(1).setCellValue(task.getTaskDetail());
row.createCell(2).setCellValue(task.getCreateTime());
}
}
}
生成pdf视图
@Component("taskListPdfView")
public class TaskListPDFView extends AbstractPdfView{
@Override
protected void buildPdfDocument(Map<String, Object> model, Document document, PdfWriter writer,
HttpServletRequest request, HttpServletResponse response) throws Exception {
}
}
生成jsonview
@Component("taskListJsonView")
public class TaskListJsonView extends MappingJackson2JsonView {
/** * 需要把哪个model渲染到前端 */
protected Object filterModel(Map<String, Object> model) {
return model.get("tasks");
}
}
生成xmlview
@Component("taskListXmlView")
public class TaskListXmlView extends MappingJackson2XmlView{
@Override
protected Object filterModel(Map<String, Object> model) {
// TODO Auto-generated method stub
return model.get("tasks");
}
}
对于controller,我们只需要把viewname写上就可以了
@RequestMapping("/rmvc11")
public String rmvc11(ModelMap modelMap) {
List<Task> tasks = new ArrayList<Task>();
Task t = new Task();
t.setCreateTime(new Date());
t.setTaskDetail("taskDetail");
t.setTaskName("taskName");
Task t1 = new Task();
t1.setCreateTime(new Date());
t1.setTaskDetail("taskDetail");
t1.setTaskName("taskName");
tasks.add(t1);
tasks.add(t);
modelMap.addAttribute("tasks", tasks);
return "taskListExcelView" ;
}
当方法注解@ResponseBody,会利用HttpMessageConverters进行解析,可以根据头部信息设置accept来设置解析的视图为xml或者json
/** * 自动接下为json视图,当设置accept=application/xml时,可以解析为 *xml视图 */
@RequestMapping(value = "/rmvc12")
@ResponseBody
public Map<String, Object> rmvc12(HttpServletResponse res , HttpServletRequest req) {
List<Task> tasks = new ArrayList<Task>();
Task t = new Task();
t.setCreateTime(new Date());
t.setTaskDetail("taskDetail");
t.setTaskName("taskName");
Task t1 = new Task();
t1.setCreateTime(new Date());
t1.setTaskDetail("taskDetail");
t1.setTaskName("taskName");
tasks.add(t1);
tasks.add(t);
Map<String, Object> map = new HashMap<String, Object>();
map.put("list",tasks);
return map;
}
特别注意,json和xml的解析需要用到jackson-annotations-2.7.3.jar,jackson-core-2.7.3.jar,jackson-databind-2.7.3.jar,jackson-dataformat-xml-2.7.3.jar。