基于Controller接口的控制器及简单应用

DispatcherServlet在Spring当中充当一个前端控制器的角色,它的核心功能是分发请求。请求会被分发给对应处理的Java类,Spring MVC中称为Handle。在Spring 2.5版本之前,开发一个Handle的唯一方法是实现org.springframework.web.servlet.mvc.Controller接口。Controller接口必须实现一个方法

ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response) throws Exception 

Controller接口的实现类可以通过handleRequest方法传递的参数访问对应请求的HttpServletRequest和HttpServletResponse对象,处理完业务请求之后,必须返回一个包含模型对象和视图路径的ModelAnView对象。

但Controller接口的实现类智能处理一个单一的请求动作,而Spring 2.5之后新增的基于注解的控制器可以支持同时处理多个请求动作,并且无需实现任何接口,其更加灵活,下一节会详细介绍。

下面我们介绍一下基于Controller接口控制器的基本应用(默认我们已经添加了Spring支持)

1.配置前端控制器DispatcherServlet(/WEB-INF/web.xml)

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/springmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <!-- 让Spring MVC的前端控制器拦截所有请求 -->
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

web.xml文件的内容告诉Web容器,将使用Spring MVC的DispatcherServlet,并通过配置url-pattern元素的值为"/",将所有的URL映射到该Servlet

2.配置Spring MVC的Controller(/WEB-INF/springmvc-config.xml)

<!-- 配置Handle,映射"/hello"请求 -->
    <bean name="/hello" class="org.fkit.controller.HelloController"/>

    <!-- 处理映射器将bean的name作为url进行查找,需要在配置Handle时指定name(即url) -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    <!-- SimpleControllerHandlerAdapter是一个处理器适配器,所有处理适配器都要实现 HandlerAdapter接口-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>

springmvc-config.xml声明了HelloController业务控制器类,并将其映射到/hello请求。

配置映射处理器BeanNameUrlHandlerMapping,这样可以Bean的名称为url进行查找;同时配置了处理器适配器SimpleControllerHandlerAdapter,来完成对HelloController类的handleRequest方法的调用;最后配置了视图解析器InterResourceViewResolver来解析视图,将View呈现给用户。

在Spring4.0之后,如果不配置处理映射器,处理适配器和视图解析器,也会使用默认的完成Spring内部MVC工作。

3.Controller类的实现

HelloController实现了Controller接口,用来处理/hello请求

package org.fkit.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

/**
 *  HelloController是一个实现Controller接口的控制器
 *  可以处理单一的请求动作
 */
public class HelloController implements Controller{
     private static final Log logger = LogFactory
                .getLog(HelloController.class);

     /**
      * handleRequest是Controller接口必须实现的方法
      * 该方法的参数是对应请求的HttpServletRequest和HttpServletResponse
      * 该方法必须返回一个包含视图名或视图名和模型的ModelAndView对象
      * */
    @Override
    public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
         logger.info("handleRequest 被调用");
         // 创建准备返回的ModelAndView对象,该对象通常包含了返回视图名,模型的名称以及模型对象
         ModelAndView mv = new ModelAndView();
         // 添加模型数据,可以是任意的POJO对象
         mv.addObject("message", "Hello World!");
         // 设计逻辑视图名,视图解析器会根据该名称解析到具体的视图页面
         mv.setViewName("/WEB-INF/content/welcome.jsp");
        // 返回ModelAndView对象
        return mv;
    }

}

本例返回的模型中包含了一个名为message的字符串对象,返回的视图路径为/WEB-INF/content/welcome.jsp,因此,请求会被转发到welcome.jsp页面

Spring MVC建议把所有的视图页面存放在WEB-INF文件夹下,这样可以保护视图页面,避免直接向视图页面发送请求

4.View页面(/WEB-INF/content/welcome.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>欢迎页面</title>
</head>
<body>
<!-- 页面可以访问Controller传递传递出来的message -->
${requestScope.message}
</body>
</html>

5. 测试应用

URL:http://localhost:8080/SpringMVCTest/hello

使用MVC框架就应该严格遵守MVC思想,MVC框架不赞成浏览器直接访问Web应用的视图页面,用户的所有请求都只应向控制器发送,由控制器调用模型组件,视图组件向用户呈现数据

原文地址:https://www.cnblogs.com/ZZUGPY/p/8392365.html

时间: 2024-12-15 01:26:13

基于Controller接口的控制器及简单应用的相关文章

Controller接口控制器详解(1)——SpringMVC

4.1.Controller简介 Controller控制器,是MVC中的部分C,为什么是部分呢?因为此处的控制器主要负责功能处理部分: 1.收集.验证请求参数并绑定到命令对象: 2.将命令对象交给业务对象,由业务对象处理并返回模型数据: 3.返回ModelAndView(Model部分是业务对象返回的模型数据,视图部分为逻辑视图名). 还记得DispatcherServlet吗?主要负责整体的控制流程的调度部分: 1.负责将请求委托给控制器进行处理: 2.根据控制器返回的逻辑视图名选择具体的视

(三)Controller接口控制器详解(一)

4.1.Controller简介 Controller控制器,是MVC中的部分C,为什么是部分呢?因为此处的控制器主要负责功能处理部分: 1.收集.验证请求参数并绑定到命令对象: 2.将命令对象交给业务对象,由业务对象处理并返回模型数据: 3.返回ModelAndView(Model部分是业务对象返回的模型数据,视图部分为逻辑视图名). 还记得DispatcherServlet吗?主要负责整体的控制流程的调度部分: 1.负责将请求委托给控制器进行处理: 2.根据控制器返回的逻辑视图名选择具体的视

Spring mvc Controller接口

Spring MVC 1. 继承该接口 Controller接口,重写对应方法,或者采用注解Controller,自定义映射文件 1 @Controller 2 @RequestMapping("/flight") 3 public class ControlFlight /*implements Controller*/ { 4 5 6 } 需要注意的是: SimpleUrlHandlerMapping 决定使用哪一个控制器. 其中对于prexf-servlet-.xml文件中使重定

springboot单元测试通过MockMvc类调用controller接口

目前有个保存接口有问题,前端双击保存调用两次接口,而生成ID策略是时间戳,这样并发情况下导致重复, 于是想自己写一个单元测试类,调用controller接口.在网上找了好几个也不行,后来经过摸索,已实现,亲测有效. 之前好多都是这样的 private MockMvc mockMvc; @Autowired private WebApplicationContext webApplicationContext; @Before public void setUp() throws Exceptio

VC709E 增强版 基于FMC接口的Xilinx Vertex-7 FPGA V7 XC7VX690T PCIeX8 接口卡

VC709E 增强版 基于FMC接口的Xilinx Vertex-7 FPGA V7 XC7VX690T PCIeX8 接口卡 一.板卡概述       本板卡基于Xilinx公司的FPGA XC7VX690T-FFG1761 芯片,支持PCIeX8.64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持各种接口输入,软件支持windows. 二.功能和技术指标:     1.标准PCI-E接口,支持PCI-E 8x,支持PCI-E 3.0.    2.标准FMC-HPC接口,VA

前端调用后端的方法(基于restful接口的mvc架构)

1.前端调用后台: 建议用你熟悉的一门服务端程序,例如ASP,PHP,JSP,C#这些都可以,然后把需要的数据从数据库中获得,回传给客户端浏览器(其实一般就是写到HTML中,或者生成XML文件)然后在用JS获得. 2.js只是前端的语言,它还没有访问数据库的能力.不过它可以向某个URL发送请求,并获得返回的数据.这个会用到Ajax技术. 用AJAX,页面不刷新,只提交字符串到后台导入数据库       通过纯AngularJS+REST API构建Web是否可行? 在构建Web系统的时候,可不可

基于注解配置的Spring MVC 简单的HelloWorld实例应用

2.1 问题 使用注解的方式重构helloworld应用案例. 2.2 方案 1. @RequestMapping注解应用 @RequestMapping可以用在类定义和方法定义上,它标明这个类或方法与哪一个客户请求对应.实例代码如下: @RequestMapping("/day01") public class HelloController { @RequestMapping("/hello.form") public String execute() thro

270-VC709E 增强版 基于FMC接口的Xilinx Vertex-7 FPGA V7 XC7VX690T PCIeX8 接口卡

VC709E 增强版 基于FMC接口的Xilinx Vertex-7 FPGA V7 XC7VX690T PCIeX8 接口卡 一.板卡概述       本板卡基于Xilinx公司的FPGA XC7VX690T-FFG1761I 芯片,支持PCIeX8.64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持各种接口输入,软件支持windows. 二.功能和技术指标:     1.标准PCI-E接口,支持PCI-E 8x,支持PCI-E 3.0.    2.标准FMC-HPC接口,V

gtk+3.0的环境配置及基于gtk+3.0的python简单例子

/*********************************************************************  * Author  : Samson  * Date    : 06/25/2014  * Test platform:  *              Mint 15  *              GNU bash, version 4.2.45  * *************************************************