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。
这是我自己的理解,有理解不对的地方,请各位老师指正。