spring与freemarker集成,顺带spring mvc的helloword部署

来源:互联网 发布:linux软件在哪里下载 编辑:程序博客网 时间:2024/04/29 17:00

      spring与freemarker集成的文章在网上有很多,我就是照着做的,不过按照惯例,我每次搞这种玩意都会出现问题,这次也一样,出现了下面这个错误(请允许我先说错误,再说怎么部署):

      严重: Servlet.service() for servlet hello threw exception

       javax.servlet.ServletException: Could not resolve view with name ' 

           hellouser.ftl ' in servlet with name 'hello'

       at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1029)

       at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)

       at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)

       at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)

       at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)

       at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)

       at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

       at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)

       at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)

       at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)

       at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

       at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

       at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)

       at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)

       at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)

       at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)

       at java.lang.Thread.run(Thread.java:595)

 

       这个问题遇到的人应该不会很多,所以网上相关的解决方案也不多,很多很不靠谱啊,靠人不如靠自己,咱有源码,自己查问题呗,其实也就是debug啦。

       通过源码发现,报出这个错误的地方的代码是

        

       view为null就报这样的错误,那为什么view为null呢?靠呗,你好歹也把freemaker的错误给我打出来么,这样一个错误让人怎么查呢?好吧,只有查看view为什么会null了,这里甚至要看freemaker的代码了。

       中间省略几百字,知道源头了

       查找过程如下:

       1.org.springframework.web.servlet.DispatcherServlet.render的1027

       2.org.springframework.web.servlet.DispatcherServlet.resolveViewName的1078

                     View view = viewResolver.resolveViewName(viewName, locale);

       3.org.springframework.web.servlet.view.AbstractCachingViewResolver.resolveViewName的77行

                     view = createView(viewName, locale);

       4.org.springframework.web.servlet.view.UrlBasedViewResolver.createView的384行

                     return super.createView(viewName, locale);

       5.org.springframework.web.servlet.view.AbstractCachingViewResolver.createView的158行
       6.org.springframework.web.servlet.view.AbstractCachingViewResolver.loadView的421行
                     return (view.checkResource(locale) ? result : null);
       7.org.springframework.web.servlet.view.freemarker.FreeMarkerView.checkResource的203行
                     getTemplate(getUrl(), locale);
       8.org.springframework.web.servlet.view.freemarker.FreeMarkerView.getTemplate的350行
                     getConfiguration().getTemplate(name, locale))
       //下面是freemarker的源码
       9.freemarker.template.getTemplate的459行
       10.freemarker.template.getTemplate的487行   这里出错。
        好吧,其实如果你的日志记录是debug模式的,那么你会看到以下错误:
        No FreeMarker view found for URL: 
      hellouser.ftl 
         
        其实就是找不到对应的模板文件,检查了下我的配置:
         
    
        不知道各位看官看出问题没,揭晓答案:
        <property name="viewPage">
              <value> 
                   hellouser.ftl 
              </value>
       </property>
         由于hellouser.ftl的前后不但有空格,还有回车符,怪不得丫的找不到模板文件,就为这玩意,浪费老子半天时间,奶奶个熊得,抱怨完毕。
         查这个问题的时候,有人说这个问题的解决方法只有两个:
         1.检查你的配置是否正确(一般如果你按照网上人家的配置方式做,那肯定没问题)
         2.检查你的模板文件位置是否对(我咋看起来是对的,其实有空格符,回车符这些玩意在,导致不准确了)
         如果各位遇到同样的问题,不妨先检查下这两个原因,实在不行,就调试源代码吧~
 
---------------------------------------------------分割线--------------------------------------------------------------------------
         好了问题描述完毕,接下来我大致说下如何配置一个简单的springfamework mvc代码,用freemarker做页面引擎的
         首先自然要先下载spring的jar包
         http://www.springsource.org/download下载最新的spring release
        1. 建立一个常规的web工程,
        2. 帮上述jar包引入,顺便再引入
             commons-logging-1.1.jar
             freemarker.jar
             jstl.jar
        3.配置web.xml如下
           
        4.配置hello-servlet.xml,需要放在/WEB-INF/classes/里,当然这是根据上述的web.xml的contextConfigLocation的配置而定
           
        5.写个java代码
            
        6.写个页面文件,hellouser.ftl放在/WEB-INF/view/下面,这个当然又是根据hello-servlet.xml的templateLoaderPath来定的,你可以随便修改目录,只要对的上既可。
          

         7.结束了,应该可以了吧。上述也就是做个参考而已嘿嘿。用http://localhost:2012/springbase/hellouser.do?user=ben访问成功,必须要传递user这个参数呢,不传,出错,为啥?问你自己诺~

 

        ---------------------------------------------------分割线--------------------------------------------------------------------------

       这里再加个题外话,hello-servlet.xml里的viewResolver的配置中我们配置的是freemarker,spring以AOP注入属性值,

org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver这个类中有个属性值是suffix,网上关于spring与freemarker的集成的时候,经常会有人配置这个属性值为.ftl,比如:

        

       从属性值上看是指后缀名,我一开始还以为是只解析以.ftl为后缀的文件,后来调试的时候发现它是给原来的url路径再加个后最,比如我的url路径是hellouser.ftl,结果到后面获取模板的时候就变成了hellouser.ftl.ftl,不知道有没有人深受这个祸害,我还没有自己看源码,所以有可能会出现这个问题,还需要多加注意那。

 

原创粉丝点击