Spring 4.2.4.RELEASE MVC 学习笔记
从这开始,进入Spring4.2.4的学习,由于使用maven构建的项目,所以项目中pom.xml优先介绍一下。
先看一下framework_spring项目的最初项目目录。
在看看maven的pom.xml文件。
pom.xml
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<!-- 因为是 _total项目的子项目 -->
<groupId>cn.vfire.frameword</groupId>
<artifactId>total</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>framework_spring</artifactId>
<packaging>war</packaging>
<name>framework_spring Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<!-- 导入junit jar包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- 导入jsp servlet规范jar包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
</dependencies>
<build>
<finalName>framework_spring</finalName>
<!-- 修改maven编译输出目录 -->
<outputDirectory>src/main/webapp/WEB-INF/classes</outputDirectory>
<testOutputDirectory>src/main/webapp/WEB-INF/classes</testOutputDirectory>
<plugins>
<!-- 添加一个mavne的插件,作用是在我通过maven发布的时候,能将依赖的jar复制一份到我指定的目录下。(个人比较懒) -->
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>copy-lib-src-webapps</id>
<phase>package</phase>
<configuration>
<tasks>
<delete dir="src/main/webapp/WEB-INF/lib" />
<copy todir="src/main/webapp/WEB-INF/lib">
<fileset dir="${project.build.directory}\${project.build.finalName}\WEB-INF\lib">
<include name="*" />
</fileset>
</copy>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
引入Spring jar包
使用maven构建项目,最方便的还是项目依赖jar的管理。看一下pom.xml文件引入spring jar包。在pom.xml文件中追加如下代码。
<!-- 导入spring框架依赖jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<!-- 该jar用于spring 支持 junit测试 -->
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<!-- 该jar用于spring对其他的一些工具框架的支持 -->
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
在pom.xml中追加上面引入jar的代码后,maven会从远程服务器上自动下载所有依赖包,包括依赖包的对应依赖的版本,这点真是太方便了。看一下项目目录结构,重点看maven dependencies下面的依赖包。
配置Spring
Spring的依赖jar引入完成后,需要对项目做一些spring配置。
1、修改web.xml配置spring
首先需要在项目web.xml中追加引入spring、spring mvc的配置代码。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="framework.spring" version="2.5">
<display-name>framework_spring</display-name>
<!-- 加载Spring容器配置,设置Spring容器加载配置文件路径 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring/applicationContext-spring-*.xml</param-value>
</context-param>
<!-- Spirng 全局请求字符集过滤器 -->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置spring mvc 支持 -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring/spring-mvc-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2、创建spring自身的配置文件
在上面web.xml中,已经看到在配置引入spring的时候,有两个地方是指定spring框架自身需要配置文件路径,使用通配符的形式。所以接下来就是创建spring最重要的xml配置。
###classpath:相对路径,意思是从web发布目录的WEB-INFO/class/**下面开始。
###需要对照web.xml中描述的路径去创建对应目录和文件。
classpath:config/spring/applicationContext-spring-*.xml
classpath:config/spring/spring-mvc-*.xml
applicationContext-spring-config.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:p="http://www.springframework.org/schema/p"
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-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
</beans>
spring-mvc-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:p="http://www.springframework.org/schema/p" 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-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
<!-- 开启spring 上下文注解支持 -->
<context:annotation-config />
<!-- 把标记了@Controller注解的类转换为bean -->
<context:component-scan base-package="cn.vfire.framework" />
<!-- 开启spring mvc注解支持 -->
<mvc:annotation-driven />
<!-- 如果当前请求为“/”时,则转发到“/helloworld/index” -->
<mvc:view-controller path="/" view-name="forward:/index.jsp" />
<!-- 设置默认的Servlet来响应静态文件 -->
<mvc:resources mapping="/resource" location="/resource" />
<!-- 当上面要访问的静态资源不包括在上面的配置中时,则根据此配置来访问 -->
<mvc:default-servlet-handler />
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<!-- 默认视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="contentType" value="text/html" />
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
3、构造Spring Controller 请求处理器
根据上面的spring mvc xml配置说明,创建cn.vfire.framework包,请看一下项目目录。
HelloWorldController.java
package cn.vfire.framework.spring.mvc.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
@RestController
public class HelloWorldController {
@RequestMapping("/index.html")
public ModelAndView index() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message", "Hello World!");
modelAndView.setViewName("index");
return modelAndView;
}
}
/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试页面</title>
</head>
<body>
<div>${message}</div>
</body>
</html>
4、发布项目测试Spring mvc
到这里,一个最简单的Spirng mvc框架搭建完成,我们可以通过浏览器输入url进行访问。
URL
http://127.0.0.1:8000/index.html 这里URL对应HelloWorldController类中的index()方法上面的@RequestMapping("/index.html")注解描述的URI地址“/index.html”。
HelloWorldController.index()接受到请求后,通过返回ModelAndView类型的对象ViewName属性值找到视图层的返回页面/index.jsp。
之所以Controller知道ModelAndView.ViewName属性指定值“index”(setViewName("index")方法设置),就能返回“/index.jsp”页面的,那是因为在“spring-mvc-servlet.xml”配置文件中,配置了默认的视图解析规则。
5、测试
在项目中,我们往往对URL的请求有多样化的需求,那么上面的形式是否满足呢?下面做一些简单测试。
在HelloWorldController追加两个请求处理映射。
package cn.vfire.framework.spring.mvc.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
@RestController
public class HelloWorldController {
/**
* 返回视图对象
* @return
*/
@RequestMapping("/a/index.html")
public ModelAndView index() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message", "Hello World!");
modelAndView.setViewName("index");
return modelAndView;
}
/**
* 返回字符串
* @return
*/
@RequestMapping("/a/index.txt")
public String index_str() {
return "index";
}
/**
* 返回对象
* @return
*/
@RequestMapping("/a/index.json")
public Map<String, String> index_json() {
Map<String, String> m = new HashMap<String, String>();
m.put("name", "小名");
m.put("age", "13");
return m;
}
}
下面分别对上面请求映射做访问测试,测试结果如下。
URL | 结果 | 截图 |
---|---|---|
http://127.0.0.1:8000/a/index.html | 成功返回指定页面 | |
http://127.0.0.1:8000/a/index.txt | 成功,但是返回的字符串 | |
http://127.0.0.1:8000/a/index.json | 500服务器处理异常 |