Hello,
I am trying to get the structure in place to use JasperReports for my web app using spring, but I can't seem to get the URL's to call the right handler methods. The following is my setup:
Fragment of web.xml
Fragment of reports-servlet.xml:Code:<servlet> <servlet-name>controllers</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet> <servlet-name>reports</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>controllers</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>reports</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>reports</servlet-name> <url-pattern>*.pdf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>reports</servlet-name> <url-pattern>*.csv</url-pattern> </servlet-mapping>
Controller code:Code:<beans> <!-- ================== Basic Reports Definitions ================= --> <!-- ResourceBundleViewResolver configures the whole set of JasperReports --> <bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"> <!-- Pointer to classes/reports.properties --> <property name="basename"> <value>reports</value> </property> </bean> <!-- Map url's to bean names --> <!-- <bean id="defaultHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>--> <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/secure/staff/exampleReport.*">exampleReport</prop> </props> </property> </bean> <!-- For the report controllers, resolve the method to call based on which type of report is requested. --> <bean id="resolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver"> <property name="mappings"> <props> <prop key="/*.pdf">handlePdf</prop> <prop key="/*.html">handleHtml</prop> <prop key="/*.csv">handleCsv</prop> <prop key="/*.*">handleCsv</prop> </props> </property> </bean> <!-- =============== Controller Definitions ============== --> <bean id="exampleReport" class="org.dm.daniel.hope.web.report.ExampleReportController"> <property name="methodNameResolver"><ref local="resolver"/></property> </bean> </beans>
Code:public class ExampleReportController extends AbstractReportController { protected String getReportId() { return "exampleReport"; } protected Map getModel(HttpServletRequest request, HttpServletResponse response) throws Exception { Map model = new HashMap(); model.put("ReportTitle", "title!"); return model; } protected Collection getDataSource(HttpServletRequest request, HttpServletResponse response) throws Exception { List list = new ArrayList(); return list; } } // Simple abstract class for generating reports that specifies // the handler methods public abstract class AbstractReportController extends MultiActionController { protected static final String DATA_SOURCE_KEY = "dataSource"; public ModelAndView handleCsv(HttpServletRequest request, HttpServletResponse response) throws Exception { return new ModelAndView(getReportId() + "Csv", getReportModel(request, response)); } public ModelAndView handleHtml(HttpServletRequest request, HttpServletResponse response) throws Exception { return new ModelAndView(getReportId() + "Html", getReportModel(request, response)); } public ModelAndView handlePdf(HttpServletRequest request, HttpServletResponse response) throws Exception { return new ModelAndView(getReportId() + "Pdf", getReportModel(request, response)); } protected Map getReportModel(HttpServletRequest request, HttpServletResponse response) throws Exception { // Needs to be a linked hash map to preserve the order of the elements Map ret = new LinkedHashMap(); // Set the data source first because the first collection needs to be // the data source for Spring to detect it ret.put(DATA_SOURCE_KEY, getDataSource(request, response)); // Add the rest of the model ret.putAll(getModel(request, response)); return ret; } protected abstract String getReportId(); protected Map getModel(HttpServletRequest request, HttpServletResponse response) throws Exception { return new HashMap(); } protected abstract Collection getDataSource(HttpServletRequest request, HttpServletResponse response) throws Exception; }
However, everytime I try to go to: http://localhost:8080/MyApp/secure/s...mpleReport.pdf
I get the following in the log:
Which then gives me a 404 - Page Not Found. What am I doing wrong? For those who have more experience using the JasperReports framework in Spring, is my approach a good one?
2005-04-19 16:31:49,474 DEBUG [org.springframework.web.servlet.DispatcherServlet] Testing handler map [org.springframework.web.servlet.handler.SimpleUrlH andlerMapping@1497b1] in DispatcherServlet with name 'reports'
2005-04-19 16:31:49,474 DEBUG [org.springframework.web.servlet.handler.SimpleUrlH andlerMapping] Looking up handler for [/secure/staff/exampleReport.pdf]
2005-04-19 16:31:49,474 DEBUG [org.springframework.web.servlet.DispatcherServlet] Testing handler adapter [org.springframework.web.servlet.mvc.SimpleControll erHandlerAdapter@167acf2]
2005-04-19 16:31:49,475 DEBUG [org.springframework.web.servlet.DispatcherServlet] Last-Modified value for [/MyApp/secure/staff/exampleReport.pdf] is [-1]
2005-04-19 16:31:49,475 DEBUG [org.springframework.web.servlet.DispatcherServlet] DispatcherServlet with name 'reports' received request for [/MyApp/secure/staff/exampleReport.pdf]
2005-04-19 16:31:49,475 DEBUG [org.springframework.web.servlet.DispatcherServlet] Testing handler adapter [org.springframework.web.servlet.mvc.SimpleControll erHandlerAdapter@167acf2]
2005-04-19 16:31:49,475 WARN [org.springframework.web.servlet.PageNotFound] No handling method can be found for request [org.apache.catalina.connector.RequestFacade@18b4cc b]


Reply With Quote