最近开始学习Spring3 MVC Restful,视图采用了jsp和freemarker,分别放在/WEB-INF/JSP和/WEB-INF/FTL文件夹下。使用spring MVC时之返回视图的字符串名称,怎么让它知道这个名称是对应jsp文件夹下还是ftl文件夹下的呢?
在Controller中进行转发时如何处理?
我用的是Spring3中的注解@Controller,然后在调用的方法中只返回字符串(如“success”),那么Spring3是如何确定是转到"/WEB-INF/JSP/success.jsp",还是“/WEB-INF/FTL/success.ftl”呢?
如果可以确定,那又是如何配置呢?
使用视图链 首先会去找 user/student.ftl 如果找不到就会去找 user/student.jsp
1.首先在web.xml,配置多个Dispatcher,不同视图当然转发不一样!
web.xml
Java代码
1. <servlet-name>fm</servlet-name>
2. <servlet-class>
3. org.springframework.web.servlet.DispatcherServlet
4. </servlet-class>
5. <load-on-startup>1</load-on-startup>
6. </servlet>
7. <servlet-mapping>
8. <servlet-name>jstl</servlet-name>
9. <url-pattern>/*.do</url-pattern>
10. </servlet-mapping>
11. <servlet-mapping>
12. <servlet-name>fm</servlet-name>
13. <url-pattern>/*.fm</url-pattern>
14. </servlet-mapping>
15. <servlet>
<servlet-name>fm</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jstl</servlet-name>
<url-pattern>/*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>fm</servlet-name>
<url-pattern>/*.fm</url-pattern>
</servlet-mapping>
<servlet>
2.然后再配置*-servlet文件
jstl-servlet.xml
Java代码
1. <?xml version="1.0" encoding="UTF-8"?>
2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
3. <beans>
4. <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
5. <property name="mappings">
6. <props>
7. <prop key="/hello.do">showCon</prop>
8. </props>
9. </property>
10. </bean>
11. <bean name="showCon" class="test.mvc.web.ShowController"/>
12. <bean id="viewResolver"
13. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
14. <property name="prefix"><value>/WEB-INF/template/jsp/</value></property>
15. <property name="suffix"><value>.jsp</value></property>
16. <property name="viewClass">
17. <value>org.springframework.web.servlet.view.JstlView</value>
18. </property>
19. </bean>
20. </beans>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.do">showCon</prop>
</props>
</property>
</bean>
<bean name="showCon" class="test.mvc.web.ShowController"/>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix"><value>/WEB-INF/template/jsp/</value></property>
<property name="suffix"><value>.jsp</value></property>
<property name="viewClass">
<value>org.springframework.web.servlet.view.JstlView</value>
</property>
</bean>
</beans>
fm-servlet.xml
Java代码
1. <?xml version="1.0" encoding="UTF-8"?>
2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
3. <beans>
4. <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
5. <property name="mappings">
6. <props>
7. <prop key="/hello.fm">showCon</prop>
8. </props>
9. </property>
10. </bean>
11. <bean name="showCon" class="test.mvc.web.ShowController"/>
12. <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
13. <property name="suffix"><value>.fm</value></property>
14. <property name="viewClass">
15. <value>org.springframework.web.servlet.view.freemarker.FreeMarkerView</value>
16. </property>
17. <property name="contentType"><value>text/html; charset=gb2312</value></property>
18. </bean>
19. </beans>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.fm">showCon</prop>
</props>
</property>
</bean>
<bean name="showCon" class="test.mvc.web.ShowController"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="suffix"><value>.fm</value></property>
<property name="viewClass">
<value>org.springframework.web.servlet.view.freemarker.FreeMarkerView</value>
</property>
<property name="contentType"><value>text/html; charset=gb2312</value></property>
</bean>
</beans>
两个视图都调用test.mvc.web.ShowController,所以即使全部换了视图层,也不影响到控制层的东西,这就是spring MVC强大之一!
在Controller中进行转发时如何处理?
我用的是Spring3中的注解@Controller,然后在调用的方法中只返回字符串(如“success”),那么Spring3是如何确定是转到"/WEB-INF/JSP/success.jsp",还是“/WEB-INF/FTL/success.ftl”呢?
如果可以确定,那又是如何配置呢?
<context:component-scan base-package="com.spring" />
<bean id="freemarkerViewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="order" value="1" />
<property name="prefix" value="/freemarker/" />
<property name="suffix" value=".ftl" />
<property name="contentType" value="text/html;charset=utf-8" />
<property name="viewClass">
<value>org.springframework.web.servlet.view.freemarker.FreeMarkerView</value>
</property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="order" value="2" />
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp"></property>
</bean>
<bean
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF" />
<property name="defaultEncoding" value="UTF-8" />
</bean>
@RequestMapping(value="/student")
protected ModelAndView freemaker() {
Student stu1=new Student();
stu1.setName("gaoxiang1");
stu1.setSex("male1");
Student stu2=new Student();
stu2.setName("gaoxiang2");
stu2.setSex("male2");
List a=new ArrayList();
a.add(stu1);
a.add(stu2);
return new ModelAndView("user/student","studentList",a);
}
使用视图链 首先会去找 user/student.ftl 如果找不到就会去找 user/student.jsp
1.首先在web.xml,配置多个Dispatcher,不同视图当然转发不一样!
web.xml
Java代码
1. <servlet-name>fm</servlet-name>
2. <servlet-class>
3. org.springframework.web.servlet.DispatcherServlet
4. </servlet-class>
5. <load-on-startup>1</load-on-startup>
6. </servlet>
7. <servlet-mapping>
8. <servlet-name>jstl</servlet-name>
9. <url-pattern>/*.do</url-pattern>
10. </servlet-mapping>
11. <servlet-mapping>
12. <servlet-name>fm</servlet-name>
13. <url-pattern>/*.fm</url-pattern>
14. </servlet-mapping>
15. <servlet>
<servlet-name>fm</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jstl</servlet-name>
<url-pattern>/*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>fm</servlet-name>
<url-pattern>/*.fm</url-pattern>
</servlet-mapping>
<servlet>
2.然后再配置*-servlet文件
jstl-servlet.xml
Java代码
1. <?xml version="1.0" encoding="UTF-8"?>
2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
3. <beans>
4. <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
5. <property name="mappings">
6. <props>
7. <prop key="/hello.do">showCon</prop>
8. </props>
9. </property>
10. </bean>
11. <bean name="showCon" class="test.mvc.web.ShowController"/>
12. <bean id="viewResolver"
13. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
14. <property name="prefix"><value>/WEB-INF/template/jsp/</value></property>
15. <property name="suffix"><value>.jsp</value></property>
16. <property name="viewClass">
17. <value>org.springframework.web.servlet.view.JstlView</value>
18. </property>
19. </bean>
20. </beans>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.do">showCon</prop>
</props>
</property>
</bean>
<bean name="showCon" class="test.mvc.web.ShowController"/>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix"><value>/WEB-INF/template/jsp/</value></property>
<property name="suffix"><value>.jsp</value></property>
<property name="viewClass">
<value>org.springframework.web.servlet.view.JstlView</value>
</property>
</bean>
</beans>
fm-servlet.xml
Java代码
1. <?xml version="1.0" encoding="UTF-8"?>
2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
3. <beans>
4. <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
5. <property name="mappings">
6. <props>
7. <prop key="/hello.fm">showCon</prop>
8. </props>
9. </property>
10. </bean>
11. <bean name="showCon" class="test.mvc.web.ShowController"/>
12. <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
13. <property name="suffix"><value>.fm</value></property>
14. <property name="viewClass">
15. <value>org.springframework.web.servlet.view.freemarker.FreeMarkerView</value>
16. </property>
17. <property name="contentType"><value>text/html; charset=gb2312</value></property>
18. </bean>
19. </beans>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.fm">showCon</prop>
</props>
</property>
</bean>
<bean name="showCon" class="test.mvc.web.ShowController"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="suffix"><value>.fm</value></property>
<property name="viewClass">
<value>org.springframework.web.servlet.view.freemarker.FreeMarkerView</value>
</property>
<property name="contentType"><value>text/html; charset=gb2312</value></property>
</bean>
</beans>
两个视图都调用test.mvc.web.ShowController,所以即使全部换了视图层,也不影响到控制层的东西,这就是spring MVC强大之一!