陈科肇-转载请注明出处,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>
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布局管理器了,好处是它可以使一些通用的元素(或页面)被页面所共享,从而达到元素的重用。
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>
<?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构架完成!
原文:http://blog.csdn.net/u013474104/article/details/43707459