准备环境:(此例所有Spring版本:spring-framework-3.2.6)
1、将spring-framework-3.2.6中的lib全部导入工程
2、将Apache的Common-logging 导入工程
3、将JSTL标签库包导入工程(可选,这里只是为了方便读数据而已)
如下图所示:
Spring MVC XML 配置:1、在 Web.xml 中 配置启动SpringMVC的Servlet映射。
1 <!-- Spring MVC DispatcherServlet Init -->
2 <servlet>
3 <servlet-name>springMVC</servlet-name>
4 <servlet-class>
5 org.springframework.web.servlet.DispatcherServlet
6 </servlet-class>
7 <init-param>
8 <param-name>contextConfigLocation</param-name>
9 <param-value>
10 /WEB-INF/ApplicationContext-Controller.xml <!-- SpringMVC的配置文件,文件名自定义 -->
11 </param-value>
12 </init-param>
13 <load-on-startup>1</load-on-startup>
14 </servlet>
15 <servlet-mapping>
16 <servlet-name>springMVC</servlet-name>
17 <url-pattern>/</url-pattern>
18 </servlet-mapping>
2、在
/WEB-INF/ 中创建 ApplicationContext-Controller.xml , 配置文件放在 /WEB-INF/下是约定俗成的。
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans.xsd
7 http://www.springframework.org/schema/context
8 http://www.springframework.org/schema/context/spring-context.xsd">
9
10 </beans>
3、在src下创建 Contorllor 类 (Action)实现
Controller 接口 。向ModelAndView的构造传入页面名称完成 转发 操作 1 package com.spring.mvc.web;
2
3 import javax.servlet.http.HttpServletRequest;
4 import javax.servlet.http.HttpServletResponse;
5 import org.springframework.web.servlet.ModelAndView;
6 import org.springframework.web.servlet.mvc.Controller;
7
8 public class UserController implements Controller{
9
10 public ModelAndView handleRequest(HttpServletRequest req,
11 HttpServletResponse res) throws Exception {
12 System.out.println("HelloWorld");
13 return new ModelAndView("index.jsp");
14 }
15 }
4、在
ApplicationContext-Controller.xml 中注册
UserController 类
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans.xsd
7 http://www.springframework.org/schema/context
8 http://www.springframework.org/schema/context/spring-context.xsd">
9
10 <bean id="/user" class="com.spring.mvc.web.UserController"></bean>
11
12 </beans>
HelloWorld完成,运行效果如下图:
-----------------------------------------------------------------------------------
接着对优化,SpringMVC 提供配置 ViewResolver 用来管理视图层
下面在
ApplicationContext-Controller.xml 配置 ViewResolver 对页面转发的控制
首先在目录结构/WEB-INF/jsp/中 添加 user.jsp 页面,用于转发页面,页面内容随便。
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans.xsd
7 http://www.springframework.org/schema/context
8 http://www.springframework.org/schema/context/spring-context.xsd">
9
10 <bean id="/user" class="com.spring.mvc.web.UserController"></bean>
11
12 <!-- 页面View层基本信息设定 -->
13 <bean id="viewResolver"
14 class="org.springframework.web.servlet.view.InternalResourceViewResolver">
15 <property name="prefix" value="/WEB-INF/jsp" /> <!-- 前缀 -->
16 <property name="suffix" value=".jsp" /> <!-- 后缀 -->
17 </bean>
18 </beans>
对应更改 com.spring.mvc.web.UserController :
1 package com.spring.mvc.web;
2
3 import javax.servlet.http.HttpServletRequest;
4 import javax.servlet.http.HttpServletResponse;
5 import org.springframework.web.servlet.ModelAndView;
6 import org.springframework.web.servlet.mvc.Controller;
7
8 public class UserController implements Controller{
9 // 因为配置了 ViewResolver 所以转发会自动加上 前缀 + user + 后缀 既: /WEB-INF/jsp/user.jsp
10 public ModelAndView handleRequest(HttpServletRequest req,
11 HttpServletResponse res) throws Exception {
12 return new ModelAndView("user");
13 }
14 }
看运行效果:
接下来把 URL 请求的控制 也交给Spring处理:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans.xsd
7 http://www.springframework.org/schema/context
8 http://www.springframework.org/schema/context/spring-context.xsd">
9
10 <!-- 这前 id='/user',现在给bean起个别名,交给Spring的urlMapping来管理此ControllerAction -->
11 <bean id="userController" class="com.spring.mvc.web.UserController"></bean>
12
13 <!-- 页面View层基本信息设定 -->
14 <bean id="viewResolver"
15 class="org.springframework.web.servlet.view.InternalResourceViewResolver">
16 <property name="prefix" value="/WEB-INF/jsp/" />
17 <property name="suffix" value=".jsp" />
18 </bean>
19
20 <!-- servlet映射列表,所有控制层Controller的servlet在这里定义 -->
21 <bean id="urlMapping"
22 class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
23 <property name="mappings">
24 <props>
25 <!-- key 就是访问路径, userController 就是 ControllerAction 类的别名-->
26 <prop key="/user">userController</prop>
27 </props>
28 </property>
29 </bean>
30 </beans>
配置到此,访问效果与前面没有区别,只是把URL交给Spring的UrlMapping管理,并介绍userController给UrlMapping认识。
很多时候,ControllerAction 需要处理不同的方法,显然一个Controller处理一种逻辑不太现实,Spring提供了解决此类问题的配置:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans.xsd
7 http://www.springframework.org/schema/context
8 http://www.springframework.org/schema/context/spring-context.xsd">
9
10 <bean id="userController" class="com.spring.mvc.web.UserController">
11 <!-- Controller Bean 配置property的methodNameResolver属性 -->
12 <!-- ref bean 中就是把 同一个Controller多个方法的解析器 注入给 Controller-->
13 <property name="methodNameResolver">
14 <ref bean="paraMethodResolver"/>
15 </property>
16 </bean>
17
18 <bean id="viewResolver"
19 class="org.springframework.web.servlet.view.InternalResourceViewResolver">
20 <property name="prefix" value="/WEB-INF/jsp/" />
21 <property name="suffix" value=".jsp" />
22 </bean>
23
24 <bean id="urlMapping"
25 class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
26 <property name="mappings">
27 <props>
28 <prop key="/user">userController</prop>
29 </props>
30 </property>
31 </bean>
32
33 <!-- Controller方法调用规则定义 -->
34 <bean id="paraMethodResolver"
35 class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
36 <!-- value="method" 的作用好比 http://localhost/SpringMVC/user?method=add -->
37 <property name="paramName" value="method" />
38 </bean>
39 </beans>
更改Controller类
1 package com.spring.mvc.web;
2
3 import javax.servlet.http.HttpServletRequest;
4 import javax.servlet.http.HttpServletResponse;
5 import org.springframework.web.servlet.ModelAndView;
6 import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
7
8 // extends MultiActionController 类
9 public class UserController extends MultiActionController {
10
11 public ModelAndView add(HttpServletRequest req,
12 HttpServletResponse res) throws Exception {
13 return new ModelAndView("user");
14 }
15
16 // 返回类型可以是 ModelAndView , String , List , Map , Set , ModelMap , Object , viod 等等
17 public String list(HttpServletRequest req,
18 HttpServletResponse res) throws Exception {
19 return "user";
20 }
21 }
效果如下图:
SpringMVC Annotation 配置:前面 SpringMVC XML 的配置方法,只保留 ViewResolver的配置,其他全部不用;Spring提供的Annotation的两处配置即可代替大部分配置代码:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans.xsd
7 http://www.springframework.org/schema/context
8 http://www.springframework.org/schema/context/spring-context.xsd">
9
10 <!-- 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
11 <context:component-scan base-package="com.spring.mvc.web"/>
12 <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
13 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
14
15 <bean id="viewResolver"
16 class="org.springframework.web.servlet.view.InternalResourceViewResolver">
17 <property name="prefix" value="/WEB-INF/jsp/" />
18 <property name="suffix" value=".jsp" />
19 </bean>
20
21 <!-- SpringMVC XML 的配置方法,只保留 ViewResolver 的配置,其他全部不用-->
22 <!-- <bean id="userController" class="com.spring.mvc.web.UserController">
23 <property name="methodNameResolver">
24 <ref bean="paraMethodResolver"/>
25 </property>
26 </bean>
27 <bean id="urlMapping"
28 class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
29 <property name="mappings">
30 <props>
31 <prop key="/user">userController</prop>
32 </props>
33 </property>
34 </bean>
35 <bean id="paraMethodResolver"
36 class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
37 <property name="paramName" value="method" />
38 </bean> -->
39 </beans>
Annotation Controller 类的实现:
1 package com.spring.mvc.web;
2
3 import javax.servlet.http.HttpServletRequest;
4 import javax.servlet.http.HttpServletResponse;
5
6 import org.springframework.stereotype.Controller;
7 import org.springframework.web.bind.annotation.RequestMapping;
8 import org.springframework.web.servlet.ModelAndView;
9
10 /*
11 * @Controller 声明此类为Controller类交给Spring管理
12 * @RequestMapping 请求路径
13 */
14 @Controller
15 @RequestMapping("/user")
16 public class UserController {
17
18 /*
19 * @RequestMapping(params="method=add")
20 * 此方法的对应访问方式
21 * http://localhost:8080/SpringMVC/user?method=add
22 */
23 @RequestMapping(params="method=add")
24 public ModelAndView add(HttpServletRequest req,
25 HttpServletResponse res) throws Exception {
26 return new ModelAndView("user");
27 }
28
29 @RequestMapping(params="method=list")
30 public String list(String uName , HttpServletRequest req,
31 HttpServletResponse res) throws Exception {
32 /* 默认为转发,重定向:返回这个串:"redirect:http://www.google.com.hk/"
33 * 1、Controller 就是从HttpServlet 继承而来,所以可以把它当Servlet用
34 * 2、需要什么对象,直接在方法的参数中写,uName是前台传过来的。
35 * 3、ModelAndView 底层的View是Object Model是Map,默认放在Request中可通过el表达式拿值
36 */
37 req.getSession() ;
38 return "user";
39 }
40 }
效果如下图:
添加 Spring 3.0 的 新 Annotation 注解:
1:XML 文件的 schema 更新添加 mvc 标签 , “标红” 1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:mvc="http://www.springframework.org/schema/mvc"
5 xmlns:context="http://www.springframework.org/schema/context"
6 xsi:schemaLocation="http://www.springframework.org/schema/beans
7 http://www.springframework.org/schema/beans/spring-beans.xsd
8 http://www.springframework.org/schema/mvc
9 http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
10 http://www.springframework.org/schema/context
11 http://www.springframework.org/schema/context/spring-context.xsd">
12
13 <!-- 支持spring3.0新的mvc注解 -->
14 <mvc:annotation-driven />
15
16 <!-- 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
17 <context:component-scan base-package="com.spring.mvc.web" />
18
19 <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
20 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
21
22 <bean id="viewResolver"
23 class="org.springframework.web.servlet.view.InternalResourceViewResolver">
24 <property name="prefix" value="/WEB-INF/jsp/" />
25 <property name="suffix" value=".jsp" />
26 </bean>
27 </beans>
配置Spring Interceptor 拦截器:
添加自定义拦截器类:com.spring.mvc.interceptors.RuleInterceptor
1 package com.spring.mvc.interceptors;
2
3 import javax.servlet.http.HttpServletRequest;
4 import javax.servlet.http.HttpServletResponse;
5 import org.springframework.web.servlet.HandlerInterceptor;
6 import org.springframework.web.servlet.ModelAndView;
7
8 public class RuleInterceptor implements HandlerInterceptor {
9
10 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
11 System.out.println("最后执行!!!一般用于释放资源!!");
12
13 }
14
15 public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
16 System.out.println("Action执行之后,生成视图之前执行!!");
17 }
18
19 public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
20 System.out.println("action之前执行!!!");
21 return true; //继续执行action
22 }
23 }
配置文件注册:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:mvc="http://www.springframework.org/schema/mvc"
5 xmlns:context="http://www.springframework.org/schema/context"
6 xsi:schemaLocation="http://www.springframework.org/schema/beans
7 http://www.springframework.org/schema/beans/spring-beans.xsd
8 http://www.springframework.org/schema/mvc
9 http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
10 http://www.springframework.org/schema/context
11 http://www.springframework.org/schema/context/spring-context.xsd">
12
13 <mvc:interceptors>
14 <bean class="com.spring.mvc.interceptors.RuleInterceptor"></bean> <!-- 拦截所有springmvc的url! -->
15 <mvc:interceptor>
16 <mvc:mapping path="/user" />
17 <!--<mvc:mapping path="/test/*" />-->
18 <bean class="com.spring.mvc.interceptors.RuleInterceptor"></bean>
19 </mvc:interceptor>
20 </mvc:interceptors>
21
22 <!-- 支持spring3.0新的mvc注解 -->
23 <mvc:annotation-driven />
24
25 <!-- 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
26 <context:component-scan base-package="com.spring.mvc.web" />
27
28 <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
29 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
30
31 <bean id="viewResolver"
32 class="org.springframework.web.servlet.view.InternalResourceViewResolver">
33 <property name="prefix" value="/WEB-INF/jsp/" />
34 <property name="suffix" value=".jsp" />
35 </bean>
36 </beans>