《SpringMVC从入门到放肆》六、SpringMVC开发Controller的方法总结

到目前为止我们已经大概学习了StringMVC的执行流程,以及详细的处理器映射器和处理器适配器的执行流程,并可以自己写一个配置方式开发的小Demo了。今天我们来总结一下实现一个Controller的几种方法。

一、实现Controller接口

/**
 * 要实现Controller接口,这样就算是一个springmvc的Controller了。
 * @author Jonas
 *
 */
public class MyController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request,
        HttpServletResponse response) throws Exception {
        ModelAndView mv = new ModelAndView();
        mv.addObject("message","hello spring mvc world");
        mv.setViewName("welcome");
        return mv;
    }

}

 这种方式采用的适配器是SimpleControllerHandlerAdapter。

二、实现HttpRequestHandler接口

public class HelloController implements HttpRequestHandler {

 
    @Override

    public void handleRequest(HttpServletRequest request,

        HttpServletResponse response) throws ServletException, IOException {

        request.setAttribute("message", "Hello HttpRequestHandler world");

        request.getRequestDispatcher("/WEB-INF/jsp/welcome.jsp").forward(request, response);

    }

 

}    

这种方式和第一种完全不一样,该方式采用的适配器为HttpRequestHandlerAdapter。该类的handleRequest方法返回值为null,更多的是由程序员来实现的。比如上方的跳转页面。

三、继承AbstractController抽象类

public class MyController1 extends AbstractController {

	@Override

	protected ModelAndView handleRequestInternal(HttpServletRequest request,
		HttpServletResponse response) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

}

该方式和第一种一样,都使用了SimpleControllerHandlerAdapter。不同的一点在于该方式采用了一种模版方法的方式进行实现。该方法可以限制HTTP的提交请求方式。在springmvc.xml中注册处理器的时候,添加property来进行注入属性。如下:

<!-- 注册SpringMVC处理器 -->

<bean id="myController" class="cn.wechatbao.controller.MyController1">

    <property name="supportedMethods" value="POST"></property>

</bean>

以上设置当前controller只支持POST请求。supportedMethods属性来自于AbstractController的父类WebContentGenerator类。

public abstract class AbstractController extends WebContentGenerator implements Controller {

    //...

}

我们打开WebContentGenerator类,如下:

四、继承MultiActionController类

public class MyController2 extends MultiActionController {

    public ModelAndView doFirst(HttpServletRequest request,
            HttpServletResponse response){
        ModelAndView mv = new ModelAndView();
        mv.addObject("message","hello first world");
        mv.setViewName("welcome");
        return mv;
    }
    
    public ModelAndView doSecond(HttpServletRequest request,
            HttpServletResponse response){
        ModelAndView mv = new ModelAndView();
        mv.addObject("message","hello second world");
        mv.setViewName("welcome");
        return mv;
    }

}

springmvc.xml中需要如下配置:

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/multiAction/*.do">myController</prop>
        </props>
    </property>
</bean>

<!-- 注册SpringMVC处理器 -->
<bean id="myController2" class="cn.wechatbao.controller.MyController2"></bean>

这样就实现了动态路径访问,原因是MultiActionController类内部使用了一个名叫InternalPathMethodNameResolver的内部方法名称路径解析器。该解析器将方法名作为资源名称进行解析,意味着,我们提交请求时要将方法名作为资源名称出现。如下:

http://localhost:8080/SpringMVC/multiAction/doFirst.do

http://localhost:8080/SpringMVC/multiAction/doSecond.do

但是该方法在Spring4.3以后就废弃了。不建议使用了,官方的解释为in favor of annotation-driven handler methods有利于注解驱动处理程序的方法。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏潇涧技术专栏

Head First Android Testing 2

Instrumentation Tests又叫Device or Emulator Tests,即运行在设备或者模拟器上的测试。使用AndroidJunitRu...

762
来自专栏IT笔记

MongoDB从入门到“精通”之整合JavaWeb项目

好了,前两篇扯了这么多。开始的开始,我们也无须了解的更加深入。重点是要整合到项目中去,在实践中发现问题,追踪问题,然后解决问题。 ? 3004.jpg 准备 M...

5925
来自专栏IT笔记

SpringBoot开发案例之整合Dubbo提供者(一)

既然是开发案例,显然不会扯那么多老婆舌,有不清楚这两个东东的请自行百度。 ? 0.jpg 开发环境 JDK1.7、Maven、Eclipse、SpringBoo...

43813
来自专栏老付的网络博客

SpringMVC 教程

   Spring 是目前比较流行的MVC框架,让POJO处理起来变的容易,也支持Rest的Url请求。采用松散的耦合可插拔的接口,比其它MVC接口更具有扩展...

1594
来自专栏玩转JavaEE

Spring Cloud中Hystrix的请求缓存

高并发环境下如果能处理好缓存就可以有效的减小服务器的压力,Java中有许多非常好用的缓存工具,比如Redis、EHCache等,当然在Spring Cloud的...

3648
来自专栏Java学习123

查看Linux系统信息

28210
来自专栏Java技术栈

@Resource,@Autowired,@Inject3种注入方式详解

概况 @Resource,@Autowired,@Inject 这3种都是用来注入bean的,它们属于不同的程序中。 ANNOTATIONPACKAGESOUR...

3799
来自专栏青青天空树

spring基础(2:最小化XML配置)

  byType在出现多个匹配项时不会自动选择一个然是报错,为避免报错,有两种办法:1.使用<bean>元素的primary属性,设置为首选Bean,但所有be...

1022
来自专栏java思维导图

Spring常用注解(收藏大全)

@Configuration 声明当前类为配置类,相当于xml形式的Spring配置(类上)

1132
来自专栏JAVA烂猪皮

Spring IoC中各个注解的理解和使用

一、把在Spring的xml文件中配置bean改为Spring的注解来配置bean

763

扫码关注云+社区

领取腾讯云代金券