SpringMVC 环境搭建
0x00:示例项目
以一个项目示例总结下 SpringMVC 环境的搭建基本流程,项目结构如下图:

0x01:导入 jar 包
SpringMVC 主要 jar 包如下图,需导入到 WEB-INF 下的 lib 目录。

0x02:配置前端控制器
传统的 servlet 开发中,请求都在 web.xml 中配置,然后配置到对应的 servlet 中。同样,在 SpringMVC 中,请求也需要配置到对应的 servlet 上,而做配置的就是前端控制器,用于拦截符合配置的 url 请求。在 SpringMVC 中,正是通过前端控制器 DispatcherServlet 来对请求进行拦截并处理的。配置 web.xml,示例代码如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- SpringMVC前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
配置和 servlet 类似,以上配置会拦截所有以 action 为后缀的请求,交给前端控制器 DispatcherServlet 去处理,定义了 SpringMVC 的核心配置文件为 springmvc.xml。
0x03:配置处理器映射器
在 springmvc.xml 配置文件中添加处理器映射器,示例代码如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd "> <!-- 处理器映射器 --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> </beans>
处理器映射器有多种,它们都实现了 HandlerMapping 接口,示例代码中用的是 BeanNameUrlHandlerMapping 类,映射规则是把 bean 的 name 作为 url 进行查找。
0x04:配置处理器适配器
由之前的 SpringMVC 工作流程可知,当处理器映射器 HandlerMapping 为前端控制器 DispatcherServlet 返回控制器 Handler 后,前端控制器就会给处理器适配器 HandlerAdapter 去执行相关的 Handler 控制器也就是 Controller。
处理器适配器也有多种,它们都实现了 HandlerAdapter 接口,这里使用 SimplerControllerHandlerAdapter 适配器,在 springmvc.xml 中添加以下代码:
<!-- 处理器适配器 --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
0x05:配置视图解析器
当处理器适配器处理了相关的具体方法后,就会返回一个 ModelAndView 对象,这个对象包含了要跳转的视图信息 view 和视图上需要显示的数据 model,此时前端控制器会请求视图解析器 ViewResolver 来解析 ModelAndView 对象。
视图解析器也有很多种,这里使用默认的 InternalResourceViewResolver,在 springmvc.xml 中添加以下代码:
<!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
基本配置完成后,既需要配置处理器 Handler 了。
0x06:配置 Handler 处理器
因为上文处理器适配器使用的是 SimpleControllerHandlerAdapter,所以这里的 Handler 需要实现 Controller 接口。编写一个加载水果列表信息的功能,名为 FruitsControllerTest,示例代码如下:
package com.fageweiketang.controller; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import com.fageweiketang.model.Fruits; public class FruitsControllerTest implements Controller { private FruitsService fruitsService = new FruitsService(); public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception { //模拟Service获取水果商品列表 List<Fruits> fruitsList = fruitsService.queryFruitsList(); //返回ModelAndView ModelAndView modelAndView = new ModelAndView(); //相当于request的setAttribut,在jsp页面通过fruitsList获取数据 modelAndView.addObject("fruitsList", fruitsList); //指定视图 modelAndView.setViewName("/WEB-INF/jsp/fruits/fruitsList.jsp"); return modelAndView; } //模拟Service的内部类 class FruitsService{ public List<Fruits> queryFruitsList(){ List<Fruits> fruitsList = new ArrayList<Fruits>(); Fruits apple = new Fruits(); apple.setName("苹果"); Fruits banana = new Fruits(); apple.setName("香蕉"); Fruits pear = new Fruits(); apple.setName("梨"); fruitsList.add(apple); fruitsList.add(banana); fruitsList.add(pear); return fruitsList; } } }
示例中查询到列表信息后创建了一个 ModelAndView,将需要传递的数据通过 ModelAndView 绑定到了对象中。又通过 setViewName 方法指定了要跳转的页面。
0x07:编写实体类代码
实体类很简单,一个 get 和 set 方法即可,示例代码如下:
package com.fageweiketang.model; public class Fruits { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
0x08:编写视图页面
最后在 / WEB-INF/jsp/fruits 路径下创建 fruitsList.jsp 文件即可,示例代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!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> <h3>水果列表</h3> <table width="300px;" border=1> <c:forEach items="${fruitsList }" var="fruit"> <tr> <td>${fruit.name }</td> </tr> </c:forEach> </table> </body> </html>
因为 springmvc.xml 中配置的处理器映射器是 BeanNameUrlHandlerMapping,在接收请求时,会将 bean 的 name 作为 url 进行查找,所以最后需要在 springmvc.xml 中配置一个可以被 url 映射的 Handler 的 bean,配置示例如下:
<bean name="/queryFruits.action" class="com.fageweiketang.controller.FruitsControllerTest"/>
启动 tomcat 服务器,访问 localhost/SpringMVC/queryFruits.action,结果如下:

公众号回复数字“8”领取CIS加固全套手册。
微 信:fageweiketang,朋友圈不定期干货分享,欢迎讨论。
公众号:发哥微课堂,专注于代码审计、WEB渗透、网络安全。


浙公网安备 33010602011771号