首页 > 编程语言 > 详细

使用Spring MVC搭建WEB应用框架-完成案例

时间:2015-03-10 23:17:24      阅读:528      评论:0      收藏:0      [点我收藏+]

陈科肇-转载请注明出处,http://blog.csdn.net/u013474104/article/details/43707459

============

1.简介

首先Spring MVC是基于三个层面来开发的,那三个层面呢?

M(model) - 模型层,控制器完成逻辑处理后,通常会产生一些信息,而这些信息需要返回给用户并在浏览器上显示的,我们把这些信息称为模型;

V(view) - 视图层,我们使用JSP作为视图层,通过视图能使这些模型数据渲染输出,并通过这个输出响应的对你传递给客户端;

C(controller) - 控制层,从用户提交请求开始,这些请求都会通过一个前端控制器Servlet,然后经过前端控制器Servlet的解析,再将用户请求指定到某一个特定的控制器,即控制层。

三个层的关系:用户提交请求,经前端控制器Servlet解析,再指定控制器,当控制器处理逻辑信息后,返回模型数据,然后再经指定的视图把模型数据渲染输出,终于呈现给客户端,即用户。

2.引入spring mvc jar包

因为我之前的文章介绍过Maven的使用(项目是用Maven搭建的),我们这里就使用Maven的依赖来关联下载spring的jar包吧。

如果不知道怎么来配置依赖的话,进入网址:http://mvnrepository.com/ ,这里提供jar包依赖的查询等。

首先,搜索需要的,如图:

技术分享

下面还有一大堆相关的列表,找到我们需要的或者你可以输入命名搜索会更快

技术分享

点击进去,选择版本

技术分享

点击进去,把依赖复制出来到你的pom.xml中,即可

技术分享

pom.xml配置:

<project>
...
<!-- 定义属性,供${propertieName}访问 -->
  <properties>
  	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  	<spring.version>4.1.3.RELEASE</spring.version>
  </properties>
  <!-- 依赖关联 -->
  <dependencies>
  	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-webmvc</artifactId>
		<version>${spring.version}</version>
	</dependency>
  </dependencies>
...
</project>

完之后,执行pom.xml update

技术分享

看,相关联的jar都会下载到本地仓库,这就是使用Maven的好处!

3.配置一个前端控制器Servlet

Spring MVC中,所有的请求的必经之路为一个前端控制器Servlet,即DispatcherServlet,它是Spring MVC的核心。

DispatcherServlet必须在Web应用程序的web.xml文件中进行配置,配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app...>
...
<!-- spring mvc 前端控制器 -->
  	<servlet>
		<servlet-name>wwo</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>
                            classpath:conf/wwo-servlet.xml
                        </param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>wwo</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
...
</web-app>

DispatcherServlet的目的既是为了根据一个XML文件来加载其配置到Spring应用上下文中,xml文件的命名方式是默认通过<servlet-name>来指定的XML的文件名,即我们常见的${<servlet-name>}-servlet.xml,如上述例子xml文件命名为:wwo-servlet.xml(默认路径位于应用程序的WEB-INF目录下)。通常我们spring的配置文件可以分成多个XML文件,一个用于服务层,一个用于持久层还有一个用于数据源配置。那怎么办呢?

spring 为我提供了一个ContextLoaderListener,它是一个Servlet监听器,我们只需将ContextLoaderListener配置于web.xml文件里即可,配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
...
<!-- spring监听器 -->
  <listener>
  	<listener-class>
  		org.springframework.web.context.ContextLoaderListener
  	</listener-class>
  </listener>
...
</web-app>
但,一般这样配置监听器的话,它会默认去加载/WEB-INF/applicationContext.xml这个spring配置文件。

如果我们要指定spring配置文件的名字或加载多个spring xml配置文件的话,我们需要这样配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
...
<!-- spring监听器 -->
  <listener>
  	<listener-class>
  		org.springframework.web.context.ContextLoaderListener
  	</listener-class>
  </listener>
  <!-- 指定监听器加载指定的spring xml配置文件 -->
  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<!-- 分别对应的是数据源、服务层、持久层、安全 -->
  	<param-value>
  		classpath:conf/dataSource-context.xml
  		classpath:conf/service-context.xml
  		classpath:conf/persistence-context.xml
  		/WEB-INF/wwo-security.xml
  	</param-value>
  </context-param>
...
</web-app>


好了,这样spring的xml配置文件就分得很清楚了!

但是,这里有个问题,就是所有的请求都经过这个监听器,包括对静态资源的请求,问题就在这。如果是静态资源,怎么办呢?

显示我们还要对所谓的静态资源进行处理,spring为我们提供了<mvc:resources>元素可以处理这个问题,service-context.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"
	xsi:schemaLocation="
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

	<!-- 对静态资源的处理 -->
	<mvc:resources 
		location="/JScript/**" 
		mapping="/JScript/" />
</beans>

这样就对URL包含/JScript/的请求,即对应位于/JScript/下的所以资源来进行特别处理!

注:关于DispatcherServlet与ContextLoaderListener解释请参阅:http://blog.csdn.net/u013474104/article/details/44086811

4.配置注解驱动的Spring MVC

好了,不多说!现在spring已经大部分能使用注释来代替从前要在配置文件里所做的事,接下来我们大部分会使用注释方式来完成。

a.定义控制器

DispatcherServlet需要咨询一个或多个处理器来明确地将请求分发给那个控制器。Spring提供了许多处理器映射实现,那我们只需要DefaultAnnotationHandlerMapping来实现即可。

DefaultAnnotationHandlerMapping:将请求映射给使用@requestMapping注解的控制器和控制器方法。

首先要作用注解,你必需把注解的类及方法等加载到上下文应用中,即spring容器,才能使用!

我们需要在配置文件中加上以下配置,即可实现注解功能:

<beans>
	...
	<!-- 扫描<span style="font-family: Arial, Helvetica, sans-serif;">指定包下的</span><span style="font-family: Arial, Helvetica, sans-serif;">注解 --></span>
	<context:component-scan base-package="com.blog">
		<!-- 配置组件过滤器 -->
		<!-- 指定扫描的包 -->
		<context:include-filter type="annotation" expression="com.blog.controller"/>
		<!-- 指定不需要扫描的包 -->
		<context:exclude-filter type="annotation" expression="com.blog.dao"/>
	</context:component-scan>
	...
</beans>

注:上面只是为了举例说明

下面配置基本也够用了,如果不是特别要求:

<beans>
...
<!-- 扫描指定包下的注解 -->
	<context:component-scan base-package="com.blog"/>
...
</beans>
说明:

默认情况下,<context:component-scan>查找使用构造型注解所标注的类,这些特殊的注解如下:

@Component -- 通用的构造型注解,标识该类为Spring组件;

@Controller -- 标识将该类定义为Spring MVC controller;

@Repository -- 标识将该类定义为数据仓库;

@Service -- 标识将该类定义为服务;

使用@component标注的任意自定义注解。

一般为好区分某类属于控制、数据库访问和业务层,会分别使用对应的注解@Controller、@Repository和@Service,而尽量少用@Component,@Component是通用的!

接下来我们可以声明一个登录到主页面(或首页)的控制器:

先把 spring mvc切换到3.x版本的jar吧,之前用的是4.x以上的。

这是因为4.x的注解可能与3.x有点差别,而本例子注重的是3.x版本的开发。

切换配置:

<project>
...
<!-- 定义属性,供${propertieName}访问 -->
  <properties>
  	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  	<spring.version>3.2.13.RELEASE</spring.version>
  </properties>
...
</project>

b.渲染视图

--通过上述的控制器去调用对应的业务层后,然后要将处理的结果告知用户时,我们需要对视图进行渲染,从而显示在客户端上即可!

wwo-servlet.xml文件中配置的代码如下:

<!-- 
		原理:逻辑视图名通过添加前缀后缀来确定要视图路径
		解析视图,因jsp视图使用了jstl标签,
		所以需要通过设置viewClass属于来将InternalResourceViewResolver替换为JstlView -->
	
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
		<property name="prefix" value="/"/>
		<property name="suffix" value=".jsp"/>
	</bean>
	
上面是我常用渲染视图的配置方法,但我们接下讲的是通过Apache Tiles布局管理器来渲染!

Apache Tiles:对于一般的web应用程序,InternalResourceViewResolver视图基本够用了。但对于一些复杂的web应用,就应该使用Apache Tiles布局管理器了,好处是它可以使一些通用的元素(或页面)被页面所共享,从而达到元素的重用。

官方网址:http://tiles.apache.org/

wwo-servlet.xml文件中配置的代码如下:

<!-- 
		Apache Tiles 代替 JstlView
		要是希望一些通用的元素被页面共享,则可以使用Apache Tiles布局管理器。
		通过Spring MVC配置解析Tiles的布局视图!
		建立视图解析器:TilesViewResolver;
		加载Tiles的定义:TilesConfigurer;
		由TilesConfigurer加载tiles定义,并使用TilesViewResolver解析视图。
		views.xml为tiles的定义文件,它们都分散在/WEB-INF/views/目录下;
		/WEB-INF/views/**/views.xml:**,查找/WEB-INF/views/目录下的所以views.xml文件
	 -->
	 <bean class="org.springframework.web.servlet.view.tiles2.TilesViewResolver"/>
	 <bean class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
	 	<property name="definitions">
	 		<list>
	 			<value>/WEB-INF/main-tiles/main-tiles.xml</value>
	 		</list>
	 	</property>
	 </bean>

我们再来看看/WEB-INF/main-tiles/main-titles.xml文件的配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC 
	"-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
	"http://tiles.apache.org/dtds/tiles-config_2_1.dtd">

<tiles-definitions>
	<!-- 
		定义通用的布局
	 -->
	<definition name="template" template="/blog/main/main_template.jsp">
		<put-attribute name="top" value="/blog/main/title.jsp"/>
	</definition>
	<!-- 
		定义main的tiles
	 -->
	<definition name="main" extends="template">
		<put-attribute name="content" value="/blog/main/main.jsp"/>
	</definition>
</tiles-definitions>

注:这里definition标签的属性name是对应控制层,return返回的逻辑视图名。

再下来,看在main_template.jsp中怎么来配置使用,来达到重用的目的的。

也就是说,main_template.jsp可以由若干个.jsp页面组成!

main_template.jsp文件:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="t" uri="http://tiles.apache.org/tags-tiles" %>
<!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>
<style type="text/css">
	body{
		background-color: rgb(95, 2, 2);
	}
</style>
</head>
<body>
	<t:insertAttribute name="top"/>
	<t:insertAttribute name="content"/>
</body>
</html>
好了,我们可以看到要使用tags-tiles的标签库来达到目的!

效果:

main_template.jsp显示的页面:

技术分享

title.jsp显示的页面:

技术分享

main.jsp显示的页面:

技术分享

好了,到此Spring MVC构架完成!


使用Spring MVC搭建WEB应用框架-完成案例

原文:http://blog.csdn.net/u013474104/article/details/43707459

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!