文档章节

Spring MVC实现一个控制器写多个方法

lgscofield
 lgscofield
发布于 2015/06/26 13:53
字数 1646
阅读 104
收藏 0
点赞 0
评论 0

Spring MVC的API:

DispatcherServlet:         整个Spring MVC的前端控制器,由它来接管来自客户端的请求

HandlerMapping:           DispatcherServlet会通过它来处理客户端请求到各个(Controller)处理器的映射

HandlerAdapter:            HandlerMapping会根据它来调用Controller里需要被执行的方法

HandlerExceptionResolver:    spring mvc处理流程中,如果有异常抛出,会交给它来进行异常处理

ViewResolver:              HandlerAdapter会把Controller中调用返回值最终包装成ModelAndView,ViewResolver会检查其中的view,如果view是一个字符串,它就负责处理这个字符串并返回一个真正的View,如果view是一个真正的View则不会交给它处理,为什么view即可以是字符串又会是View呢下面会进行解释

View:                         对应MVC 中的V, 此接口只有一个方法 render,用于视图展现

ModelAndView             对于解决上面介绍ViewResoler或者下面图片的疑惑,这个类中的view这个属性是 Object 类型的,它可以是一个视图名也可以是一个实际的View,这点我们观察其源码可以很清楚的看出来

Spring MVC流程:

1.通过DispatcherServlet拦截用户请求

2.DispatcherServlet从HandlerMapping映射中获取用户请求是到哪个Controller,并把结果返回到DispatcherServlet中

3.请求到达Controller后,执行相关业务,返回ModelAndView到DispatcherServlet中

4.根据ModelAndView从ViewResolver中找到需要显示的View,并返回到DispatcherServlet中

5.DispatcherServlet把View响应到用户端

Spring MVC的简单实现:

web.xml的相关配置


 
  1. <servlet>  
  2.     <servlet-name>springServlet</servlet-name>  
  3.     <!-- Spring MVC的核心控制器(前端控制器)拦截用户的请求 -->  
  4.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  5.     <!-- 开启服务时初始化,创建相应的Bean -->  
  6.     <init-param>  
  7.         <param-name>contextConfigLocation</param-name>  
  8.         <param-value>classpath:applicationContext.xml</param-value>  
  9.     </init-param>  
  10. </servlet>  
  11. <servlet-mapping>  
  12.     <servlet-name>springServlet</servlet-name>  
  13.     <url-pattern>*.do</url-pattern>  
  14. </servlet-mapping>  

创建自己的Controller(后端控制器),继承AbstractController并实现handleRequestInternal方法


 
  1. public class LoginAction extends AbstractController {  
  2.     @Override  
  3.     protected ModelAndView handleRequestInternal(HttpServletRequest request,  
  4.             HttpServletResponse response) throws Exception {  
  5.         // TODO Auto-generated method stub  
  6.         return null;  
  7.     }  
  8. }  

applicationContext.xml的相关配置


 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans  
  3.     xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xmlns:p="http://www.springframework.org/schema/p"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  
  7. <!-- 配置controller的业务Bean -->  
  8. <bean id="loginAction" class="com.web.action.LoginAction">  
  9. </bean>  
  10. <!-- 配置url与controller的映射关系 -->  
  11. <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  12.     <property name="mappings">  
  13.         <props>  
  14.             <prop key="/login.do">loginAction</prop>  
  15.         </props>  
  16.     </property>  
  17. </bean>  
  18. <!-- 配置视图View(已jsp作为视图) -->  
  19. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  20.     <property name="prefix" value="/"/>  
  21.     <property name="suffix" value=".jsp"/>  
  22. </bean>  
  23. </beans>  

现在如果用户发送/login.do的请求,请求就会到达LoginAction中进行处理,以及响应客户端

用以上的相关配置有一点不好的地方就是,用户的每个请求都需要用一个Controller来处理,要怎么样才能实现一个Controller中写多个处理方法接受用户不同的请求呢?有以下两种方式:

方式一:继承
Controller不再继承AbstractController类,现在继承MultiActionController类来实现多方法,处理方式如下

web.xml的相关配置不变,需要重写LoginAction这个Controller类


 
  1. package com.web.action;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.   
  6. import org.springframework.web.servlet.ModelAndView;  
  7. import org.springframework.web.servlet.mvc.multiaction.MultiActionController;  
  8.   
  9. /** 
  10.  * 继承AbstractController只能实现一个动作对应一个方法 
  11.  * 继承MultiActionController实现一个controller中写多个方法 
  12.  * @author Administrator 
  13.  * 
  14.  */  
  15. public class LoginAction extends MultiActionController {  
  16.       
  17.     private String fromView;  
  18.     private String toView;  
  19.       
  20.     /** 
  21.      *  
  22.      * 处理方法的访问修饰符只能为public 
  23.      * @param request 
  24.      * @param response 
  25.      * @return  
  26.      * @throws Exception 
  27.      */  
  28.     public ModelAndView getList(HttpServletRequest request, HttpServletResponse response) throws Exception {  
  29.         request.setAttribute("list""执行getList方法成功");  
  30.         return new ModelAndView(toView);  
  31.     }  
  32.       
  33.     public ModelAndView doLogin(HttpServletRequest request,  
  34.             HttpServletResponse response) throws Exception {  
  35.         //获取表单数据  
  36.         String username = request.getParameter("username");  
  37.         String password = request.getParameter("password");  
  38.         //调用业务逻辑方法  
  39.         String result = login(username, password);  
  40.         if("success".equals(result)){  
  41.             request.setAttribute("result""成功");  
  42.             return new ModelAndView(toView);  
  43.         }else{  
  44.             request.setAttribute("result""失敗");  
  45.             return new ModelAndView(fromView);  
  46.         }  
  47.     }  
  48.       
  49.     private String login(String username, String password){  
  50.         if("123".equals(username) && "admin".equals(password)){  
  51.             return "success";  
  52.         }  
  53.         return "fail";  
  54.     }  
  55.   
  56.     public String getFromView() {  
  57.         return fromView;  
  58.     }  
  59.   
  60.     public void setFromView(String fromView) {  
  61.         this.fromView = fromView;  
  62.     }  
  63.   
  64.     public String getToView() {  
  65.         return toView;  
  66.     }  
  67.   
  68.     public void setToView(String toView) {  
  69.         this.toView = toView;  
  70.     }  
  71. }  

applicationContext.xml的相关配置


 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans  
  3.     xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xmlns:p="http://www.springframework.org/schema/p"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  
  7. <!-- 配置methodNameResolver -->  
  8. <bean id="ParameterMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">  
  9.     <property name="paramName" value="action"/>  
  10. </bean>  
  11. <!-- 配置controller的业务Bean -->  
  12. <bean id="loginAction" class="com.web.action.LoginAction">  
  13.     <!-- controller继承MultiActionController并添加这个配置,使controller能写多个方法 -->  
  14.     <property name="methodNameResolver" ref="ParameterMethodNameResolver"/>  
  15.     <!-- 初始化属性 -->  
  16.     <property name="fromView" value="login"/>  
  17.     <property name="toView" value="index"/>  
  18. </bean>  
  19. <!-- 配置url与controller的映射关系 -->  
  20. <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  21.     <property name="mappings">  
  22.         <props>  
  23.             <prop key="/login.do">loginAction</prop>  
  24.         </props>  
  25.     </property>  
  26. </bean>  
  27.   
  28. <!-- 配置视图View(已jsp作为视图) -->  
  29. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  30.     <!-- 前缀 -->  
  31.     <property name="prefix" value="/"/>  
  32.     <!-- 后缀 -->  
  33.     <property name="suffix" value=".jsp"/>  
  34. </bean>  
  35. </beans>  

用户发送请求/login.do?action=doLogin或者/login.do?action=getList就会执行相应的处理方法了,这样就可以访问了

方式二:注解

web.xml的相关配置不变,需要重写LoginAction这个Controller类

业务类UserService:添加注解@Service


 
  1. package com.service;  
  2.   
  3. import org.springframework.stereotype.Service;  
  4.   
  5. /** 
  6.  * 业务类(M) 
  7.  * @author Administrator 
  8.  * 
  9.  */  
  10. @Service  
  11. public class UserService {  
  12.       
  13.     public String login(String username, String password){  
  14.         if("123".equals(username) && "admin".equals(password)){  
  15.             return "登录成功";  
  16.         }  
  17.         return "登录失败";  
  18.     }  
  19. }  

Controller类LoginAction:添加注解@Controller


 
  1. package com.web.action;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. import javax.servlet.http.HttpServletRequest;  
  7.   
  8. import org.springframework.beans.factory.annotation.Autowired;  
  9. import org.springframework.stereotype.Controller;  
  10. import org.springframework.web.bind.annotation.RequestMapping;  
  11. import org.springframework.web.servlet.ModelAndView;  
  12.   
  13. import com.service.UserService;  
  14.   
  15. @Controller  
  16. @RequestMapping("/login")  
  17. public class LoginAction {  
  18.       
  19.     @Autowired  
  20.     private UserService userService;  
  21.       
  22.     public void setUserService(UserService userService) {  
  23.         this.userService = userService;  
  24.     }  
  25.       
  26.     /** 
  27.      * @param username 
  28.      * @param password 
  29.      * @return 
  30.      * 返回ModelAndView,并使用map传递数据到页面 
  31.      */  
  32.     @RequestMapping("/doLogin.do")  
  33.     public ModelAndView doLogin(String username, String password) {  
  34.         String result = userService.login(username, password);  
  35.         Map<String, Object> map = new HashMap<String, Object>();  
  36.         map.put("result", result);  
  37.         if("登录成功".equals(result)){  
  38.             return new ModelAndView("index",map);  
  39.         }  
  40.         return new ModelAndView("login",map);  
  41.     }  
  42.       
  43.     /** 
  44.      * @param request 
  45.      * @return 
  46.      * 返回String,使用request传递数据到页面 
  47.      */  
  48.     @RequestMapping("/getList.do")  
  49.     public String getList(HttpServletRequest request){  
  50.         request.setAttribute("result""执行GetList方法成功");  
  51.         return "/index";  
  52.     }  
  53.   
  54. }  

applicationContext.xml的相关配置:


 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans  
  3.     xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xmlns:p="http://www.springframework.org/schema/p"  
  6.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  7.     xmlns:context="http://www.springframework.org/schema/context"  
  8.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  9.     http://www.springframework.org/schema/mvc   
  10.     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
  11.     http://www.springframework.org/schema/context   
  12.     http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  13.     ">  
  14. <!-- 自动扫描路径下的所有文件,并根据注解完成注入的工作 -->    
  15. <context:component-scan base-package="com.service,com.web.action"/>  
  16.   
  17. <!-- 默认的注解映射的支持 -->   
  18. <mvc:annotation-driven/>  
  19.   
  20. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />  
  21. <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->   
  22. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />  
  23.   
  24.    
  25. <!-- 使spring支持注解 -->  
  26. <context:annotation-config/>  
  27.   
  28. <!-- 配置视图View(已jsp作为视图) -->  
  29. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  30.     <property name="prefix" value="/" />  
  31.     <property name="suffix" value=".jsp" />  
  32. </bean>  
  33.   
  34.   
  35. </beans>  

用户请求:

<a href="login/getList.do">点击获取List</a>

<form action="login/doLogin.do" method="post"></form>,访问成功。

但是存在以下疑点:

在applicationContext.xml配置中,我删除以下配置仍可正常运行...

<!-- 默认的注解映射的支持 -->   
  1. <mvc:annotation-driven/>  
  2.   
  3. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />  
  4. <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->   
  5. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />  
  6.   
  7.    
  8. <!-- 使spring支持注解 -->  
  9. <context:annotation-config/>  

本文转载自:http://lgscofield.iteye.com/blog/1915999

共有 人打赏支持
lgscofield

lgscofield

粉丝 20
博文 140
码字总数 63036
作品 0
南京
架构师
使用springMVC的详细步骤

使用springMVC的详细步骤   使用springMVC也可以代替struts2,当然只是代替业务分发的功能,struts2的一些其他功能它是没有的,不然要struts2有什么用。   下面我用springMVC代替struts2...

风中帆
2015/07/11
0
3
Spring MVC原理及配置详解

【spring】Spring MVC原理及配置 1.Spring MVC概述: Spring MVC是Spring提供的一个强大而灵活的web框架。借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简...

qq58edf1d989a2d
06/26
0
0
史上最简单的 Spring MVC 教程(三)

1 前言 在史上最简单的 Spring MVC 教程(二)中,咱们讲解了常见的处理器映射(handlerMapping),并给出了应用示例。在本篇博客中,咱们讲解常见的控制器(Controller),在这里有一点需要...

qq_35246620
2017/01/26
0
0
Spring MVC五大核心组件和配置

一,五大核心组件   1.DispatcherServlet  请求入口   2.HandlerMapping   请求派发,负责请求和控制器建立一一对应的关系   3.Controller      处理器   4.ModelAndView  ...

零晨三点半
07/14
0
0
如果你想开发一个应用(1-8)

虽然现在进入了一年之中最冷的季节,但这篇博客却开始讲述春天的故事。 在TodoServlet这个类中,doGet和doPost重载了模板类HttpServlet类的对应方法,是一个典型的模板方法模式,这种当然是一...

双鱼座的牛
2017/12/06
0
0
SpringMVC知识梳理(一)

什么是SpringMVC SpringMVC其实就是spring框架的一个模块,SpringMVC和spring之间可以无缝整合,SpringMVC也是一个非常优秀的基于MVC的web框架,什么是MVC这里就不多说了,下面来了解一下spr...

iHuawen
2017/12/28
0
0
SpringMVC入门demo

为什么要学习SpringMVC呢? Spring框架号称是JavaEE应用的一站式解决方案,Spring本身有提供了一个设计优良的MVC框架,SpringMVC。由于Spring框架拥有极高的市场占有率,因此越来越多的Sprin...

武小猪
06/26
0
0
深入理解Spring MVC 思想

一、前言 二、spring mvc 核心类与接口 三、spring mvc 核心流程图 四、spring mvc DispatcherServlet说明 五、spring mvc 父子上下文的说明 六、springMVC-mvc.xml 配置文件片段讲解 七、s...

qq58edf1d989a2d
06/26
0
0
spring mvc 框架学习文档

以下是Spring3.0 MVC请求流程的生命周期: 客户端将请求发送到Web容器中的HTTP请求的形式。这个传入的请求被截获由前端控制器(DispatcherServlet的),然后它会试图找出相应的处理程序映射。...

浅夏
2014/03/12
0
0
springMVC笔记系列(23)——拦截器及其在乱码问题和登录问题的应用实现

拦截器的概念 A:“什么是拦截器?” B:“拦截器是通过统一拦截从客户端发往服务器的请求来完成功能的增强。” A:(一脸懵逼) B:“说得简单点,拦截器就是在客户端向服务器端发出请求的期间...

HappyBKs
2016/07/12
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

看看 LinkedList Java 9

终于迎来了 LinkedList 类,实现的接口就有点多了 Serializable, Cloneable, Iterable<E>, Collection<E>, Deque<E>, List<E>, Queue<E>。LinkedList是一个实现了List接口和Deque接口的双端链......

woshixin
11分钟前
0
0
算法 - 冒泡排序 C++

大家好,我是ChungZH。今天我给大家讲一下最基础的排序算法:冒泡排序(BubbleSort)。 冒泡排序算法的原理如下: 比较相邻的元素。如果第一个比第二个大(可以相反),就交换他们两个。 对每...

ChungZH
13分钟前
0
0
jquery ajax request payload和fromData请求方式

请求头的不同 fromData var data = { name : 'yiifaa'};// 提交数据$.ajax('app/', { method:'POST', // 将数据编码为表单模式 contentType:'application/x-ww...

lsy999
16分钟前
0
0
阿里P7架构师,带你点亮程序员蜕变之路

前言: Java是现阶段中国互联网公司中,覆盖度最广的研发语言。 掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地。 有不少朋友问,成为Java架...

Java大蜗牛
17分钟前
1
0
Ecstore 在没有后台管理界面(维护)的情况如何更新表的字段

window 系统: 切换到:app\base 目录下: C:\Users\qimh>d: D:\>cd D:\WWW\huaqh\app\base 执行:D:\WWW\huaqh\app\base>cmd update linux 系统: 1># cd /alidata/www.novoeshop.com/app/......

qimh
22分钟前
0
0
设计模式-策略模式

策略模式 解释 对工厂模式的再次封装,使用参数控制上下文信息(将工厂返回的实例赋值给context field) 不会返回bean实例,只是设置对应的条件 调用context的方法(调用field的方法) 用户只...

郭里奥
24分钟前
0
0
python使用有序字典

python自带的collections包中有很多有用的数据结构可供使用,其中有个叫OrderedDict类,它可以在使用的时候记录元素插入顺序,在遍历使用的时候就可以按照原顺序遍历。 a = {"a":1,"b"...

芝麻糖人
54分钟前
0
0
RestTemplate HttpMessageConverter

RestTemplate 微信接口 text/plain HttpMessageConverter

微小宝
54分钟前
0
0
mysql视图/存储过程/函数/事件/触发器

--语法参考:https://dev.mysql.com/doc/ (当前用的是5.6) https://dev.mysql.com/doc/refman/5.6/en/sql-syntax-data-manipulation.html --视图 CREATE VIEW test.v AS SELECT * FROM t;......

坦途abc
56分钟前
0
0
MySQL参数优化案例

环境介绍 硬件配置 cpu核心数 内存大小 磁盘空间 16核 256G 3T 软件环境 操作系统版本 mysql版本 表数目 单表行数 centos-7.4 mysql-5.7.22 128张表 2kw行 优化层级与指导思想 优化层级 MySQ...

小致dad
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部