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,结果如下:
公众号推荐:aFa攻防实验室
**分享关于信息搜集、Web安全、内网安全、代码审计、红蓝对抗、Java、Python等方面的东西。**
![20191220230427373.jpg][]
还没有评论,来说两句吧...