前言:
刚接触SpringMVC讲真的,看理论真的是一头雾水,不如实打实手撕一个简单Demo学得快。
这里我就不多介绍为何要如此配置了,因为网上理论的知识太多了,我也相信你只是缺少一个简单的说明例子。
这里我就简单用SpringMVC配置一个小项目
来理解一下SpringMVC到底是什么妖怪。
主页面显示:
http://localhost:8080/SpringMVC_test/
水果信息页面显示:
http://localhost:8080/SpringMVC_test/fruits.action
首先附上项目的git地址:有兴趣的可以直接下载:
https://github.com/jjc123/SpringMVC_MyfirstDemo
首先看一下目录结构:
第一步配置pom.xml:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!--配置servlet依赖 Controller处理器需要-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!--配置jstl标签需要-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
第二步:配置web.xml:
主要是配置DispatcherServlet这个中间类:和Model,View,Controller分别进行联系,降低三者的耦合度。
注意:
web.xml中<welcome-file-list>配置((web欢迎页、首页))
在web项目中,当用户在浏览器中输入的URL不包含某个特定的
Servlet、html、jsp页面时,
web.xml中<welcome-file-list>标签元素就会指定显示的默认文件。
SpringMVC中JSP页面不显示EL表达式的原因:
EL表达式默认是禁用或者忽略的, 必须手动启用,才会输出 model 中的值。
web-app所以要用version大于3的版本
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<display-name>Archetype Created Web Application</display-name>
<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/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>
第三步:配置实体类:
这里省略set和get方法,其实是存在的
public class Fruit {
String name;
Integer price;
public Fruit(){}
public Fruit(String name, Integer price) {
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Fruit{" +
"name='" + name + '\'' +
", price='" + price + '\'' +
'}';
}
}
第四步:配置实现Controller接口的类:
import java.util.ArrayList;
import java.util.List;
public class FruitsController implements Controller {
@Override
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
FruitService fruitService = new FruitService();
List<Fruit> list = fruitService.queryFruitsList();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("fruits",list);
System.out.println(modelAndView.getModelMap());
modelAndView.setViewName("/WEB-INF/jsp/fruitsList.jsp");
return modelAndView;
}
class FruitService{
public List<Fruit> queryFruitsList(){
List<Fruit> list = new ArrayList<Fruit>();
list.add(new Fruit("苹果",5));
list.add(new Fruit("火龙果",7));
list.add(new Fruit("雪莲果",4));
return list;
}
}
}
第五步:配置要访问的显示界面jsp:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>新鲜水果</h3>
<table width="300px" border="1">
<tr>
<td>序号</td>
<td>名称</td>
<td>价格</td>
</tr>
<c:forEach items="${fruits}" var="fruit" varStatus="varfrt">
<tr>
<td>${varfrt.count}</td>
<td>${fruit.name}</td>
<td>${fruit.price}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
第六步:配置欢迎界面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>欢迎 !</h2>
</body>
</html>
最后一步:配置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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置处理器映射器 将Bean的name作为url进行查找,需要配置Handler时指定Beanname就是url-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!--配置适配器 只要编写了实现了Controller接口的控制器,适配器就会执行Controller的具体方法-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!--根据handler方法返回的modelandview中的视图的具体位置,加载相应的界面并绑定反馈数据-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
<bean name="/fruits.action" class="controller.FruitsController"></bean>
</beans>
流程:
- 因为http://localhost:8080/SpringMVC_test/不存在这个Servlet、html、jsp页面时,web.xml中
<welcome-file-list>
标签元素就会指定显示的默认文件:index.jsp页面。 - 访问:http://localhost:8080/SpringMVC_test/fruits.action
DispatcherServlet接收到请求后,访问映射器,根据映射器的类型:BeanNameUrlHandlerMapping(将Bean的name作为url进行查找,需要配置Handler时指定Beanname就是url),从springmvc.xml的配置文件中找到
<bean name="/fruits.action" class="controller.FruitsController"></bean>
,返回给DispatcherServlet - DispatcherServlet访问适配器, 根据适配器类型:SimpleControllerHandlerAdapter(只要编写了实现了Controller接口的控制器,适配器就会执行Controller的具体方法),因为:
public class FruitsController implements Controller 满足条件就执行它的handleRequest类返回ModelAndView(包含对应的显示页面和数据)给DispatcherServlet。 - DispatcherServlet访问视图解析器,根据类型:InternalResourceViewResolver(根据handler方法返回的modelandview中的视图的具体位置,加载相应的界面并绑定反馈数据),访问fruitsList.jsp页面,将数据动态加入到该页面中,然后返回给DispatcherServlet,再返回给浏览器。
第四步中注意:
a. 因为jsp中使用了jstl标签,所以要进行相关的配置。
b. jsp放在WEB-INF(项目私有文件夹)中 这样用户就没法通过路径访问该网页,保证了视图的安全性。
c. ModelAndView的视图地址:"/WEB-INF/jsp/fruitsList.jsp"不需要些webapp,那个省略。