MVC:
---1-2前端控制器---------------------------------------------------------
Front controller:分发调度
---1-3 MVC概念---------------------------------------------------------
Model-View-Controller
View:视图层
Model:业务数据的信息表示,关注支撑业务的信息构成,通常是多了业务实体的组合。
Controller:调用业务逻辑产生合适的数据(Model)传递数据给视图层用于呈现。
MVC是一种架构模式
程序分层,分工各做,既相互独立,又协同工作。
MVC是一种思考方式
需要将什么信息展示给用户,如何布局,调用那些业务逻辑
===Spring MVC的基本概念=================================
2-1 Spring MVC的静态概念---------------------------------------------------------
render [ˈrɛndɚ] v. 给予;使成为;递交;表达
HandlerAdapter(适配器模式)
1.DispatcherServlet:Front controller
2.Controller
3.HandlerAdapter: DispatcherServlet内部使用的一个类,在DispatcherServlet中调用的controller就是以HandlerAdapter形式出现的。
DispatcherServlet--use--> HandlerAdapter(适配器模式)
4.HandlerInterceptor(拦截器) :在要拦截的对象前后加料
HandlerInterceptor<interface>:
void afterCompletion();
void postHandle();
booleanpreHandle();
5.HandlerMapping:
5.1 Help DispatcherServlet to get the right controller.
5.2 Wrap controller with HandlerInterceptor.
6.HandlerExecutionChain: Excution Chain(using reflaction)
HandlerInterceptor 包裹Controller
Excution Chain:preHandler-> Controller method ->postHandle->afterCompletion
7.ModelAndView:
ModelAndView(modle的具体表现,map可以实现model的功能,Model 和map都会转成ModelAndView)
8.ViewResolver:视图解析器
Help DispatcherServlet to Resolve the right View to render page
9.View:V in MVC Responsible for page rendering.
---2-2 Spring MVC的动态概念---------------------------------------------------------
1.粗体必须写的部分,斜体配置
2.
===3 Maven==================================================
3-1 Maven介绍
[Maven]Maven入门教程 http://www.cnblogs.com/jingmoxukong/p/5591368.html
maven核心,pom.xml详解(转) http://www.cnblogs.com/qq78292959/p/3711501.html
转-我的Maven POM配置 http://www.cnblogs.com/GarfieldTom/p/3707160.html
POM(Project Object Model):
An xml file(pom.xml)主要配置文件
Contains information:dependencies,developers,organization,licenses...
例子:
<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.garfield.gserver</groupId> <artifactId>GServer</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.0-beta9</version> </dependency> </dependencies> </project>
Dependency Management:
Dependency,transtive Dependency(传递依赖)
如·/WEB-INF/lib中引入的各种包
Coordinates(坐标):通过以下四个项标识groupId,artifactId,version,packaging
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<packaging></packaging>(缺省时,表示JAR包)
如:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>(非坐标项)
</dependency>
---3-2 Maven的安装---------------------------------------------------------------------------------------------------
1. 下载并解压Maven:
Maven.apache.org/download.cgi
2. 配置环境变量(M2_HOME,Path):
新建环境变量M2_HOME变量名M2_HOME,变量值(路径)
Path编辑添加"%M2_HOMEin;"(由于Path内容太长,把Path的内容粘贴到记事本里添加,再copy回去更方便)
检查是否配置好:1)cmd.exe
2)mun -version
3) 检查版本号是不是配置的
3. 配置Maven配置文件(本地仓库路径,镜像)见3-3
---3-3 Maven的配置---------------------------------------------------------------------------------------------------
Maven配置文件
路径 安装路径/conf/setting.xml文件拷贝到%HOME%.m2目录
(没创建过maven项目时,该目录不存在,手动创建,或者执行过Maven命令,系统自动创建之后再操作)
每次Maven升级之后,就不需要更改设置了,因为设置文件保存到了%HOME%.m2目录。
配置项:
1) <localRepository>,可选项,不配置时,默认为${user.home}/.m2/repository
<localRepository>C:xxxxxxxxxrepository</localRepository>
2) <mirrors>核心仓库的副本,按照官方推荐使用了英国的镜像。以后下载软件包就会从此下载,减低中心仓库负载,防止无法下载的情况发生
<mirror>
<id>UK</id>
<name>UK Central</name>
<url>http://uk.maven.org/maven2</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
---3-4 用Maven创建项目---------------------------------------------------------------------------------------------------
Eclipse继承Maven
1. 下载Eclipse(4.3 kepler,自带m2e),其他版本,搜索如何继承m2e插件
2. 配置Eclipse
Windows/Preference/Maven展开
-Installations Add安装的版本(点击Add,指向安装路径),勾选
-User Settings
确保“User Settings”里是%HOME%.m2目录的配置文件(配置过3-3的内容)
apply-ok
在cmd.exe执行下面的命令 创建Maven项目
-DartifactId=spring-mvc-study (根目录名称)
DarchetypeArtifactId:目录的类型
mvn archetype:generate -DgropId=imooc-arthur -DartifactId=spring-mvc-study -DarchetypeArtifactId=maven-archetype-webapp
命令必须在workspace 下imooc目录之下执行
如 PS C :Usersqxworkspaceimooc> mvn archetype:generate -DgropId=imooc-arthur -DartifactId=spring-mvc-study -DarchetypeArtifactId=maven-archetype-webapp
执行,有没有设的coordinate会提示使用默认,继续点击回车,知道提示创建完成
CMD迁移目录类似linux:
1.如果我们想访问c盘,那么我们需要在命令行中输入c:
2.从C:Documents and SettingsAdministrator>中返回到C盘根目录:如下图所示:我们只需要在命令行中输入cd..就可以返回上层目录
3.进入mm文件夹和mm文件夹下的nn文件夹和oo文件夹。 在命令行中输入cd mm即可访问mm文件夹。
总结
总结下:输入盘符 如C: 然后回车,相当于进了C盘(c盘一般进的是桌面目录)
输入 cd 目录名 然后回车(目录名是c盘中的一级目录名,也可为c盘中的目录路径)。如cd mm即是进入了mm文件夹。
3. Hello Spring MVC
---3-5 Hello Spring MVC---------------------------------------------------------------------------------------------------
Eclipse -工程向导栏(Navigator)-right click-Import-
Maven-Existing Maven Project-next- Root directory(Browse选择 创建的路径C :Usersqxworkspaceimoocspring-mvc-study pom.xml勾选)-Finish导入工程。
工程结构:src-main-webapp-WEB-INF-web.xml
工程-properties-Java build Path中 Java目录发生缺失-手动添加
手动做成java folder,与此类似,做测试时,可以添加test和test下的java和resources
2.pom.xml配置
2.1Packging默认为war 改为jar或其他喜欢的选项。
2.2 dependencies和dependencyManagement,plugins和pluginManagement有什么区别?
dependencyManagement是表示依赖jar包的声明,即你在项目中的dependencyManagement下声明了依赖,maven不会加载该依赖,dependencyManagement声明可以被继承。
dependencyManagement的一个使用案例是当有父子项目的时候,父项目中可以利用dependencyManagement声明子项目中需要用到的依赖jar包,之后,当某个或者某几个子项目需要加载该插件的时候,就可以在子项目中dependencies节点只配置 groupId 和 artifactId就可以完成插件的引用。
dependencyManagement主要是为了统一管理插件,确保所有子项目使用的插件版本保持一致,类似的还是plugins和pluginManagement。
2.3 pom.xml
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>imooc-arthur</groupId>
<artifactId>spring-mvc-study</artifactId>
<version>1.0.0-SNAPSHOT</version>
//1.添加变量,在工程量较大时,可以清晰的看到使用的软件包版本
<properties>
<commons-lang.version>2.6</commons-lang.version>
<slf4j.version>1.7.6</slf4j.version>
<spring.version>4.1.3.RELEASE</spring.version>
<jackson.version>2.5.4</jackson.version>
</properties>
//2.依赖管理,当依赖的包(如果SpringMVC依赖了Spring包,Hibernate也依赖了Spring包,当两个依赖的版本不一致时,使用依赖管理指定的版本)详见2.2
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
/* 3.依赖管理:<dependencies>内 构建任意多个依赖的软件包 由于在<dependencyManagement>中指明了spring包的版本,在 <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>中就不需要指定版本了*/
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons-lang.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
</dependencies>
//插件
<build>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.2.v20140723</version>
</plugin>
</plugins>
</build>
</project>
EL表达式取值:
<spring.version>4.1.3.RELEASE</spring.version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3. 配置完成后,创建web应用
3.1 web.xml
由于使用SpringMVC,配置DispatcherServlet
Spring MVC静态资源处理
采用<mvc:default-servlet-handler />
在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。
一般Web应用服务器默认的Servlet名称是"default",因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web应用服务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定:
<mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" />
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Spring MVC Study</display-name> <!-- Spring应用上下文, 理解层次化的ApplicationContext --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/configs/spring/applicationContext*.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <!-- DispatcherServlet, Spring MVC的核心 --> <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- DispatcherServlet对应的上下文配置, 默认为/WEB-INF/$servlet-name$-servlet.xml --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <!-- mvc-dispatcher拦截所有的请求--> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
mvc-dispatcher-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:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 本配置文件是工名为mvc-dispatcher的DispatcherServlet使用, 提供其相关的Spring MVC配置 --> <!-- 启用Spring基于annotation的DI, 使用户可以在Spring MVC中使用Spring的强大功能。
激活 @Required @Autowired,JSR 250's @PostConstruct, @PreDestroy and @Resource 等标注 --> <context:annotation-config /> <!-- 扩充了注解驱动,可以将请求参数绑定到控制器参数 --> <mvc:annotation-driven /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsps/" /> <property name="suffix" value=".jsp" /> </bean>
</beans>
controller:
package com.imooc.mvcdemo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; //告诉DispatcherServlet相关的容器, 这是一个Controller, 管理好这个bean哦 @Controller //类级别的RequestMapping,告诉DispatcherServlet由这个类负责处理以跟URL。 //HandlerMapping依靠这个标签来工作 @RequestMapping("/hello") public class HelloMvcController { //方法级别的RequestMapping, 限制并缩小了URL路径匹配,同类级别的标签协同工作,最终确定拦截到的URL由那个方法处理
//note: 拦截host:8080/hello/mvc
@RequestMapping("/mvc") public String helloMvc() { //视图渲染,/WEB-INF/jsps/home.jsp return "home"; } }
C:UserszhangxyDownloadsjavaspring-mvc-studysrcmainwebappWEB-INFjsps home.jsp
<%@ 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> Hello Spring MVC! Here is iMooc! </body> </html>
启动:
1 cmd.exe
2 spring-mvc-study根目录下 执行 mvn jetty:run (jetty:pom.xml中plugin的插件 提供一个运行的容器环境)
启动容器:
启动成功:
通过浏览器访问:
http://localhost:8080/hello/mvc页面访问成功