Springmvc BeanName ViewResolverを使用してexcel,pdf,json,xmlビューを解析
Springmvcは、InternalResourceVewResolverでURLビューを解析するほか、BeanName ViewResolverでexcelやpdfなどのドキュメントビューに解析することもできます.
BeanName ViewResolverを使用するには、先に登録する必要があります.
プロファイルに複数のビュー解析器が登録されている場合は、orderプロパティで解析順序を指定できます.orderが小さいほど優先度が高くなります.springmvcの一連の解析では、InternalResourceViewResolverのデフォルト優先度が最も低く、ContentNegotingViewResolverの優先度が最も高いため、ここではorderを指定する必要はありません.デフォルトではBeanNameViewResolverを使用して解析を行い、返された値がbeanのidとして対応するbeanビューが見つからない場合はInternalResourceViewResolverを使用して解析を行います.
解析excelビュー
BeanNameViewResolver解析excelビューはAbstractExcelViewをビューとして使用する実装クラスです.excelビューを解析するには、AbstractExcelViewにbeanが継承されていることを定義し、poiライブラリに依存する必要があります.
beanを定義したら@Component("taskListExcelView")でspringコンテナに入れます.taskListExcelViewはbeanのidです.次にcontrollerを定義します.
次にpdfとjsonとxml beanを定義します
pdf beanはAbstractPdfViewを継承する必要があり、lowagieライブラリに依存する必要がある
json beanは、MappingJackson 2 JsonViewを継承し、Jacksonライブラリに依存する必要があります
xml beanはMappingJackson 2 XmlViewを継承し、Jackson関連ライブラリに参加する必要があります
Controllerでは戻り値を異なるbean idに指さすとよいが,合計する過程をまとめると,Controllerはデータをロードし,モデルデータに格納し,ビュー解析器はControllerの戻り値に基づいて異なるviewに解析し,viewはモデル中のデータを用いてレンダリング生成ビューを行う.
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はモデル中のデータを用いてレンダリング生成ビューを行う.