本文主要把一个菜鸟从“只是听说过Spring MVC”到“可以手动创建并运行一个Spring MVC工程”的过程记录下来,供以后复习。
0. 开发环境准备
计算机平台:Windows 7 X64。
需要准备的软件和相关库包括:JDK8(jdk-8u74-windows-x64)、Eclipse(eclipse-jee-mars-2-win32-x86_64)、Tomcat(apache-tomcat-7.0.68-windows-x64)、Spring(spring-framework-4.2.5.RELEASE-dist)、Logging(commons-logging-1.2-bin)、Jstl(jakarta-taglibs-standard-1.1.2)。
1. 软件安装
JDK8
安装到系统。安装完成后添加系统环境变量:JAVA_HOME(D:\Program Files\Java\jdk1.8.0_74)、CLASS_PATH(.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar)。如果在cmd中运行“java -version”提示找不到java命令,那么就在PATH环境变量中增加:%JAVA_HOME%\bin;
Tomcat
选择安装包自动安装或者是硬盘解压后运行自带注册脚本均可。然后添加系统环境变量:CATALINA_HOME(D:\Program Files\Java\apache-tomcat-7.0.68)
Eclipse
直接解压到硬盘即可。
配置一下Tomcat服务器方便以后调试:Window -> Preferences -> Server -> Runtime Environment,选择Add弹出“New Server Runtime Enrionment”对话框,选择对应的版本下一步配置Tomcat的根目录最后“Finish”,这样就完成了Eclipse与Tomcat的整合。
配置一下Eclipse编辑器自动提示功能:Window -> Preferences -> Java -> Editor -> Content Assist 中将Auto Activation中的延时设置为200ms,提示符改为“.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz”。
Spring、Logging、Jstl
这三个都是以jar包的形式进行应用的,解压出来找到jar包提取出来可以分别放置或混合在一起。在Eclipse中,可以Window -> Preferences -> Java -> Build Path -> User Libraries 将这些依赖库整理在一起,这样有个好处就是在工程应用的时候可以直接添加User Library引用,目录就变得很清晰明了。
2. 创建工程
2.1、打开Eclipse,选择File -> New -> Dynamic Web Project(或者Other中选择),指定工程名之后再下一步,记得勾上“Generate web.xml deployment descriptor”自动生成一个web.xml配置文件。
2.2、右键工程名,选择Properties -> Java Build Path -> Libraries,选择“Add Library” -> User Library 把自己上面制定的自定义库加载进来。
2.3、将Spring、Jstl、Logging库拷贝到WEB-INF/lib目录
为什么加载了依赖库,还要讲库文件拷贝到lib目录呢?原因是在于Web工程是需要在Tomcat中运行的,依赖库只能保证编译成功,却不会自动将依赖库拷贝到Tomcat运行目录下,那么网站也就不能正常访问了!Spring目录中其实有很多jar包是不需要的,不过暂时搞不清楚哪些可以不拷贝,所以干脆都拷贝过去算了。另外就是加上commons-logging-1.2.jar、jstl.jar、standard.jar辅助依赖库。
2.4、配置web.XML文件
在web.xml文件中添加如下配置信息:
<servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
其中<servlet>定义了一个名为SpringMVC的servlet引入了Spring类,load-on-startup表示工程启动时自动加载。在<servlet-mapping>中url-pattern是用来定义哪些请求需要交给Spring框架进行处理的,“/”表示所有请求,比如说“*.html”就表示所有的html页面请求。
页面请求交给Spring MVC处理后,Spring MVC默认会加载WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml 配置文件。例如本例中的SpringMVC-servlet.xml。
2.5、配置SpringMVC-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-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- HandlerMapping --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- HandlerAdapter --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!-- 处理器 --> <bean name="/xiaoku" class="com.springmvc.xiaoku.HelloWorldController" /> <!-- ViewResolver --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
主要是配置在于:
(1)HandlerMapping是处理器的映射器。BeanNameUrlHandlerMapping表示将URL和Bean的名字进行匹配,例如URL为“上下文/xiaoku”则Spring配置文件中必须有一个“/xiaoku”的Bean,上下文忽略。可以看到后面确实有一个Bean名字为“/xiaoku”,对应的类就是我们自己写的HelloWorldController。
(2)HandlerAdapter是处理器的适配器。SimpleControllerHandlerAdapter表示所有实现了org.springframework.web.servlet.mvc.Controller接口的Bean可以作为Spring Web MVC中的处理器。如果需要其他类型的处理器可以通过实现HadlerAdapter来解决。
(3)ViewResolver是视图解释器。InternalResourceViewResolver用于支持Servlet、Jsp的解析;viewClass设置为JstlView表示JSP模板页面需要使用JSTL标签库,classpath中必须包含jstl的相关jar包;其中prefix和suffix分别表示视图页面的前缀和后缀,访问格式就是“prefix[视图名称].suffix”,例如视图名为xiaoku,那么上面配置指定的访问路径就是“/WEB-INF/jsp/xiaoku.jsp”。
2.6、创建一个Controller
我们的Model层就是Spring MVC框架,这一步我们把Controller层定义一下。
package com.springmvc.xiaoku; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class HelloWorldController implements Controller{ @Override public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception { ModelAndView mv = new ModelAndView(); mv.addObject("message", "Hello, my first spring mvc!"); mv.setViewName("xiaoku"); return mv; } }
这里的HelloWorldController必须继承org.springframework.web.servlet.mvc.Controller,当有也有其他Controller以后再学习。Eclipse编程方便就在于自动提示必须重载的函数接口,ModelAndView包含了视图要实现的模型数据和逻辑视图名,可以添加任意POJO对象。
回头看看那个SpringMVC-servlet.xml,其实里面名为“/name”的Bean指向的Class就是这一步创建的Class,实际上是设计好了再回头配置一下。
2.7、设计一个简单的Jsp页面
上面已经说了视图名为xiaoku,那么就创建一个名为xiaoku.jsp的页面文件,其实Eclipse自动生成的jsp文件就包含了大部分的内容,只需要增加一句话打印一下message(由Controller层传递过来的)信息即可,完整代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=ISO-8859-1"> <title>My first jsp page</title> </head> <body> 第一条信息:${message} </body> </html>
2.8、运行工程
配置完成的工程状态如下:
可以选择启动工程调试,或者启动Tomcat服务器,通过浏览器访问:http://localhost:8080/FirstSpringMVC/xiaoku 就可以看到页面效果了!从我实践的效果来看,主要可能出错的地方在于自定义视图名称、Controller名称、Bean名称三者要一致。
总结:
1、环境的搭建要细心,JDK、Eclipse、Tomcat安装要正确,环境变量要设置好;
2、使用Spring、CommonLogging、Jstl库的时候要在工程依赖中加一下,还要在工程lib目录下拷贝一份,这样就不会出现“Class not found”的问题了;
3、使用Spring MVC主要是:配置“web.xml”将访问处理引导给Spring;配置“工程名-servlet.xml”给Spring提供配置信息;定义自己的Controller类处理页面逻辑;制作自己的Jsp页面显示文件;
4、从这个简单的入门例子中可以看出,Spring框架做简单的网站显得很繁琐,但是开发任务的层次划分的很清晰,每一层的任务耦合性比较低,要是开发大型的网站就方便系统设计和多人协作了。