下面的是可用 的配置,其实关键部分就是不要导错包,freemarker的版本至少2.3.15以上
还有就是
<property name="suffix" value="" />
这个配置,在freemarker和jsp的配置那里各有一个,这里的value一旦设置就有可能出现404错误,你检查你的地址会发现页面还是.jsp结尾的,去掉这个2个地方的value就可以找到页面了,如果在jsp和freemarker各有一个相同的页面。那么:
return "user/findUserAll.ftl" //根据视图解析器的配置,这里会根据后缀来找页面,所以必须要写后缀。多视图配置的时候在配置那不能处理写suffix这个属性
如上,返回的时候写上后缀,就会自动去往你指定的页面,而且这个后缀不能省
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!--这是springMVC的配置==========================================================================================================-->
<!--启动注解,激活@Controller模式 注册服务,如验证框架、全局类型转换器-->
<mvc:annotation-driven/>
<!--开启扫描-->
<context:component-scan base-package="com.shadow" >
<!--制定扫描包规则,只扫描使用@Controller注解的java类,防止父子容器扫描冲突-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!--JSP视图解析器 配置视图解析器 prefix和suffix:查找视图页面的前缀和后缀(前缀[逻辑视图名]后缀),
比如传进来的逻辑视图名为WEB-INF/jsp/hello,则该该jsp视图页面应该存放在“WEB-INF/jsp/hello.jsp”;总结:自动为我们添加这个后面和前缀,不需要我们自己去添加返回的一些个页面后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver ">
<!--如果使用的是UrlBasedViewResolver这种方式,这个就不能省,如果用的InternalResourceViewResolver方式就可以省-->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<!-- 前缀,即视图所在的路径 ,放在web-inf下面是为了防止客户端直接通过jsp地址访问jsp页面,这样就不走springmvc了-->
<property name="prefix" value="/WEB-INF/views/" />
<!-- 后缀 视图的扩展名。可为空,方便实现自已的依据扩展名来选择视图解释类的逻辑-->
<!--.jsp在多视图的时候,这个不能配置,否则会报404错误。spring后自动帮你找到你要的视图(即你的页面)但这么配后要这么写return "user/findUserAll.jsp";根据后缀去找页面-->
<property name="suffix" value="" />
<!--查找顺序 0是第一个,1是第二个。在JSP和Freemarker的配置项中都有一个order property,上面例子是把freemarker的order设置为0,jsp为1。
意思是找view时,先找ftl文件,再找jsp文件做为视图-->
<property name="order" value="1"/>
</bean>
<!-- 对静态资源文件的访问,不让springMVC拦截,对客户端请求的静态资源如图片、JS文件等的请求交由默认的servlet进行处理
如何你的DispatcherServlet拦截"*.do"这样的有后缀的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截"/",为了实现REST风格,拦截了所有的请求,那么同时
对*.js,*.jpg等静态文件的访问也就被拦截了。第一种则是在spring3.0.4以后版本提供了mvc:resources也可解决该问题 ,第二种则是在web.xml中配置servlet-mapping-->
<!--<mvc:resources mapping="/js/**" location="/js/"/> -->
<!--避免ie执行ajax的时候,返回json出现下载文件-->
<bean id="MappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<!--配置文件上传,注意要引入相关的jar才行 multipartResolver这个id不能乱改-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--默认编码-->
<property name="defaultEncoding" value="UTF-8" />
<!-- 文件大小最大值 10M-->
<property name="maxUploadSize" value="10485760" />
<!-- 内存中的最大值 -->
<property name="maxInMemorySize" value="40960" />
</bean>
<!--springMVC的拦截器-->
<!--<mvc:interceptors>-->
<!--<mvc:interceptor>-->
<!--<!–要拦截的路径–>-->
<!--<mvc:mapping path="/**"/>-->
<!--<!–拦截器地址–>-->
<!--<bean class="com.shadow.util.BasePathInterceptor"></bean>-->
<!--</mvc:interceptor>-->
<!--</mvc:interceptors>-->
<!--freeMarker配置#####################################################-->
<!-- 配置freeMarker视图解析器 -->
<bean id="viewResolverFtl" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver" >
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
<!--此处需要声明为utf-8编码,否则即使页面是utf-8编码,中文还是不能正常显示-->
<property name="contentType" value="text/html; charset=UTF-8"/>
<!--默认值false,设置是否所有的request属性在与模板进行合并之前添加到model中。(可以理解为request范围内包含的所有对象,而不是一个真正的Request对象。-->
<property name="exposeRequestAttributes" value="true" />
<!--查找对应下所有以ftl结尾的文件-->
<property name="viewNames" value="*.ftl" />
<!--exposeSessionAttributes:默认值false,设置是否所有的session属性在与模板进行合并之前添加到model中-->
<property name="exposeSessionAttributes" value="true" />
<!--设置是否通过spring的宏库暴露一个RequestContext(名为springBindRequestContext)供外部使用,默认值为false。它暴露了处理表单和验证错误信息的宏操作-->
<property name="exposeSpringMacroHelpers" value="true"/>
<!--该配置是freemarker获取路径的关键配置,如果配置了这个,在ftl页面,就可以<#assign base=request.contextPath />得到请求的绝对路径,调用
时${base}/static/bootstra即可,但问题是用域名直接访问系统的时候就可能出现bug,所以不推荐该方式获取路径,建议使用spring拦截器处理-->
<property name="requestContextAttribute" value="request" />
<property name="cache" value="true"/>
<!--.ftl 在多视图的时候,这个不能配置,否则会报404错误。spring后自动帮你找到你要的视图(即你的页面)这么配后要这么写,return "user/findUserAll.ftl";根据后缀找页面-->
<property name="suffix" value="" />
<!--查找顺序 0是第一个,1是第二个。在JSP和Freemarker的配置项中都有一个order property,上面例子是把freemarker的order设置为0,jsp为1。
意思是找view时,先找ftl文件,再找jsp文件做为视图-->
<property name="order" value="0" />
</bean>
<!--freemarker需要的一个bean-->
<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape" />
<!-- 设置freeMarker的配置文件路径,如果使用该设置,在下面直接引用配置文件即可,否则可以不用这种方式 -->
<!--<bean id="freemarkerConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean">-->
<!--<!–指定配置文件路径–>-->
<!--<property name="location" value="classpath:freemarker.properties"/>-->
<!--</bean>-->
<!-- 配置freeMarker的模板路径 -->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<!--ftl文件的路径-->
<property name="templateLoaderPath" value="/WEB-INF/ftl/" />
<property name="freemarkerVariables">
<map>
<entry key="xml_escape" value-ref="fmXmlEscape" />
</map>
</property>
<property name="defaultEncoding" value="UTF-8" />
<!--设置freemarker的一些配置,也可以引用外部文件来设置,下面的直接配置也是可以的,也可外部配置,如下面-->
<property name="freemarkerSettings" >
<props>
<!--刷新模板的周期,单位为秒-->
<prop key="template_update_delay">0</prop>
<!--本地化设置-->
<prop key="locale">zh_CN</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="number_format">#.##</prop>
<!--此属性可以防止模板解析空值时的错误-->
<prop key="classic_compatible">true</prop>
</props>
</property>
<!--<property name="freemarkerSettings" ref="freemarkerConfiguration" /><!–引入外部的配置文件,如果用上面这种就不需要引入配置文件–>-->
</bean>
<!--解决freemarker的全局路径,对该类继承后覆写-->
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<!-- 自定义FreeMarkerView,用来定义项目的全局路径 -->
<property name="viewClass" value="com.shadow.util.MyFreeMarkerView"/>
</bean>
</beans>