本例先通过入门程序来讲解springMVC的大致工作原理
(一)web项目的目录结构
(以下代码段中各部分的作用已经使用注释标注,可对照后边(三)springMVC的运行原理进行查看)
lib目录下是所有需要依赖的jar包
HelloWorldController.java:是用于处理请求的控制器
package com.unknown.controller;
import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
public class HelloWorldController implements Controller {
//handleRequest方法提供请求处理逻辑
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) {
Map<String,String> modelData = new HashMap<String, String>();
modelData.put("msg","Hello, my first springMVC programme");
//handleRequest方法将会返回一个包含modelData信息的ModelAndView对象
return new ModelAndView("helloWorld",modelData);
}
}
myapp-config.xml:包含控制器的bean定义以及处理程序的映射
<?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-4.3.xsd">
<bean name="helloWorldController"
class="com.unknown.controller.HelloWorldController"/>
<!-- 使用SimpleUrlHandlerMapping
将http请求映射到负责处理该请求的控制器
这里使用url路径/sayhello 将请求映射到控制器HelloWorldController
-->
<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<entry key="/sayhello" value-ref="helloWorldController"/>
</map>
</property>
</bean>
<!-- 使用InternalResourceViewResolver
将ModelAndView对象中的包含视图名的内容(本例中是helloWorld) 定位到具体的视图(/WEB-INF/jsp/helloWorld.jsp)
其实就是将对应的请求的url路径映射到指定的视图(即某jsp文件)
-->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--这里指定要给名称加上的对应的前缀与后缀
prefix 前缀 suffix 后缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
helloworld.jsp:前端用于展示的视图文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello</title>
</head>
<body>
${msg}
<!--这里打印出由Controller返回到视图ModelAndView对象中msg模型特性的值-->
</body>
</html>
web.xml:这里是对前端控制器DispatcherServlet进行部署配置
<?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_3_1.xsd"
version="3.1">
<servlet>
<!-- 配置前端控制器 -->
<servlet-name>hello</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化时加载配置文件 -->
<init-param>
<!--这里如果不指定contextConfigLocation,前端控制器将直接在WEB-INF目录下查找名为 (servlet-name)-servlet.xml-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:myapp-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--这里将前端控制器映射到/helloworld/* -->
<!--综合前边将控制器HelloWorldController映射到/sayhello -->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/helloworld/*</url-pattern>
</servlet-mapping>
<!-- 解决乱码的过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
(二) 运行效果
使用浏览器访问http://localhost:8080/helloworld/sayhello得到的效果:
(三)springMVC的运行原理
在spring web mvc中,其核心是前端控制器DispatcherServlet,这次请求的整个运行流程如下:
菜鸟一枚,有错误的地方欢迎指出!