一、Spring Web MVC核心架构图
具体流程:
- 用户(客户端)发送请求,DispatcherServerlet前端控制器收到请求后委托给其它的解释器进行处理,自己作为统一访问点,控制全局流程。
- DispatcherServlet --> HandlerMapping。HandlerMapping(处理器映射)接收到DispatcherServlet的请求后,将请求映射成为HandlerExecutionChain对象,这其中包含Handler和多个HandlerIntercepter对象。(这里对HandlerIntercepter的处理还不是很明确)
- DispatcherServlet --> HandlerAdapter。DispatcherServlet把Handler发给HandlerAdapter,并把Handler包装成为一个HandlerAdapter,并根据适配的结果调用其功能方法。返回一个ModelAndView对象(包含模型类型,逻辑视图名)
- ModelAndView中的逻辑视图名 --> ViewResolver。ViewResolver通过逻辑视图名解释为相应的View。
二、HelloWorld入门
Spring框架: spring-framework-4.0.0.M1-dist.zip
下载地址:https://github.com/spring-projects/spring-framework
所需jar包,
你不需要带有javadoc和sources的jar包都放进去项目中。spring-webmvc-4.0.0.M1.jar就是springMVC的核心包,所需的类都在此jar包中。
Spring框架依赖jar包commons-logging-1.2.jar
注意:springMVC和spring是两个不同的框架体系,springMVC相当于SSH中的Struts2的概念。
2.1 前端控制器配置
我们需要在web.xml中加入以下代码
<!-- Spring MVC Begin -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- <init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-servlet.xml</param-value> 默认位置
</init-param>
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<!-- 不能写成/* 不能匹配,只能为/,默认servlet映射 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- Spring MVC End -->
1)、配置核心类DispatcherServlet,并拦截所有的请求,"/"表示所有请求都要通过这个类分发。你也可以用".html"或者"/do"拦截扩展名为html或者为do的请求。
<load-on-startup>1</load-on-startup>表示设置启动顺序优先级,1为最先启动的Servlet(listener比所有的Servlet都要先启动)。
2)、DispatcherServlet会有读取一个配置文件*-servlet.xml(*是你的起的Servlet的名字,这里是spring,所以配置文件叫spring-servlet.xml),默认是放在/WEB-INF/spring-servlet.xml中,你也可以通过上面的设置对配置文件名字进行修改
当然如果你需要直接使用Spring作为你的Ioc容器的话,请在web.xml配置以下的代码:
<!-- Spring IOC -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
2.2在默认配置文件中加入HandlerMapping和HandlerAdapter
<!-- HandlerMapping -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- HandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
2.3在Spring配置文件中加入ViewResolver
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
1) prefix和suffix:查找视图页面的前缀和后缀(前缀[逻辑视图名]后缀),比如传进来的逻辑视图名为hello,则该该jsp视图页面应该存放在“WEB-INF/jsp/hello.jsp”
2.4开发页面处理器(核心)
package com.rich.personalpage.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class HelloWorldController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest req,
HttpServletResponse resp) throws Exception {
//1、收集参数、验证参数
//2、绑定参数到命令对象
//3、将命令对象传入业务对象进行业务处理
//4、选择下一个页面
ModelAndView mv = new ModelAndView();
//添加模型数据 可以是任意的POJO对象
mv.addObject("message", "Hello World!");
mv.addObject("chinese","我是中文");
//设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面
mv.setViewName("hello");
return mv;
}
}
要实现页面处理器需要实现Controller接口,并实现其方法handleRequest,最后返回一个modelAndView对象。
<!-- Controller -->
<bean name="/hello" class="com.rich.personalpage.controller.HelloWorldController">
</bean>
2.5开发视图页面
路径为/WEB-INF/jsp/hello.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>Hello World!</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
${message}<br>
${chinese}
</body>
</html>
${message}和${chinese}为HelloWorldController处理器传过来的数据模型
运行如果看到Hello World!和"我是中文"即为成功。
补充知识:
<!-- Encoding UTF-8 Spring MVC自带-->
<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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>