springmvc 可选的方法返回值解析

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。

你可能感兴趣的:(返回值)