DispatcherServlet

虽然和教程里的运行结果一样,但是很多地方我不理解,所以下面的代码里很可能有错误的地方
web.xml
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <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> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
------------------------------------------------------------------------------------------
mvc-dispatcher-servlet
<?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-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:annotation-config/> <!-- 让DispatcherServelt上下文只搜索@Controller标注的类,不搜索其他标注的类 --> <context:component-scan base-package="com.imooc.mvcdemo.controller" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <mvc:annotation-driven /> <!-- viewResolver --> <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>
---------------------------------------------------------------------------------------------
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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.how2java</groupId>
<artifactId>springmvc2021071501</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springmvc2021071501 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring.version}</version>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.43</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0-b07</version>
</dependency>
<dependency>
<groupId>apache-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.1</version>
<type>pom.lastUpdated</type>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.0.M1</version>
<type>maven-plugin</type>
</dependency>
</dependencies>
<build>
<finalName>springmvc2021071501</finalName>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.0.M1</version>
</plugin>
</plugins>
</build>
</project>------------------------------------------------------------------------------------------
文件位置:

jetty 插件为我们提供了一个运行的容器环境。
使用Maven创建Spring MVC的环境(将在命令行创建好的Maven项目导入)
问题:项目的build path里Order and Export发现目录缺失,可以手动添加缺失的目录,根据目录的缺少情况。
【一】pom配置
第一项配置:jar包版本配置——如果工程依赖比较复杂、且比较大的情况下,可以添加标签来设置需要用到的jar包版本,这样就可以清晰的理解我们所使用的依赖软件包的版本。

第二项目配置:引用jar包版本配置——依赖管理是Maven中比较核心的配置,因为Maven可以管理一些传递的依赖,比如SpirngMVC依赖了Spring的包,而Hibernate也用到了Spring的包,当这两个依赖Spring版本不一样的时候,依赖管理就发生了作用,依赖管理可以使用指定版本的Spring,这里是4.1.3.RELEASE版本,该项目中所依赖的Spring文件都将以该版本为例。

第三项配置:依赖管理——Maven提供依赖管理,项目所依赖的jar包都存在<dependencies>标签里,可以为我们构建任意多个依赖的软件包,因为在 <properties>指明了Spring所有相关的版本,所以<dependencies><dependency>就不需要指明它的版本了。
第四项配置:插件配置——提供了额外功能,比如jetty,可以用它来测试和部署,但是和项目本身应用没有很大关联。
【二】web.xml配置
将DispatcherServlet配置到Web环境:通过<servlet>和<servlet-mapping>标签,这里最关键的属性是<servlet-name>,该标签的name可以自定义,但它关系到默认的配置文件,如果不做任何其它配置(比如init-param),Spring就将在默认位置,默认的文件名来加载SpringMVC的配置文件(Spring会默认加载WEB-IN下的mvc-dispatcher-servlet.xml),如下图蓝色字体,也可以通过<init-param>改变该参数,所以要在WEB-INF创建configs——>spring,并在spring文件夹下创建DispatcherServlet创建它对应的上下文环境。

【三】SpringMVC配置文件(mvc-dispatcher-servlet.xml)
第一项配置:Spring的applicationContext激活对标签支持的一些生命周期的管理,所以它可以识别用标签配置的Bean的声明。

第二项配置:DispatcherServlet上下文里只搜索带有@Controller标注的类,SpringMVC让控制器(Controller)和请求之间发生联系,并且做一些相应的操作

第三项配置:DispatherServlet启用基于annotation的HandlerMapping,通过如下图完成

第四项配置:配置ViewResolver,通过它通知DispatcherServlet分发给那个View,只需要配置一个前缀和一个后缀,就可以将这些东西拼接成某个JSP文件,这里存放JSP文件是在WEB-INF/jsps文件夹下,所以要创建该文件夹。

Controller类的编写:名为HelloMvcController,并且包必须在管理Controller标签路径里,并且让Spring知道这是一个Controller所以需要在类上添加@Controller,并且通知SpringMVC映射到哪一个URL路径,通过@RequestMapping(/hello")拦截根目录下的hello,并且编写一个方法返回一个字符串,并在方法上添加注解@RequestMapping("/mvc")如图。
该Controller会响应host:8080/hello/mvc的一个url,这就是SpirngMVC运行的方式,请求和Controller之间的映射,它就会返回到home.jsp,所以在jsps中创建home.jsp。
命令行中:进入项目的目录,查看目录中是否有pom,输入mvn jetty:run,提供一个运行的容器环境,运行后maven就会解析所有的依赖等等,当看到Start Jetty Server说明Maven已经成功启动了,这里使用了默认的端口号8080,浏览器访问:http://localhost:8080/hello/mvc,结果就会跳转到相应页面。



拓展:使用Eclipse导入项目时遇到No projects are found to import提示的解决办法https://blog.csdn.net/ancientear/article/details/86772425。
网页503,可能是 mvc.xml中 包名未填写正确,按视频添加HelloMVCController,正确的包名如下
<context:component-scan base-package="com.imooc.mvcdemo.controller" use-default-filters="false">
1.<dependencyManagement>标签指定所有spring依赖包版本都是4.1.3.RELEASE
2.public String helloMVC(){
return "home";
}
指helloMVC这个方法返回到home.jsp
3.web.xml中配置前端控制器DispatcherServlet,与配置普通的servlet方法类似。
4. <init-param>//初始化参数。
<param-name>contextConfigLocation</param-name>//参数名称为contextConfigLocation,如果没有这个参数,Spring默认加载web-inf/applicationContext.xml文件。
<param-value>/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml</param-value>
//contextConfigLocation参数指定了要装入的spring配置文件为mvc-dispatcher-servlet.xml
手动添加java目录
mvn控制依赖的版本

web.xml配置

spring.xml 配置文件

jtty


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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>imcc-zyh</groupId>
<artifactId>spring-mvc-demo</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>spring-mvc-demo Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<commons-lang.version>2.6</commons-lang.version>
<slf4j.version>1.7.6</slf4j.version>
<spring.version>4.1.3.RELEASE</spring.version>
</properties>
<!-- 依赖管理, 管理传递依赖, 比如两个工程依赖的spring 包版本不一致, 可以通过依赖管理来指定 -->
<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>
<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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.2.v20140723</version>
</plugin>
</plugins>
</build>
</project>
使用Maven创建Spring MVC的环境(将在命令行创建好的Maven项目导入)
问题:项目的build path里Order and Export发现目录缺失,可以手动添加缺失的目录,根据目录的缺少情况。
【一】pom配置
第一项配置:jar包版本配置——如果工程依赖比较复杂、且比较大的情况下,可以添加标签来设置需要用到的jar包版本,这样就可以清晰的理解我们所使用的依赖软件包的版本。

第二项目配置:引用jar包版本配置——依赖管理是Maven中比较核心的配置,因为Maven可以管理一些传递的依赖,比如SpirngMVC依赖了Spring的包,而Hibernate也用到了Spring的包,当这两个依赖Spring版本不一样的时候,依赖管理就发生了作用,依赖管理可以使用指定版本的Spring,这里是4.1.3.RELEASE版本,该项目中所依赖的Spring文件都将以该版本为例。

第三项配置:依赖管理——Maven提供依赖管理,项目所依赖的jar包都存在<dependencies>标签里,可以为我们构建任意多个依赖的软件包,因为在 <properties>指明了Spring所有相关的版本,所以<dependencies><dependency>就不需要指明它的版本了。
第四项配置:插件配置——提供了额外功能,比如jetty,可以用它来测试和部署,但是和项目本身应用没有很大关联。
【二】web.xml配置
将DispatcherServlet配置到Web环境:通过<servlet>和<servlet-mapping>标签,这里最关键的属性是<servlet-name>,该标签的name可以自定义,但它关系到默认的配置文件,如果不做任何其它配置(比如init-param),Spring就将在默认位置,默认的文件名来加载SpringMVC的配置文件(Spring会默认加载WEB-IN下的mvc-dispatcher-servlet.xml),如下图蓝色字体,也可以通过<init-param>改变该参数,所以要在WEB-INF创建configs——>spring,并在spring文件夹下创建DispatcherServlet创建它对应的上下文环境。

【三】SpringMVC配置文件(mvc-dispatcher-servlet.xml)
第一项配置:Spring的applicationContext激活对标签支持的一些生命周期的管理,所以它可以识别用标签配置的Bean的声明。

第二项配置:DispatcherServlet上下文里只搜索带有@Controller标注的类,SpringMVC让控制器(Controller)和请求之间发生联系,并且做一些相应的操作

第三项配置:DispatherServlet启用基于annotation的HandlerMapping,通过如下图完成

第四项配置:配置ViewResolver,通过它通知DispatcherServlet分发给那个View,只需要配置一个前缀和一个后缀,就可以将这些东西拼接成某个JSP文件,这里存放JSP文件是在WEB-INF/jsps文件夹下,所以要创建该文件夹。

Controller类的编写:名为HelloMvcController,并且包必须在管理Controller标签路径里,并且让Spring知道这是一个Controller所以需要在类上添加@Controller,并且通知SpringMVC映射到哪一个URL路径,通过@RequestMapping(/hello")拦截根目录下的hello,并且编写一个方法返回一个字符串,并在方法上添加注解@RequestMapping("/mvc")如图。
该Controller会响应host:8080/hello/mvc的一个url,这就是SpirngMVC运行的方式,请求和Controller之间的映射,它就会返回到home.jsp,所以在jsps中创建home.jsp。
命令行中:进入项目的目录,查看目录中是否有pom,输入mvn jetty:run,提供一个运行的容器环境,运行后maven就会解析所有的依赖等等,当看到Start Jetty Server说明Maven已经成功启动了,这里使用了默认的端口号8080,浏览器访问:http://localhost:8080/hello/mvc,结果就会跳转到相应页面。



拓展:使用Eclipse导入项目时遇到No projects are found to import提示的解决办法https://blog.csdn.net/ancientear/article/details/86772425。
mvn archetype:generate -DgroupId=itanken-arthur -DartifactId=spring-mvc-study -DarchetypeArtifactId=maven-archetype-webapp
<servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframeword.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/configs/spring/mvc-disppatcher-servlet.xml</param-value> </init-param> </servlet>
配置web.xml
pom.xml文件
<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> <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> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <finalName>testWebMaven</finalName> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </build>web.xml文件
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <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> <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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" 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"> <!-- 扫描注解 --> <context:component-scan base-package="com.imooc.mvc"></context:component-scan> <!-- 注解驱动 --> <mvc:annotation-driven></mvc:annotation-driven> <!-- 过滤静态资源 --> <mvc:resources location="/imags/" mapping="/imags/**"></mvc:resources> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/configs/jsps/"/> <property name="suffix" value=".jsp"/> </bean></beans>
web.xml配置
五、搭建项目
1、pom文件配置
a)配置变量:<properties>中配置依赖jar包的版本号、WebService地址、文件目录、定时任务周期等需要用到的变量信息。这样配置后,properties文件中的变量值可以通过${propertiesName}来替代,maven打包时,可以将真实的值打进jar包或war包中。
b)配置依赖管理 :<dependencyManagement>的作用其实相当于一个对所依赖jar包进行版本管理的管理器。pom.xml文件中,jar的版本判断的两种途径:
1)如果dependencies里的dependency自己没有声明version元素,那么maven就会到dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,如果有,就继承它,如果没有就会报错,告诉你必须为dependency声明一个version
2)如果dependencies中的dependency声明了version,那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的version为准。
c)配置依赖的jar包:<dependencies>标签下配置依赖的jar包,groupId,artfactId,version是三个基本的依赖坐标,不可缺少。groupId------包名(一般为域名的反写)
artfactId------项目名
version-------版本
d)配置插件信息:比如提供测试环境的jetty,配置这个插件,可以通过命令 mvn jetty:run来启动测试环境。
一、搭建Spring MVC项目
1、web.xml配置
2、SpringMVC配置
mvc-dispatcher-servlet.xml (2)
mvc-dispatcher-servlet.xml (1)
web.xml <servlet>标签
org.eclipse.jetty(jetty插件)
web.xml配置
-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-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config></context:annotation-config>
<!-- 注解扫描 -->
<context:component-scan base-package="com.mvcdemo">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<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/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
前面maven环境配好后,直接在eclipse中可以新建一个maven项目,不用命令行,而且可以自己指定目录:
网址参考:http://blog.csdn.net/big_bigwolf/article/details/52879911
http://www.yiibai.com/maven/create-a-maven-web-project-with-eclipse.html
http://blog.csdn.net/dream_ll/article/details/52198656
返回jsp配置
mvn jetty
mvc.xml
pom.xml
pom.xml
-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-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config></context:annotation-config>
<!-- 注解扫描 -->
<context:component-scan base-package="com.mvcdemo">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<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/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>