Spring MVC之基于xml配置的web应用构建

6次阅读

共计 6834 个字符,预计需要花费 18 分钟才能阅读完成。

​> 更多 spring 博文参考:http://spring.hhui.top/
直接用 SpringBoot 构建 web 应用可以说非常非常简单了,在使用 SpringBoot 构建后端服务之前,一直用的是 Spring + SpringMVC 基于 xml 的配置方式来玩的,所以在正式进入 SpringBoot Web 篇之前,有必要看一下不用 SpringBoot 应该怎么玩的,也因此方便凸显 SpringBoot 的优越性
<!– more –>
I. Web 构建
1. 项目依赖
我们选择使用传统的 SpringMVC + Tomcat/Jetty 运行 war 包方式来运行任务,创建一个 maven 项目之后,先添加上基本的依赖
<artifactId>201-mvc-xml</artifactId>
<!– 注意这一行,我们指定 war 包 –>
<packaging>war</packaging>

<properties>
<spring.version>5.1.5.RELEASE</spring.version>
</properties>

<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
2. 项目结构
对于 web 项目,和我们传统的不一样的地方在于,会多一个 webapp 目录,在这个目录的 WEB-INF 文件夹下,会存有几个必要的配置文件

图中的三个目录,都属于比较重要的

java : 存放源码
resources: 项目资源文件存放地
webapp: web 的配置文件,资源文件默认存放地

3. 配置文件说明
java 和 resources 这两个目录没啥好说的,主要来看一下 webapp 下面的三个 xml 配置文件
a. web.xml
在我们使用 xml 配置的生态体系中,这个配置文件至关重要;本节说到 SpringMVC 构建的应用,是在 Servlet 的生态上玩耍的;而 web.xml 这个配置文件,比如我们常见的 Servlet 定义,filter 定义等等,都在这 xml 文件中
实例如下
<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns=”http://xmlns.jcp.org/xml/ns/javaee”
xsi:schemaLocation=”http://xmlns.jcp.org/xml/ns/javaee
http://java.sun.com/xml/ns/j2ee/web-app_3_1.xsd” version=”3.1″>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

<!– 解决乱码的问题 –>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<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>

<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>

<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
上面的配置中,定义了 DispatcherServlet 的名字为 mvc-dispatcher,根据规范,会有一个叫做 mvc-dispatcher-servlet.xml 的配置文件,其中的配置将应用于 DispatcherServlet 的上下文
b. mvc-dispatcher-servlet.xml
这个文件主要可以用来定义 Servlet 相关的配置信息,比如视图解析,资源路径指定等;一个最简单的配置如下
<beans xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns:aop=”http://www.springframework.org/schema/aop”
xmlns:context=”http://www.springframework.org/schema/context”
xmlns:beans=”http://www.springframework.org/schema/mvc”
xmlns=”http://www.springframework.org/schema/beans”
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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd”>

<!– 指定扫描的包路径,自动注册包含指定注解的对象到 Spring 容器,并包含了 context:annotation-config 的作用 –>
<context:component-scan base-package=”com.git.hui.spring”/>
</beans>
在 web.xml 中,context:component-scan 非常非常重要,用来指定自动扫描并注册 bean 到容器的包路径,上面这一行配置,简单来讲可以认为做了下面几件事情

扫描包 com.git.hui.spring 下所有的类,如果类上有 @Component, @Service, @Repository, @Contorller, @RestContorller, @Configuration 等注解,会实例化为 bean 对象,并注册到 Spring 容器中
其次就是实现 DI 的功能,实现 bean 的依赖注入

接下来看一下,如果不加上面这一行,也想实现对应的效果改怎样配置呢?
<!– 这个使用来激活注册的 Bean,简单来讲就是使 Ioc 工作起来 –>
<context:annotation-config/>

<bean name=”printServer” class=”com.git.hui.spring.PrintServer”/>
<bean name=”helloRest” class=”com.git.hui.spring.HelloRest”/>
源码后面会给出,首先是主动定义两个 bean,其中 helloRest 为 Controller,printServer 为一个 Service,并被注入到 helloRest 中
如果只定义了两个 bean,而不加上 <context:annotation-config/>,则 HelloRest 中的 printService 会是 null,演示如下图

此外,如果用了旧的 Spring 版本,直接用前面的配置,可能依然无法访问 web 服务,这个时候有必要加一下下面的注解; 对于使用 aop,希望使用 cglib 代理的,需要如下配置
<!– 支持 mvc 注解 –>
<mvc:annotation-driven/>

<!– 使用 cglib 实现切面代理 –>
<aop:aspectj-autoproxy proxy-target-class=”true”/>
额外说明:现在基本上不怎么用 xml 配置了,有更简单的注解方式,上面的配置内容了解即可
c. applicationContext.xml
前面的截图中,还有个配置文件,这个是干嘛的呢?
DispatchServlet 加载包含在 web 组件中的 bean(如 mapper,Controller,ViewResolver);我们应用中,还有些其他的 Spring Bean(比如其他 rpc 访问的服务 bean 代理,db 驱动组件等)则更多的是放在这个配置文件中定义
当然这个里面最简单的配置内容就是啥都没有,比如我们的 demo 工程
<beans xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns=”http://www.springframework.org/schema/beans”
xsi:schemaLocation=”http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd”>
</beans>
4. 实例代码
配置完了之后,我们简单的定义一个 reset 服务用来测试,比如一个简单 dean 对象和一个简单的 Controller
简单的 bean 对象
@Component
public class PrintServer {

public void print() {
System.out.println(System.currentTimeMillis());
}

}
Controller 如下
@RestController
public class HelloRest {

@Autowired
private PrintServer printServer;

@ResponseBody
@GetMapping(“hello”)
public String sayHello(HttpServletRequest request) {
printServer.print();
return “hello, ” + request.getParameter(“name”);
}
}
5. 测试
上面我们的 web 应用就搭建完毕了,然后就是把它部署起来,看下能不能愉快的玩耍了;我们有两个方法
方法一:tomcat 方式

打包 mvn clean package -DskipTests=true,然后 target 目录下会生成一个 war 包
将 war 包放在 tomcat 的 webapps 目录下,然后启动 tomcat 进行访问即可

方法二:jetty 方式
前面一种方式,有很多公司的服务是这么玩的,将服务达成 war 包丢到 tomcat 中,然后服务上线;然而在本地开发测试时,这样有点麻烦(当然可以通过 idea 配置 tomcat 调试法,个人感觉,依然麻烦)
我们使用 jetty 来玩耍就很简单了,首先在 pom 中添加配置,引入 jetty 插件
<build>
<finalName>web-mvc</finalName>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.12.RC2</version>
<configuration>
<httpConnector>
<port>8080</port>
</httpConnector>
</configuration>
</plugin>
</plugins>
</build>
然后启动方式可以使用命令: mvn jetty:run,也可以使用 idea,如下,直接双击运行或者右键选择 debug 模式启动

然后我们愉快的启动测试过程如下

到此,一个基于 Spring + SpringMVC + Jetty + xml 配置的 web 应用就搭建起来了;下一篇我们将讲一下,纯 java 注解方式,抛弃 xml 配置又可以怎样搭建一个 web 应用
II. 其他
– 系列博文
web 系列:
Spring Web 系列博文汇总
mvc 应用搭建篇:

190316-Spring MVC 之基于 xml 配置的 web 应用构建
190317-Spring MVC 之基于 java config 无 xml 配置的 web 应用构建

0. 项目

工程:https://github.com/liuyueyi/spring-boot-demo

项目: https://github.com/liuyueyi/spring-boot-demo/blob/master/spring/201-mvc-xml

1. 一灰灰 Blog

一灰灰 Blog 个人博客 https://blog.hhui.top

一灰灰 Blog-Spring 专题博客 http://spring.hhui.top

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激

微博地址: 小灰灰 Blog

QQ:一灰灰 /3302797840

3. 扫描关注
一灰灰 blog

知识星球

正文完
 0