大家好:我想在已经搞好的spring3.0 mvc restFul 上面把视图层换成FreeMarker,我现在的代码是从本网站http://download.csdn.net/source/2226304下载的,很好用,可它里面是用jsp做为视图层,我现在想把他换成FreeMarker,我主要的改动是把springmvc-servlet:
<?xml version="1.0" encoding="UTF-8"?><!-- 
修改说明:
1.修改<context:component-scan以确定要加载的controller,默认为com.**.controller
2.修改class=ControllerClassNameHandlerMapping节点的pathPrefix以确定要生成的前缀
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd"
default-autowire="byName"> <!-- 自动搜索@Controller标注的类 -->
<context:component-scan base-package="com.**.controller" /> <bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> <bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<!-- Default ViewResolver -->

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">   
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>   
<property name="prefix" value="/pages"/>   
<property name="suffix" value=".jsp"></property>   
</bean>   <bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource"
p:basename="i18n/messages" /> <!-- Mapping exception to the handler view -->
<bean id="exceptionResolver"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props></props>
</property>
</bean></beans>
换成
<?xml version="1.0" encoding="UTF-8"?><!-- 
修改说明:
1.修改<context:component-scan以确定要加载的controller,默认为com.**.controller
2.修改class=ControllerClassNameHandlerMapping节点的pathPrefix以确定要生成的前缀
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd"
default-autowire="byName"> <!-- 自动搜索@Controller标注的类 -->
<context:component-scan base-package="com.**.controller" /> <bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> <bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<!-- Default ViewResolver -->
<!-- 
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">   
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>   
<property name="prefix" value="/pages"/>   
<property name="suffix" value=".jsp"></property>   
</bean>  
-->
<bean id="freeerResolver"
class="org.springframework.web.servlet.view.freeer.FreeMarkerViewResolver">
<property name="order" value="1" />
<property name="prefix" value="/WEB-INF/pages" />
<property name="suffix" value=".ftl" />
<property name="contentType" value="text/html;charset=utf-8" />
<property name="viewClass">
<value>
org.springframework.web.servlet.view.freeer.FreeMarkerView
</value>
</property>
</bean> <bean id="freeerConfig"
class="org.springframework.web.servlet.view.freeer.FreeMarkerConfigurer"> <property name="defaultEncoding" value="UTF-8" />
</bean>
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource"
p:basename="i18n/messages" /> <!-- Mapping exception to the handler view -->
<bean id="exceptionResolver"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props></props>
</property>
</bean></beans>控制类:
/*
 * Powered By [rapid-framework]
 * Web Site: http://www.rapid-framework.org.cn
 * Google Code: http://code.google.com/p/rapid-framework/
 */
package com.company.project.controller.demo;import java.util.Map;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;import cn.org.rapid_framework.page.Page;
import cn.org.rapid_framework.page.PageRequest;import java.util.*;import javacommon.base.*;
import javacommon.util.*;import cn.org.rapid_framework.util.*;
import cn.org.rapid_framework.web.util.*;
import cn.org.rapid_framework.page.*;
import cn.org.rapid_framework.page.impl.*;import com.company.project.model.*;
import com.company.project.dao.*;
import com.company.project.service.*;/**
 * @author badqiu email:badqiu(a)gmail.com
 * @version 1.0
 * @since 1.0
 */@Controller
@RequestMapping("/userinfo")
public class UserInfoController extends BaseRestSpringController<UserInfo,java.lang.Long>{
//默认多列排序,example: username desc,createTime asc
protected static final String DEFAULT_SORT_COLUMNS = null; 

private UserInfoManager userInfoManager;

private final String LIST_ACTION = "redirect:/userinfo";

/** 
 * 增加setXXXX()方法,spring就可以通过autowire自动设置对象属性
 **/
public void setUserInfoManager(UserInfoManager manager) {
this.userInfoManager = manager;
}

/** 列表 */
@Override
public ModelAndView index(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) {
PageRequest<Map> pageRequest = newPageRequest(request,DEFAULT_SORT_COLUMNS);
return new ModelAndView("/userinfo/index","userInfo","我成功了"); }

/** 进入新增 */
@Override
public ModelAndView _new(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) throws Exception {
return new ModelAndView("/userinfo/new","userInfo",userInfo);
}

/** 显示 */
@Override
public ModelAndView show(@PathVariable java.lang.Long id) throws Exception {
UserInfo userInfo = (UserInfo)userInfoManager.getById(id);
return new ModelAndView("/userinfo/show","userInfo",userInfo);
}

/** 编辑 */
@Override
public ModelAndView edit(@PathVariable java.lang.Long id) throws Exception {
UserInfo userInfo = (UserInfo)userInfoManager.getById(id);
return new ModelAndView("/userinfo/edit","userInfo",userInfo);
}

/** 保存新增 */
@Override
public ModelAndView create(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) throws Exception {
userInfoManager.save(userInfo);
return new ModelAndView(LIST_ACTION);
}

/** 保存更新 */
@Override
public ModelAndView update(@PathVariable java.lang.Long id,HttpServletRequest request,HttpServletResponse response) throws Exception {
UserInfo userInfo = (UserInfo)userInfoManager.getById(id);
bind(request,userInfo);
userInfoManager.update(userInfo);
return new ModelAndView(LIST_ACTION);
}

/** 删除 */
@Override
public ModelAndView delete(@PathVariable java.lang.Long id) {
userInfoManager.removeById(id);
return new ModelAndView(LIST_ACTION);
} /** 批量删除 */
@Override
public ModelAndView batchDelete(java.lang.Long[] items) {
for(int i = 0; i < items.length; i++) {
userInfoManager.removeById(items[i]);
}
return new ModelAndView(LIST_ACTION);
}

}访问url:http://localhost:8080/spfk/userinfo却报错:
HTTP Status 500 - --------------------------------------------------------------------------------type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception javax.servlet.ServletException: Could not resolve view with name '/userinfo/index' in servlet with name 'springmvc'
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1042)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:798)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552)
javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:71)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:738)
note The full stack trace of the root cause is available in the Apache Tomcat/5.5.28 logs.
--------------------------------------------------------------------------------
项目紧,还望高手们帮我尽快解决,本人不剩感激

解决方案 »

  1.   

    <!-- ftl文件位置-->
       <bean id="freeerConfig"   
            class="org.springframework.web.servlet.view.freeer.FreeMarkerConfigurer">  
            <property name="templateLoaderPath" value="/WEB-INF/templates/"/>  
        </bean>  
    <!--使用freeer的resolver-->
        <bean id="viewResolver"   
            class="org.springframework.web.servlet.view.freeer.FreeMarkerViewResolver">  
            <property name="viewClass">  
                <value>   
                    org.springframework.web.servlet.view.freeer.FreeMarkerView   
                </value>  
            </property>  
            <property name="prefix">  
                <value>/</value>  
            </property>  
            <property name="suffix">  
                <value>.ftl</value>  
            </property>  
    <!-- 如果你需要使用Spring 对 FreeMarker 宏命令的支持, 将这个属性设为true  -->
    <property name="exposeSpringMacroHelpers" value="true" />
            <property name="contentType" value="text/html;charset=utf-8"></property>  
        </bean>  
          <!--使用简单HandlerMapping-->
          
        <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
            <property name="mappings">  
                <props>  
                    <prop key="/userinfo/index">UserController</prop>  
                </props>  
            </property>  
        </bean>  
          
           
           
          
        <bean id="UserController" class="com.company.project.controller.demo.UserInfoController"></bean>  
      

  2.   

    非常感谢您的回复,
    为什么视图层使用jsp的话就可以使用restFul,而现在换成freeer却要使用简单HandlerMapping,因为我想达到restful的效果,该怎么配置呢?
      

  3.   

    请问各位高手是否有spring3.0 mvc 整合 freeer的例子和配置,特别是springmvc-servlet.xml和web.xml的配置,我看了很多网上高人的配置,他们只给出了springmvc-servlet.xml,而没有给出web.xml,
    我不知道是否是我自己的web.xml错误了还是他们的springmvc-servlet.xml错误,我运行起来就报错,对jsp支持到了好的,但一换上freeer配置:
    <bean id="freeerConfig"
    class="org.springframework.web.servlet.view.freeer.FreeMarkerConfigurer">
    <property name="templateLoaderPath"
    value="/WEB-INF/jsp/" />
    </bean>
    <bean id="viewResolver"
    class="org.springframework.web.servlet.view.freeer.FreeMarkerViewResolver">
    <property name="cache" value="true" />
    <property name="prefix" value="" />
    <property name="suffix" value=".ftl" />
    </bean>
    就报错:
    javax.servlet.ServletException: Servlet.init() for servlet hello threw exception
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873)
    org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
    org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    java.lang.Thread.run(Thread.java:595)root causeorg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'viewResolver' defined in ServletContext resource [/WEB-INF/hello-servlet.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
    PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'viewClass' threw exception; nested exception is java.lang.IllegalArgumentException: Given view class [org.springframework.web.servlet.view.freeer.FreeMarkerViewResolver] is not of type [org.springframework.web.servlet.view.InternalResourceView]
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1341)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:557)
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:842)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:416)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:443)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:459)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:340)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:307)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127)
    javax.servlet.GenericServlet.init(GenericServlet.java:212)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873)
    org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
    org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    java.lang.Thread.run(Thread.java:595)root causeorg.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
    PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'viewClass' threw exception; nested exception is java.lang.IllegalArgumentException: Given view class [org.springframework.web.servlet.view.freeer.FreeMarkerViewResolver] is not of type [org.springframework.web.servlet.view.InternalResourceView]
    org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:102)
    org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1338)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:557)
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:842)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:416)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:443)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:459)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:340)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:307)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127)
    javax.servlet.GenericServlet.init(GenericServlet.java:212)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873)
    org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
    org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    java.lang.Thread.run(Thread.java:595)
      

  4.   

    哎 分不够 不能下载那个例子 看下 
    我也是Spring 入门级的
    帮你顶下吧 
      

  5.   

    LZ 发的代码和我现在写的代码基本上差不多
    我也是刚接触springMVC正在辛苦学习中
    如方便的话 加QQ 330120034 以后共同研究!
      

  6.   

    我已经知道问题的所在了,原来是我的freeer.jar的版本太低了,要使用 freeer.jar v.2.3.16 就一切正常了!谢谢各位的关注,
      

  7.   

    我也是Spring 入门级的
    帮你顶下吧
      

  8.   

    1.Web.xml配置如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- session超时定义,单位为分钟 -->
    <session-config>
    <session-timeout>10</session-timeout>
    </session-config>

    <listener>
    <listener-class>
    org.springframework.web.context.ContextLoaderListener
    </listener-class>
    </listener> <!-- Spring ApplicationContext配置文件的路径�,可使用通配符,多个路径用�1,号分隔
    此参数用于后面的Spring-Context loader --> <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    classpath:resources/spring/applicationContext-security.xml
    </param-value>
    </context-param> <!-- 
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:spring/*.xml</param-value>
    </context-param>
    -->
    <!-- 默认i18n资源文件 -->
    <!-- 
    <context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>i18n/messages</param-value>
    </context-param>
    -->
    <!-- 默认首页定义 -->
    <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.html</welcome-file>
    </welcome-file-list> <!--============================= Error Page定义 =================================================-->
    <error-page>
    <error-code>500</error-code>
    <location>/commons/error.jsp</location>
    </error-page>
    <error-page>
    <error-code>404</error-code>
    <location>/commons/404.jsp</location>
    </error-page>
    <error-page>
    <error-code>403</error-code>
    <location>/commons/403.jsp</location>
    </error-page>
    <!-- ================================Spring Mvc =====================================-->
    <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet> <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!-- ==============================  SpringSecurity filter   ================================================= --> <filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>
    org.springframework.web.filter.DelegatingFilterProxy
    </filter-class>
    </filter>
    <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping> <!--==================================== 自定义过滤器 ===================================-->
    <filter>
    <filter-name>webControlFilter</filter-name>
    <filter-class>
    com.huawei.portal.filter.WebControlFilter
    </filter-class>
    </filter> <filter-mapping>
    <filter-name>webControlFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping> <!--==================================== 著名 Character Encoding filter ===================================-->
    <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>
    org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>utf-8</param-value>
    </init-param>
    <init-param>
    <param-name>forceEncoding</param-name>
    <param-value>true</param-value>
    </init-param>
    </filter> <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping> <!-- =========================使Spring支持request与session的scope,如:<bean id="loginAction" class="com.foo.LoginAction" scope="request"/> ==================================-->
    <listener>
    <listener-class>
    org.springframework.web.context.request.RequestContextListener
    </listener-class>
    </listener> <!-- ================================Spring 刷新Introspector防止内存泄露 =====================================-->
    <listener>
    <listener-class>
    org.springframework.web.util.IntrospectorCleanupListener
    </listener-class>
    </listener>
    <!-- ===========================  HiddenHttpMethodFilter  ==================================================-->
    <filter>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <filter-class>
    org.springframework.web.filter.HiddenHttpMethodFilter
    </filter-class>
    </filter> <filter-mapping>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <servlet-name>springmvc</servlet-name>
    </filter-mapping> <!--  ===============================  sitemesh start =======================================================-->
    <filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>
    com.opensymphony.module.sitemesh.filter.PageFilter
    </filter-class>
    </filter> <filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping> <servlet>
    <servlet-name>sitemesh-freeer</servlet-name>
    <servlet-class>
    com.opensymphony.module.sitemesh.freeer.FreeerDecoratorServlet
    </servlet-class>
    <init-param>
    <param-name>TemplatePath</param-name>
    <param-value>/</param-value>
    </init-param>
    <init-param>
    <param-name>default_encoding</param-name>
    <param-value>utf-8</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>sitemesh-freeer</servlet-name>
    <url-pattern>*.ftl</url-pattern>
    </servlet-mapping> <!-- not required for containers that fully support JSP 1.2 -->
    <taglib>
    <taglib-uri>sitemesh-page</taglib-uri>
    <taglib-location>
    /WEB-INF/lib/sitemesh-page.tld
    </taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>sitemesh-decorator</taglib-uri>
    <taglib-location>
    /WEB-INF/lib/sitemesh-decorator.tld
    </taglib-location>
    </taglib> <!--  =================================================== sitemesh end =======================================-->
    <!-- ===================== 访问静态的/static/ 如http://localhost/foo.css ,则要换成http://localhost/static/foo.css -->
    <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
    </servlet-mapping></web-app>
      

  9.   

    在web.xml配置中
    <!-- ==============================  SpringSecurity filter   --> <filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>
    org.springframework.web.filter.DelegatingFilterProxy
    </filter-class>
    </filter>
    <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>此配置是用与Security登陆用的,如果不用可以去掉
    <!--  ===============================  sitemesh start =======================================================-->
    <filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>
    com.opensymphony.module.sitemesh.filter.PageFilter
    </filter-class>
    </filter> <filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping> <servlet>
    <servlet-name>sitemesh-freeer</servlet-name>
    <servlet-class>
    com.opensymphony.module.sitemesh.freeer.FreeerDecoratorServlet
    </servlet-class>
    <init-param>
    <param-name>TemplatePath</param-name>
    <param-value>/</param-value>
    </init-param>
    <init-param>
    <param-name>default_encoding</param-name>
    <param-value>utf-8</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>sitemesh-freeer</servlet-name>
    <url-pattern>*.ftl</url-pattern>
    </servlet-mapping> <!-- not required for containers that fully support JSP 1.2 -->
    <taglib>
    <taglib-uri>sitemesh-page</taglib-uri>
    <taglib-location>
    /WEB-INF/lib/sitemesh-page.tld
    </taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>sitemesh-decorator</taglib-uri>
    <taglib-location>
    /WEB-INF/lib/sitemesh-decorator.tld
    </taglib-location>
    </taglib> <!--  =================================================== sitemesh end =======================================-->此配置是sitemesh配置,如果不用可以去掉
    除了上面所讲外,web.xml的其他配置就是spring3.0 restful 的配置
    2. springmvc-servlet.xml配置文件:
    <?xml version="1.0" encoding="UTF-8"?><!-- 
    修改说明:
    1.修改<context:component-scan以确定要加载的controller,默认为com.**.controller
    2.修改class=ControllerClassNameHandlerMapping节点的pathPrefix以确定要生成的前缀
    -->
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context-3.0.xsd"
    default-autowire="byName"> <!-- ============================  自动搜索@Controller标注的类 ===================================== -->
    <context:component-scan base-package="com.**.controller" /> <bean
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> <bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> <!-- ============================ ftl文件位置 ============================ --> <bean id="freeerConfig"
    class="org.springframework.web.servlet.view.freeer.FreeMarkerConfigurer">
    <property name="templateLoaderPath" value="/WEB-INF/pages/" />
    <property name="freeerSettings">
    <props>
    <prop key="template_update_delay">1</prop>
    <prop key="defaultEncoding">UTF-8</prop><!-- 乱码 重点在这里 也可以改成gb2312-->
    <prop key="classic_compatible">true</prop><!-- 为null时候替换成空,而不报错--> <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
    <prop key="time_format">HH:mm:ss</prop>
    <prop key="number_format">0.######</prop>
    <prop key="boolean_format">true,false</prop>
    <!-- 
    <prop key="auto_import">"index.ftl" as p</prop>
    <prop key="whitespace_stripping">true</prop>
    <prop key="tag_syntax">auto_detect</prop>
    <prop key="url_escaping_charset">UTF-8</prop>
    -->
    </props>
    </property> </bean> <bean id="viewResolver"
    class="org.springframework.web.servlet.view.freeer.FreeMarkerViewResolver">
    <property name="viewClass">
    <value>
    org.springframework.web.servlet.view.freeer.FreeMarkerView
    </value>
    </property>
    <property name="prefix">
    <value>/</value>
    </property>
    <property name="suffix">
    <value>.ftl</value>
    </property> <property name="exposeSpringMacroHelpers" value="true" />
    <property name="contentType" value="text/html;charset=utf-8"></property>
    </bean> <!-- 
    <bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource"
    p:basename="i18n/messages" />
    --> <!--   i18n   Resource   Bundle   -->
    <bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
    <list>
    <value>resources/i18n/messages</value>
    </list>
    </property>
    </bean><!-- 
    <bean id="localeChangeInterceptor"
    class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> <bean id="defaultUrlMapping"
    class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
    <property name="interceptors"
    ref="localeChangeInterceptor" />
    <property name="order">
    <value>1</value>
    </property>
    </bean>
     -->
    </beans>
      

  10.   

    3. sitemesh.xml配置文件:
    <sitemesh>
        <property name="decorators-file" value="/WEB-INF/decorators.xml"/>
        <excludes file="${decorators-file}"/> <page-parsers>
    <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
    </page-parsers> <decorator-mappers> <mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper">
    <param name="property.1" value="meta.decorator" />
    <param name="property.2" value="decorator" />
    </mapper> <mapper class="com.opensymphony.module.sitemesh.mapper.FrameSetDecoratorMapper">
    </mapper> <mapper class="com.opensymphony.module.sitemesh.mapper.AgentDecoratorMapper">
    <param name="match.MSIE" value="ie" />
    <param name="match.Mozilla [" value="ns" />
    <param name="match.Opera" value="opera" />
    <param name="match.Lynx" value="lynx" />
    </mapper> <mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
    <param name="decorator" value="printable" />
    <param name="parameter.name" value="printable" />
    <param name="parameter.value" value="true" />
    </mapper> <mapper class="com.opensymphony.module.sitemesh.mapper.RobotDecoratorMapper">
    <param name="decorator" value="robot" />
    </mapper> <mapper class="com.opensymphony.module.sitemesh.mapper.ParameterDecoratorMapper">
    <param name="decorator.parameter" value="decorator" />
    <param name="parameter.name" value="confirm" />
    <param name="parameter.value" value="true" />
    </mapper> <mapper class="com.opensymphony.module.sitemesh.mapper.FileDecoratorMapper">
    </mapper> <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
    <param name="config" value="${decorators-file}" />
    </mapper> </decorator-mappers></sitemesh>
    4. decorators.xml配置:
    <?xml version="1.0" encoding="utf-8"?><decorators defaultdir="/WEB-INF/decorators">
        <!-- Any urls that are excluded will never be decorated by Sitemesh -->
        <excludes>
            <pattern>/index.jsp</pattern>
            <pattern>/exclude/*</pattern>
        </excludes>    <decorator name="default" page="head_demo.ftl">
            <pattern>/userinfo*</pattern>
        </decorator>
        <!-- 
        <decorator name="nohead" page="nohead_demo.ftl">
            <pattern>/nohea</pattern>
        </decorator>
     -->
        
    </decorators>5.所用类如下:
    /*
     * Powered By [rapid-framework]
     * Web Site: http://www.rapid-framework.org.cn
     * Google Code: http://code.google.com/p/rapid-framework/
     */package com.huawei.portal.controller.demo;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.multiaction.MultiActionController;import com.huawei.portal.model.Info;
    import com.huawei.portal.model.UserInfo;
    import com.huawei.portal.support.base.BaseSpringController;/**
     * @author badqiu email:badqiu(a)gmail.com
     * @version 1.0
     * @since 1.0
     */@Controller
    @RequestMapping("/userinfo")
    public class UserInfoController extends BaseSpringController<UserInfo,java.lang.Long>{
    private final String LIST_ACTION = "redirect:/userinfo";
    /** 列表 */
    @RequestMapping(value="/test")
    public ModelAndView test(HttpServletRequest request,
    HttpServletResponse response, Info userInfos,UserInfo userInfo) {

    this.reqMap.put("message", "我成功了userinfo");

     
    //return new ModelAndView("/userinfo/index", "userInfo", "我成功了userinfo");
    return this.toModelAndView("/userinfo/index", request);
    }

    /** 列表 */
    @Override
    public ModelAndView index(HttpServletRequest request,
    HttpServletResponse response, UserInfo userInfo) {

    this.reqMap.put("message", "我成功了userinfo");
    //this.reqMap.put("hahaha", this.getMessageSourceAccessor().getMessage("label.head.title.mydemo"));
    this.reqMap.put("hahaha",this.getMessageResByKey("label.head.title.mydemoccc"));
    //return new ModelAndView("/userinfo/index", "userInfo", "我成功了userinfo");

    return this.toModelAndView("/userinfo/index", request);
    } /** 进入新增 */
    @Override
    public ModelAndView _new(HttpServletRequest request,
    HttpServletResponse response, UserInfo userInfo) throws Exception {
    return new ModelAndView("/userinfo/new", "userInfo", userInfo);
    }
    /** 编辑 */
    @Override
    public ModelAndView edit(@PathVariable Long id) throws Exception {
    return new ModelAndView("/userinfo/edit", "userInfo", id);
    }

    /** 保存新增 */
    @Override
    public ModelAndView create(HttpServletRequest request,HttpServletResponse response,UserInfo model) throws Exception {
    return new ModelAndView(LIST_ACTION, "userInfo", model);
    }

    /** 保存更新 */
    @Override
    public ModelAndView update(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception {
    return new ModelAndView(LIST_ACTION, "userInfo", id);
    }

    /** 删除 */
    @Override
    public ModelAndView delete(@PathVariable Long id) {
    return new ModelAndView(LIST_ACTION, "userInfo", id);
    }}
      

  11.   

    新学SpringMVC搜索到这里来看看。