spring mvc使用AbstractPdfView 返回pdf視圖實現過程

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。

 

這是我自己的理解,有理解不對的地方,請各位老師指正。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章