Spring MVC Web容易入门实例
本文通过一个简单的用户登录例子带你入门Spring MVC Web开发。
开发环境
1、STS 3.7.3(Spring Tool Suit),下载。STS其实是一个包装过的Eclipse,由Spring小组开发的,专门用于Spring项目的开发。老规矩,安装之前先要安装jdk,并配置好环境变量。
2、Tomcat 7,下载Tomcat 7。sts已经集成了一个叫Pivotal tc Server的web服务器,不过我们一般都使用Tomcat作为我们的Web服务器。Tomcat配置。
创建项目
1、新建Spring Legancy Project。
2、填写项目名称:SpringMVCLoginDemo,项目模板选择:Spring MVC Project
3、设置包名:com.ums.logindemo,然后点击finish。
4、新建工程完成后,工程目录大概是下面这个样子
目前只需要关注src目录就行了,最重要的部分已经用红色下划线标出来了,下面进行简单的解释:
web.xml:项目配置文件
root-context.xml:Web通用上下文环境配置文件。
servlet-context.xml:Spring MVC上下文环境配置文件,其中最重要的包括前端控制器DispachServlet的配置。
home.jsp:home视图
HomeController.java:控制器
请求的处理流程
为了能够继续下去,我们应该先了解一下一个请求的处理流程。每当用户点击链接或者提交表单的时候,一个请求就开始了。请求到达web服务器后,第一个接收的就是一个叫DispacherServlet的总管家,它是一个集中处理并分派请求的人,通过它请求被分派到具体的某个控制器。每个web请求必须通过DispacherServlet,以便它能够管理整个请求的生命周期。
当请求被DispacherServlet派发到具体的控制器后,控制器便马不停蹄的开始工作,处理完成后,便将数据(model)和视图名字(viewname)打包一起返回给总管家,告诉它用这些数据去渲染叫这个名字的视图就OK了(为什么不直接给视图,而是给个视图名字?当然是为了解耦啦!)。管家拿到视图名字后,需要请教一个叫视图解析器的家伙,让他告诉自己这个视图名字对应的视图到底是谁。视图解析器告诉管家,这个视图指的就是home.jsp这个家伙,然后管家把数据就交给home.jsp去渲染,然后再返回给用户。具体流程可以参考下面这个图(盗来的 #^_^):
项目配置
1、DispacherServlet配置
通过上面的流程,我们知道了DispacherServlet的重要性,那么如何配置这个总管家呢?打开web.xml,里面有如下配置:
<!-- 处理用户请求 --> <servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>没错,这就是DispacherServlet的配置部分。里面配置了一个叫appServlet的DispacherServlet,并在初始化参数中给出了MVC上下文的详细配置的文件路径。load-on-startup=1表明DispacherServlet在应用启动后就先加载(这是必须的,不然谁来第一个接收请求)。
然后我们需要告诉DispacherServlet需要拦截什么样的请求:
<servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
url-pattern="/"表明DispacherServlet来者不拒,所有请求都接收,除了静态资源。因为静态资源的特殊性,不用处理,可以直接交给用户,所以不希望被DispacherServlet拦截,那么可以在servlet-context.xml配置一个单独的处理静态资源的控制器:
<resources mapping="/resources/**" location="/resources/" />这样所有包含/reources/的链接,web服务器都会去根下resources目录寻找该资源。具体可以参考:SpringMVC访问静态资源。
2、控制器配置
项目使用的Spring版本是3.1,采用的是基于注解的控制器配置,省去了大量xml配置的麻烦。要使得基于注解的控制器配置模式生效,需要在servlet-context.xml中说明:
<annotation-driven />然后告诉控制器在哪个包里面:
<context:component-scan base-package="com.ums.logindemo" />如上所示,我们项目中的HomeController控制器就在com.ums.logindemo包里面。如何判断一个JavaBean是一个控制器呢?
@Controller public class HomeController { private static final Logger logger = LoggerFactory.getLogger(HomeController.class); /** * Simply selects the home view to render by returning its name. */ @RequestMapping(value = "/", method = RequestMethod.GET) public String home(Locale locale, Model model) { logger.info("Welcome home! The client locale is {}.", locale); Date date = new Date(); DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); String formattedDate = dateFormat.format(date); model.addAttribute("serverTime", formattedDate ); return "home"; } }HomeController类使用了@Controller注解,这就表明了HomeController是一个控制器。
3、请求映射
请求到达DispacherServlet后是如何被派发到具体的控制器呢?这个要通过@RequestMapping注解来实现。@RequestMapping可用于方法和类上,有两个重要属性,value指定哪些路由的请求会进入该方法被处理,例如上面表示所有请求都会进入home方法;method指定接收何种请求方式,例如上面代码表示home方法只接收GET请求。@RequestMapping具体内容可以参考:@RequestMapping用法详解。
4、视图解析器配置
视图解析器作用上面已经说了,就是将视图名称映射到具体的视图,在servlet-context.xml中配置如下:
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <beans:property name="prefix" value="/WEB-INF/views/" /> <beans:property name="suffix" value=".jsp" /> </beans:bean>视图解析器有多种,最简单的是这个叫InternalResourceViewResolver的视图解析器,表示在视图名字加上/WEB-INF/views/前缀和.jsp后缀形成路径,然后在该路径下寻找具体视图,如/WEB-INF/views/home.jsp。
登录例子
好,现在再回到我们的登录例子中来。具体功能是用户输入用户名和密码,登录成功后在新页面展示用户输入的用户名和密码。
1、编写控制器
在HomeController中设置home方法响应所对"/"下的请求,并返回到登录视图login。
@RequestMapping(value = "/", method = RequestMethod.GET) public String home() { return "login"; }2、编写登录页面
在views目录下添加login.jsp,在表单form中添加动作目的地址login,请求方法为post。
<h1> 你好!请输入账号和密码! </h1> <form action="login" method="post"> 账号:<input type="text" name="username" required="required"/> 密码:<input type="password" name="password" required="required"/> <input type="submit" value="登录"/> </form>3、编写响应login路由的方法
在HomeController中编写响应login路由的方法,验证用户名密码,成功则返回结果视图result.jsp,否则返回login.jsp。
/* * 拦截对login路由的访问 * */ @RequestMapping(value = "login", method = RequestMethod.POST) public String login(String username,String password,Model model) { //验证传递过来的参数是否正确,否则返回到登陆页面。 if(username.equals("gameloft9")&&password.equals("123")){ model.addAttribute("username", username);//往数据模型中添加数据 model.addAttribute("password", password); return "result";//返回视图名称"result" } return "login";//返回登录页面 }3、编写结果页面
在views目录下添加result.jsp,显示传递过来的模型数据(这里是用户名及密码)。
<%@ 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> <title>结果</title> </head> <body> <h2>登陆成功!</h2> 用户名:${username } <p> 密码:${password } </body> </html>
运行截图
从上面可以看到访问localhost:8080/logindemo/,跳转到了login.jsp页面。
输入错误的用户名和密码,跳转到了localhost:8080/logindemo/login路由,这个是form表单的action指定的,由于用户名密码错误,所以还是返回的登录页面login.jsp。
如果用户名密码正确,则返回的是结果页面result.jsp。请注意目的路由仍然是localhost:8080/logindemo/login。也就是说路由与视图页面没有确定的一对一关系。
好了,这就是一个简单的Spring MVC登录例子,希望能帮助你入门。
工程源码已经上传到GitHub:https://github.com/gameloft9/SpringMVCLoginDemo。
另外也在****上留存的一份:http://download.****.net/detail/gameloft9/9582346。