什么是 springmvc,他与 spring 有什么关系?
springmvc 属于 spring 框架的后续产品,用在基于 mvc 的表现层开发,类似于 struts2 框架;
springmvc 有的地方也叫 spring web mvc,他是 spring 整个框架中的一个部分;
因此 springmvc 也要依赖于 IOC 容器;
项目结构:
springmvc 的开发步骤:
1、导入相关的 jar 包:
* commons-logging.jar
* org.springframework.asm-3.0.5.RELEASE.jar
* org.springframework.beans-3.0.5.RELEASE.jar
* org.springframework.context-3.0.5.RELEASE.jar
* org.springframework.core-3.0.5.RELEASE.jar
* org.springframework.expression-3.0.5.RELEASE.jar --以上是 spring 核心 jar 包
* org.springframework.web.servlet-3.0.5.RELEASE.jar --springmvc 的 jar 包
* org.springframework.web-3.0.5.RELEASE.jar --springweb 的 jar 包
2、在 web.xml 中配置 springmvc 核心控制器:
注意:这样配置默认情况下会自动到 WEB-INF 目录下查找 <servlet-name>-servlet.xml 的配置文件;
<?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">
<!-- 注册 springmvc 核心控制器(DispatcherServlet) -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3、创建 HelloAction.java 控制器:实现 Controller 接口,重写接口中的 handleRequest 方法,并在此方法中封装数据和路径
package com.springmvc.demo;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 控制器类
public class HelloAction implements Controller {
// 构造:从输出信息可以看出来,springmvc 的控制器是单例的,只在服务器启动的时候创建对象;
public HelloAction(){
System.out.println("HelloAction()::" + this.hashCode());
}
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws Exception {
System.out.println("HelloAction::handleRequest()");
// ModelAndView 用于向视图封装数据和路径
ModelAndView modelAndView = new ModelAndView();
// 封装数据
modelAndView.addObject("message", "hello springmvc");
// 封装路径(绝对路径)
modelAndView.setViewName("/index.jsp");
return modelAndView;
}
}
4、在 webroot 目录下创建 index.jsp,作为跳转目的页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%-- 输出控制器中传过来的数据 --%>
${requestScope.message}
</body>
</html>
5、在 WEB-INF 目录下创建配置文件,配置文件的头部信息和 spring 相同;
注意:配置文件的命名规则为 web.xml 中配置的 <servlet-name>的值-servlet.xml,
即 DispatcherServlet-servlet.xml,并在配置文件中配置 action;
<?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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!--
注册 Action:
name:表示请求的路径;
class:表示处理类的全名(含包名);
-->
<bean name="/hello" class="com.springmvc.demo.HelloAction"></bean>
</beans>
6、部署到服务器测试结果如下:
注意:在 web.xml 中配置 springmvc 核心控制器的时候,<url-pattern> 里写的是 /,而不能写成 /*,否则会出现如下错误:
在网上查了下,原因如下:https://www.iteye.com/problems/36433
springmvc 的工作流程:
1、根据配置文件中配置的 action 的 name 属性(<bean name="/hello" class="com.springmvc.demo.HelloAction"></bean>),
在地址栏输入:http://localhost:8080/springmvc01/hello,将请求交给 springmvc 的核心控制器 DispatcherServlet 处理;
注意:springmvc 并不是直接将请求交给 action 进行处理;
将请求发送到 action,中间要经过 映射器和适配器;
2、DispatcherServlet 接收到请求以后,先把请求交给 映射器(handler) 进行处理;
springmvc 默认使用的映射器为:BeanNameUrlHandlerMapping;
该映射器表示将 bean 标签的 name 属性作为 url 请求(<bean name="/hello" >);
3、映射器(handler)处理完后,再将请求交给 适配器(adapter)进行处理;
springmvc 默认使用的适配器为:SimpleControllerHandlerAdapter;
该适配器用来寻找实现了 Controller 接口的 action 类,将请求交给该类处理;
4、通过适配器找到处理请求的 action 类以后,在 action 的 handleRequest 方法中进行业务处理;
5、action 类处理完业务之后,将结果封装到一个 ModelAndView 对象中,并将该对象交给 视图解析器 进行处理;
springmvc 默认使用的 视图解析器为:InternalResourceViewResolver;
视图解析器解析出 ModelAndView 中的数据,然后再交给 springmvc 核心控制器(DispatcherServlet ),
最后,核心控制器将结果传输到 jsp 页面中;
映射器、适配器、视图解析器都可以在 DispatcherServlet-servlet.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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!--
注册 Action:
name:表示请求的路径;
class:表示处理类的全名(含包名);
-->
<bean name="/hello" class="com.springmvc.demo.HelloAction"></bean>
<!-- 配置映射器:
BeanNameUrlHandlerMapping:表示将 bean 标签的 name 属性作为 url 请求(默认配置,不写也行);
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 配置适配器
SimpleControllerHandlerAdapter:用于寻找实现了 Controller 接口的 action 类(默认配置,不写也行);
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 配置视图解析器
InternalResourceViewResolver:表示通过 ModelAndView 对象中封装的视图名找到真正的页面(默认配置,不写也行);
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>