Spring MVC 初体验

相信很多搞过Java的人都用过 Struts,或者转到用 Spring 框架后使用的仍然是Struts提供的MVC,那么是否想更多了解一下 Spring 本身的 MVC 呢,其实 Spring 的 MVC 还是很不错的,它×?Struts 中好的东西,还集 WebWork 的拦截器,下面来让我对 Spring MVC 作一个最简单的体验。 


称之谓简单是我觉得要去体验 Spring 的 MVC 的这个例子已经是精小到极致了,应用中没有配置ContextLoaderServlet或者ContextLoaderListener。借鉴于 Struts 的概念,这个实例中的的请求处理过程依次是/helloSpring.unmi->helloSpringController->helloSping.jsp) ,比如通过地址 http://localhost:8080/spring/helloSpring.unmi 访问,在基本Spring 的 Web容器收到这个请求,会通过 DispatcherServlet 根据配置的 Mapping 派发给 helloSpringController 处理,然后通知视图 helloSpring.jsp 显示结果。 

下面逐个介绍能演示这一过程的四个文件 

1. web.xml (不用说也知道是放在哪里的) 
 1<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
 2       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3       xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 4       http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 5
 6   <servlet>
 7      <servlet-name>UnmiServlet</servlet-name>
 8      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 9      <load-on-startup>1</load-on-startup>
10   </servlet>
11
12   <servlet-mapping>
13      <servlet-name>UnmiServlet</servlet-name>
14      <url-pattern>*.unmi</url-pattern>
15   </servlet-mapping>
16
17   <jsp-config>
18      <taglib>
19         <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
20         <taglib-location>/WEB-INF/tld/c.tld</taglib-location>
21      </taglib>
22   </jsp-config>
23</web-app>

 说明:配置了一个 DispatcherServlet 用来处理后缀为 unmi 的请求,后缀随便定义,如果想仿照着 Struts, 你也可以命作 *.do。还配置了要使用 jstl的核心标签库。 

2. UnmiServlet-servlet.xml(这个文件也是放在/WEB-INF/下的) 
 1<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
 2
 3<beans>
 4
 5   <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
 6      <property name="prefix" value="/" />
 7      <property name="suffix" value=".jsp" />
 8   </bean>
 9
10   <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
11      <property name="mappings">
12         <props>
13            <prop key="/helloSpring.unmi">helloSpringController</prop>
14         </props>
15      </property>
16   </bean>
17
18   <bean id="helloSpringController" class="com.unmi.HelloSpringController">
19   </bean>
20
21</beans>

这个文件为什么要命作 UnmiServlet-servlet.xml 呢?因为 web.xml 中配置了 DispatcherServlet 查找的默认 Spring Bean 配置文件就是指定的 servlet-name UnmiServlet + "-servlet.xml", 其中配置了最基本的三个 bean, 分别 

视图解析器:告诉从 Controller return 的 ModelAndView 去找哪个视图处理显示。这里的配置是在 WEB 应用路径下找相对应后缀为 jsp 的页面来处理,由下面的 HelloSpringController 可知道会要求 helloSpring.jsp 来显示内容。 

处理映射配置:标示匹配模式的 URL 将发给相应的控制器来处理,相当于 Struts 的 ActionMapping 配置项,也可配置多项。这里告诉 Web 容器,/helloSpring.unmi 的请求交给 helloSpringController 来处理。 

3. HelloSpringController.java (放到它该呆的 Package中) 
 1package com.unmi;
 2
 3importorg.springframework.web.servlet.mvc.Controller;
 4importorg.springframework.web.servlet.ModelAndView;
 5
 6importjavax.servlet.http.HttpServletRequest;
 7importjavax.servlet.http.HttpServletResponse;
 8
 9publicclassHelloSpringController implementsController {
10
11   publicModelAndView handleRequest(HttpServletRequest request,
12         HttpServletResponse response)throwsException{
13
14      request.setAttribute("helloSpring", "Hello, Spring!");
15
16      returnnewModelAndView("helloSpring");
17   }
18
19}

说明:往 request 中设置属性待视图显示,最后返回一个 ModelAndView, 逻辑名为 helloSpring, 依据前面配置 UnmiServlet-servlet.xml 的视图解析器会找到 /helloSpring.jsp 来显示。 

4. helloSpring.jsp (放在 WEB 应用的根目录下) 
 1<html>
 2<head>
 3   <title>Hello Spring!</title>
 4</head>
 5<body>
 6
 7   <h1>${helloSpring}</h1>
 8
 9</body>
10</html>

说明:JSP 使用 jstl 当成一个显示模板来用,用 EL 标记把 request 中的 helloSpring 属性显示出来。 

最后稍加几句,因为本文的读者群是对 Java 并且至少对一种 MVC 框架比较熟悉,对 Spring 稍有常识的人员,所以没解释的太细,比如上面用到的 spring, jstl库,以及tld文件应该要知道需加在什么地方。好啦,确定配置完妥无误时,部署到 Web 容器中,通过形如这样的地址 http://localhost:8080/spring/helloSpring.unmi,你将会看到页面显示出 "Hello, Spring!",祝好运! 

参考:1. Spring MVC 入门
      2. 书籍《Spring框架高级编程》 -《Professional Java Development with the Spring Framework》 永久链接 https://yanbin.blog/spring-mvc-first/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。