Springmvc BeanName ViewResolverを使用してexcel,pdf,json,xmlビューを解析

14849 ワード

Springmvcは、InternalResourceVewResolverでURLビューを解析するほか、BeanName ViewResolverでexcelやpdfなどのドキュメントビューに解析することもできます.
BeanName ViewResolverを使用するには、先に登録する必要があります.
<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>
                    <property name="viewClass" value = "org.springframework.web.servlet.view.JstlView"></property>
                </bean>

プロファイルに複数のビュー解析器が登録されている場合は、orderプロパティで解析順序を指定できます.orderが小さいほど優先度が高くなります.springmvcの一連の解析では、InternalResourceViewResolverのデフォルト優先度が最も低く、ContentNegotingViewResolverの優先度が最も高いため、ここではorderを指定する必要はありません.デフォルトではBeanNameViewResolverを使用して解析を行い、返された値がbeanのidとして対応するbeanビューが見つからない場合はInternalResourceViewResolverを使用して解析を行います.
解析excelビュー
BeanNameViewResolver解析excelビューはAbstractExcelViewをビューとして使用する実装クラスです.excelビューを解析するには、AbstractExcelViewにbeanが継承されていることを定義し、poiライブラリに依存する必要があります.
package com.liuxg.util.view;

import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.document.AbstractExcelView;
import com.liuxg.task.entity.Task;

/** * 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());
        }

    }

}

beanを定義したら@Component("taskListExcelView")でspringコンテナに入れます.taskListExcelViewはbeanのidです.次にcontrollerを定義します.
@RequestMapping(value = "/mvcTest5")                                                                                                     
public String  mvcTest5(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" ; //bean id
}

次にpdfとjsonとxml beanを定義します
pdf beanはAbstractPdfViewを継承する必要があり、lowagieライブラリに依存する必要がある
package com.liuxg.util.view;

import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.document.AbstractPdfView;
import com.lowagie.text.Document;
import com.lowagie.text.pdf.PdfWriter;


@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 {

        List<Task> tasks = (List<Task>) model.get("tasks");

        response.setHeader("Content-disposition", "inline;filename="+new String("    ".getBytes() , "iso8859-1") + ".xls");

        //...

    }

}

json beanは、MappingJackson 2 JsonViewを継承し、Jacksonライブラリに依存する必要があります
package com.liuxg.util.view;

import java.util.Map;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;


@Component("taskListJsonView")
public class TaskListJsonView extends MappingJackson2JsonView {


    /** *      model      */
    protected Object filterModel(Map<String, Object> model) {

        return model.get("tasks");
    }

}

xml beanはMappingJackson 2 XmlViewを継承し、Jackson関連ライブラリに参加する必要があります
package com.liuxg.util.view;

import java.util.Map;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.xml.MappingJackson2XmlView;

@Component("taskListXmlView")
public class TaskListXmlView extends MappingJackson2XmlView{

    @Override
    protected Object filterModel(Map<String, Object> model) {
        return model.get("tasks");
    }
}

Controllerでは戻り値を異なるbean idに指さすとよいが,合計する過程をまとめると,Controllerはデータをロードし,モデルデータに格納し,ビュー解析器はControllerの戻り値に基づいて異なるviewに解析し,viewはモデル中のデータを用いてレンダリング生成ビューを行う.