零、前言
我看很多大神级别的博客、都是大神级别的!发现很多写很多!也没有什么注释什么的!新手很难理解!新手一看什么都不懂(懵逼了)。
作为刚入门的程序员、小白是这样去学习编程:
—— Do it first! —— 先去做!
—— How to do it! —— 怎么做!
—— Look at the source code! —— 看源代码!
一、SpringMVC简介
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面,Spring 框架提供了构建Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。
Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来:
二、先来个入门的 hello word 来体验一下!maven项目!
——前提是安装maven!不安装的话自己导包就可以了!、不会maven的朋友看看这篇文章:maven教程
package cn.czy.com.spring.web.mvc.hello;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
//控制器
@Controller
public class HelloController{
//用注解的方式写第一个springmvc hello world例子
@RequestMapping(value="/hello")
public String hello(HttpServletRequest request){
request.setAttribute("message1", "Hello Spring MVC Framework!");
request.setAttribute("message2", "chen zheng you !");
System.out.println(" hello , ChenZhengYou !");
return "hello/hello";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
<h1>第一个参数:${message1 }</h1>
<h1>第二个参数:${message2}</h1>
</body>
</html>
<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_0.xsd"
version="3.1">
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 前端控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--第一种:*.action,访问以.action结尾 由DispatcherServlet进行解析 -->
<!--第二种:/,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析 -->
<!-- 使用此种方式可以实现 RESTful风格的url -->
<!--第三种:/*,这样配置不对,使用这种配置,最终要转发到一个jsp页面时, 仍然会由DispatcherServlet解析jsp地址, -->
<!-- 不能根据jsp页面找到handler,会报错。 -->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 解决post请求乱码问题 -->
<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>
</web-app>
<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 ">
<!-- 第一个hello word !注解的方式实现! -->
<context:component-scan base-package="cn.czy.com.spring.web.mvc" />
<!--核心学点1 -->
<!--注解映射器 -->
<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> -->
<!--注解适配器 -->
<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> -->
<!-- 使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置 -->
<!-- mvc:annotation-driven默认加载很多的参数绑定方法, -->
<!-- 比如json转换解析器就默认加载了,如果使用mvc:annotation-driven, -->
<!-- 不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter, -->
<!-- 实际开发时使用mvc:annotation-driven -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 核心学点2 -->
<!-- 视图解析器 -->
<!-- 解析jsp解析,默认使用jstl标签,classpath下的得有jstl的包-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置jsp路径的前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 配置jsp路径的后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
还有这个<!-- maven 编译部署src/main/java下的资源文件 -->是我用idea开发的、默认不加载!
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.com</groupId>
<artifactId>ssm.com</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>ssm.com Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<!-- maven依赖-->
<junit.version>3.8.1</junit.version>
<jstl.version>1.2</jstl.version>
<cglib.version>2.2.2</cglib.version>
<standard.version>1.1.2</standard.version>
<servlet.version>3.1.0</servlet.version>
<spring-webmvc.version>4.2.2.RELEASE</spring-webmvc.version>
<spring-orm.version>4.3.3.RELEASE</spring-orm.version>
<spring-test.version>4.3.3.RELEASE</spring-test.version>
<log4j.version>1.2.17</log4j.version>
<slf4j-api.version>1.7.20</slf4j-api.version>
<org.slf4j.version>1.7.7</org.slf4j.version>
<commons-dbutils.version>1.6</commons-dbutils.version>
</properties>
<dependencies>
<!-- 1)junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- 2)jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<!-- standard -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>${standard.version}</version>
<scope>provided</scope>
</dependency>
<!-- 3)servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-webmvc.version}</version>
</dependency>
<!-- spring-test-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-test.version}</version>
<type>jar</type>
<scope>test</scope>
</dependency>
<!-- spring-orm -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring-orm.version}</version>
<scope>provided</scope>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j-api.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j.version}</version>
</dependency>
</dependencies>
<build>
<!-- 项目id -->
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>${maven-java-compiler-plugin}</source>
<target>${maven-java-compiler-plugin}</target>
<encoding>${maven-java-compiler-plugin-encoding}</encoding>
</configuration>
</plugin>
</plugins>
<!-- maven 编译部署src/main/java下的资源文件 -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
</project>
三、分析一下传统的mvc和springmvc的架构!
1.1 传统的Web MVC架构图(自己用画图画的、小白勿喷!)
mvc设计模式在b/s系统下应用:
1、用户发起request请求至控制器(Controller)
—控制接收用户请求的数据,委托给模型进行处理
2、控制器通过模型(Model)处理数据并得到处理结果
—模型通常是指业务逻辑
3、模型处理结果返回给控制器
4、控制器将模型数据在视图(View)中展示
—web中模型无法将数据直接在视图上显示,需要通过控制器完成。如果在C/S应用中模型是可以将数据在视图中展示的。
5、控制器将视图response响应给用户
—通过视图展示给用户要的数据或处理结果。
1.2 Springmvc 架构图
四、Springmvc的流程!
4.1Springmvc架构流程1、用户发送请求至前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、DispatcherServlet通过HandlerAdapter处理器适配器
5、执行处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、ViewReslover解析后返回具体View
10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户
4.2 组件说明
以下组件通常使用框架提供实现:
——》DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
——》HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
——》Handler:处理器
Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
——》HandlAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
——》View Resolver:视图解析器
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
五、这就是springmvc的入门程序!
总结:通过入门程序理解
springmvc前端控制器(web.xml文件)、
处理器映射器(spring-mvc.xml文件里有注释)、
处理器适配器(spring-mvc.xml文件里有注释)、
视图解析器(spring-mvc.xml文件里有注释)用法。
系列文章