1.環境介紹,maven工程,spring與springmvc註解方式進行整合。讓spring管理除controller以外的bean,讓spring mvc管理controller bean。
2.使用ModelAndView模式,給出視圖類代碼,並且給bean命名爲PdfRevenueSummary:
@Component("PdfRevenueSummary")
public class PdfRevenueReportView extends AbstractPdfView {
@Override
protected void buildPdfDocument(Map model, Document document,
PdfWriter writer, HttpServletRequest request,
HttpServletResponse response) throws Exception {
Map<String,String> revenueData = (Map<String,String>) model.get("revenueData");
Table table = new Table(2);
table.addCell("Month");
table.addCell("Revenue");
for (Map.Entry<String, String> entry : revenueData.entrySet()) {
table.addCell(entry.getKey());
table.addCell(entry.getValue());
}
document.add(table);
}
}
控制器類的代碼,返回的是ModelAndView對象
@Controller
public class PDFController extends AbstractController {
@RequestMapping("/getpdf") //進行訪問路徑設置
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String output =
ServletRequestUtils.getStringParameter(request, "output");
//dummy data
Map<String,String> revenueData = new HashMap<String,String>();
revenueData.put("1/20/2010", "$100,000");
revenueData.put("1/21/2010", "$200,000");
revenueData.put("1/22/2010", "$300,000");
revenueData.put("1/23/2010", "$400,000");
revenueData.put("1/24/2010", "$500,000");
if(output ==null || "".equals(output)){
//return normal view
return new ModelAndView("RevenueSummary","revenueData",revenueData);
}else if("PDF".equals(output.toUpperCase())){
//return excel view
System.out.println("come here");
return new ModelAndView("PdfRevenueSummary","revenueData",revenueData);
}else{
//return normal view
return new ModelAndView("RevenueSummary","revenueData",revenueData);
}
}
}
springmvc的設置類
@EnableWebMvc //啓用springmvc自動註解
@ComponentScan(basePackages="myspring",useDefaultFilters=false,includeFilters={@Filter(type=FilterType.ANNOTATION,
classes={Controller.class}),
//自己寫的過濾器,不讓spring加載pdf的視圖類,讓springmvc加載視圖類
@Filter(type=FilterType.CUSTOM,classes={myspring.inter.MyFilter.class})})
public class AppConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
registry.addInterceptor(new HelloInterceptor()).addPathPatterns("/**");
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
// TODO Auto-generated method stub
configurer.enable();
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// TODO Auto-generated method stub
registry.beanName(); //以返回的視圖名字查找bean
registry.jsp("/WEB-INF/views/", ".jsp");
}
3.注意的一點是,爲了讓springmvc加載pdf的視圖類,自己寫了一個過濾器,不讓spring掃描,讓springmvc進行掃描加。我總結的大致執行過程是這樣:在瀏覽器中輸入地址,然後springmvc的攔截器攔截,交給根據url匹配的控制器,控制處理後返回一個
ModelAndView對象,根據視圖名稱,視圖解析器解析視圖,查到一個同名的bean,然後返回這個bean。
這是我自己的理解,有理解不對的地方,請各位老師指正。