示例1 基于Controller接口的控制器

示例1:基于Controller接口的控制器

1.增加Spring的支持

首先,使用Eclipse新建一个Dynamic Web Pro ject,也就是新建一个动态Web项目,命名为SpringMVCTest

项目结构

展开/折叠
G:\Desktop\随书源码\Spring+Mybatis企业应用实战(第2版)\codes\02\SpringMVCTest
├─mytree
├─src\
│ └─org\
│   └─fkit\
│     └─controller\
│       └─HelloController.java
└─WebContent\
  ├─META-INF\
  │ └─MANIFEST.MF
  └─WEB-INF\
    ├─content\
    │ └─welcome.jsp
    ├─lib\
    │ ├─commons-logging-1.2.jar
    │ ├─spring-aop-5.0.1.RELEASE.jar
    │ ├─spring-aspects-5.0.1.RELEASE.jar
    │ ├─spring-beans-5.0.1.RELEASE.jar
    │ ├─spring-context-5.0.1.RELEASE.jar
    │ ├─spring-context-indexer-5.0.1.RELEASE.jar
    │ ├─spring-context-support-5.0.1.RELEASE.jar
    │ ├─spring-core-5.0.1.RELEASE.jar
    │ ├─spring-expression-5.0.1.RELEASE.jar
    │ ├─spring-instrument-5.0.1.RELEASE.jar
    │ ├─spring-jcl-5.0.1.RELEASE.jar
    │ ├─spring-jdbc-5.0.1.RELEASE.jar
    │ ├─spring-jms-5.0.1.RELEASE.jar
    │ ├─spring-messaging-5.0.1.RELEASE.jar
    │ ├─spring-orm-5.0.1.RELEASE.jar
    │ ├─spring-oxm-5.0.1.RELEASE.jar
    │ ├─spring-test-5.0.1.RELEASE.jar
    │ ├─spring-tx-5.0.1.RELEASE.jar
    │ ├─spring-web-5.0.1.RELEASE.jar
    │ ├─spring-webflux-5.0.1.RELEASE.jar
    │ ├─spring-webmvc-5.0.1.RELEASE.jar
    │ └─spring-websocket-5.0.1.RELEASE.jar
    ├─springmvc-config.xml
    └─web.xml

复制Spring的jar包到项目lib目录

为了让Web应用具有Spring支持的功能,将spring-framework-5.0.1.RELEASE解压文件夹下的libs文件夹下所有Spring框架的class文件的jar包和Spring所依赖的commons-logging-1.2.jar复制到Web应用的lib文件夹下,也就是SpringMVCTest\WebContent\WEB-INF路径下.
可以在libs目录下打开cmd,使用如下copy命令复制即可:

1
copy *.RELEASE.jar E:\workspace_shizhan\SpringMVCTest\WebContent\WEB-INF\lib

复制效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
G:\Desktop\随书源码\库文件\spring-framework-5.0.1.RELEASE\libs>copy *.RELEASE.jar E:\workspace_shizhan\SpringMVCTest\WebContent\WEB-INF\lib
spring-aop-5.0.1.RELEASE.jar
spring-aspects-5.0.1.RELEASE.jar
spring-beans-5.0.1.RELEASE.jar
spring-context-5.0.1.RELEASE.jar
spring-context-indexer-5.0.1.RELEASE.jar
spring-context-support-5.0.1.RELEASE.jar
spring-core-5.0.1.RELEASE.jar
spring-expression-5.0.1.RELEASE.jar
spring-instrument-5.0.1.RELEASE.jar
spring-jcl-5.0.1.RELEASE.jar
spring-jdbc-5.0.1.RELEASE.jar
spring-jms-5.0.1.RELEASE.jar
spring-messaging-5.0.1.RELEASE.jar
spring-orm-5.0.1.RELEASE.jar
spring-oxm-5.0.1.RELEASE.jar
spring-test-5.0.1.RELEASE.jar
spring-tx-5.0.1.RELEASE.jar
spring-web-5.0.1.RELEASE.jar
spring-webflux-5.0.1.RELEASE.jar
spring-webmvc-5.0.1.RELEASE.jar
spring-websocket-5.0.1.RELEASE.jar
已复制 21 个文件。

复制commons-logging的jar包到项目lib目录

下载commons-logging-1.2,解压,然后进入解压后的目录,输入如下copy命令来复制commons-logging-1.2.jar到项目路径中:

1
copy *1.2.jar E:\workspace_shizhan\SpringMVCTest\WebContent\WEB-INF\lib

复制效果:

1
2
3
G:\Desktop\随书源码\库文件\commons-logging-1.2>copy *1.2.jar E:\workspace_shizhan\SpringMVCTest\WebContent\WEB-INF\lib
commons-logging-1.2.jar
已复制 1 个文件。

复制后的libs目录文件列表

此时libs目录下的文件如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
E:\workspace_shizhan\SpringMVCTest\WebContent\WEB-INF\lib
├─commons-logging-1.2.jar
├─spring-aop-5.0.1.RELEASE.jar
├─spring-aspects-5.0.1.RELEASE.jar
├─spring-beans-5.0.1.RELEASE.jar
├─spring-context-5.0.1.RELEASE.jar
├─spring-context-indexer-5.0.1.RELEASE.jar
├─spring-context-support-5.0.1.RELEASE.jar
├─spring-core-5.0.1.RELEASE.jar
├─spring-expression-5.0.1.RELEASE.jar
├─spring-instrument-5.0.1.RELEASE.jar
├─spring-jcl-5.0.1.RELEASE.jar
├─spring-jdbc-5.0.1.RELEASE.jar
├─spring-jms-5.0.1.RELEASE.jar
├─spring-messaging-5.0.1.RELEASE.jar
├─spring-orm-5.0.1.RELEASE.jar
├─spring-oxm-5.0.1.RELEASE.jar
├─spring-test-5.0.1.RELEASE.jar
├─spring-tx-5.0.1.RELEASE.jar
├─spring-web-5.0.1.RELEASE.jar
├─spring-webflux-5.0.1.RELEASE.jar
├─spring-webmvc-5.0.1.RELEASE.jar
└─spring-websocket-5.0.1.RELEASE.jar

这样该Web应用已经加入了Spring的必需类库。但还需要修改web.xml文件,让该文件负责加载Spring框架。

2. 配置前端控制器DispatcherServlet

eclipse生成web.xml

进入WebContent\WEB-INF目录,打开web.xml文件,如果没有web.xml文件,可以在项目上右键,选择Java EE Tools,然后选择Generate Deployment Descriptor Stub即可生成web.xml文件.

web.xml中配置前段控制器

在人在该文件中配置Spring MVC的前端控制器DispatcherServlet,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<!-- 定义Spring MVC的前端控制器 -->
<servlet>
<!-- 默认去应用程序文件夹下的`WEB-INF`文件夹下査找对应的`springmvc-servlet.xml`作为配置文件 -->
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- Spring MVC配置文件的路径 -->
<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-app>

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

3 配置Spring MVC的Controller

接下来是Spring MVC的配置文件,创建/WEB-INF/springmvc-config.xml文件,写入如下配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- 配置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"/>
</beans>
  • springmvc-config.xml文件声明了HelloController业务控制器类,并将其映射到/hello请求。
  • 此处还配置了一个处理器映射器BeanNameUrlHandlerMapping,这样可以Bean的名称为URL进行查找;
  • 同时配置了处理器适配器SimpleControllerHandlerAdapter,来完成对HelloController类的handleRequest方法的调用;
  • 最后配置了视图解析器InternalResourceViewResolver来解析视图,将View呈现给用户。

需要注意的是,在Spring4.0之后,如果不配置处理器映射器、处理器适配器和视图解析器,也会使用默认的完成Spring内部MVC工作,笔者在此处显示配置处理过程,是希望读者能够了解Spring MVC的每一个动作,之后可以更好地理解Spring MVC的工作流程。

4. Controller类的实现

HelloController类实现了Controller接口,用来处理/hello请求。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package org.fkit.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

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

HelloController是一个实现Controller接口的控制器,它可以处理一个单的请求动作。 handleRequestController接口必须实现的方法, Controller调用该方法来处理请求。该方法的参数是对应请求的HttpServletRequestHttpServletResponse,该方法必须返回一个包含视图名或视图名和模型的ModelAndView对象。本例返回的模型中包含了一个名为message的字符串对象,返回的视图路径为/WEB-INF/content/welcome.jsp,因此,请求将被转发到welcome.jsp页面。
提示:Spring MVC建议把所有的视图页面存放在WEB-INF文件夹下,这样可以保护视图页面,避免直接向视图页面发送请求。上面的HelloController类的handleRequest方法处理完请求后, Spring MVC会调用/WEB-INF/content/文件夹下的welcome.jsp呈现视图.

5. View页面

SpringMVCTest包含一个视图页面welcome.jsp,用来显示欢迎信息。

此处的JSP页面使用了EL表达式来简化页面开发,关于EL表达式的使用可参考附录A EL表达式和JSTL标签库”的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>欢迎页面</title>
</head>
<body>
<!-- 页面可以访问Controller传递传递出来的message -->
${requestScope.message}
</body>
</html>

6.测试应用

使用Eclipse部署SpringMVCTest这个Web应用,在浏览器中输入如下URL来测试应用,

1
http://localhost:8080/SpringMVCTest/hello

浏览器上将会显示Hello World!这个字符串,这表示Spring MVC访问成功。

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