SpringMVC是Spring下的一个模块,与Spring自然无缝衔接,相比Structs2我更喜欢SpringMVC。这篇博客介绍一下SpringMVC的基本工作流程最后会附上一个小demo可供演示。
先上一张图:
这张图展示了SpringMVC大致的工作流程,下面开始逐步讲解:
- 用户通过浏览器发送一个Http给Web应用。
- 如果该请求与web.xml中DisPatcherServlet的配置匹配,则将该请求交由DispatcherServlet处理。
- DispatcherServlet根据请求的信息URL、HTTP处理器等信息以及HandlerMapping的配置找到处理请求的Handler(一般是Controller)。
- 找到Handler后,通过HandlerAdapter对Handler进行封装,使用统一的接口来调用Handler.
- 在Handler完成业务处理之后返回一个ModelAndView给DispatcherServlet,ModelAndView,顾名思义,其中包含一个逻辑视图名和模型数据信息。
- 然后DisPatcherServlet调用ViewResolver完成逻辑视图名到真实的视图对象的解析。
- 当得到真实的视图对象View后,DispatcherServlet会用这个View对ModelAndView中的视图对象进行渲染。
- 最终返回客户端一个Http相应,可能是HTML页面,也可能是一个图片等。
下面做一个demo来实践一下整个过程:
- 先用IDEA创建一个空的的maven工程(也可以new->project->maven->勾选create from archetype->选中webapp,但感觉有问题)。然后按照web应用目录结构手动创建一个webapp及其子目录。
- 在pom.xml中添加依赖,最终结果如下:
4.0.0
SpringMVC-Demo
springmvc-demo
1.0-SNAPSHOT
org.springframework
spring-webmvc
4.3.9.RELEASE
javax.servlet
jstl
1.2
war
注意要添加jstl依赖,否则会报错。
- 配置web.xml和xxx-servlet.xml文件,配置如下:
web.xml
Springmvc-demo
vzard
org.springframework.web.servlet.DispatcherServlet
1
vzard
/
index.jsp
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
encodingFilter
/*
vzard-servlet.xml
这里要注意的是还要添加一个applicationContext.xml文件,这个文件是Spring的全局配置文件,亲测不配置会报错,里面可以不配置东西,但是这个文件一定要有。
applicationContext.xml
- 然后就是业务逻辑分析部分,这个demo要做的事是:开启应用-->进入欢迎页,点击注册-->进入注册页面,输入信息,点击提交-->进入注册成功页面,显示用户信息
- 业务逻辑实现:
UserController类:
package org.vzard.Controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.vzard.domain.User;
import org.vzard.service.UserService;
/**
* Created by V-zar on 2017/8/25.
*/
@Controller
public class UserController {
// @Autowired(required = false)
//UserService userService;
@RequestMapping("/")
public String index() {
return "index";
}
@RequestMapping("/adduser")
public String addUser() {
return "adduser";
}
@RequestMapping(value = "/success")
public ModelAndView register(User user) {
//userService.creatUser(user);
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("success");
modelAndView.addObject("user", user);
return modelAndView;
}
}
User类:
package org.vzard.domain;
/**
* Created by V-zar on 2017/8/25.
*/
public class User {
public String userName;
public String password;
public String realName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
}
前端界面引入了Bootstrap(然并卵,还是巨丑,懒得写界面):
index.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
SpringMVC Demo 首页
WELCOME
">
adduser.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
SpringMVC Demo 首页
success.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
SpringMVC Demo 首页
欢迎,${user.userName}
您的密码是:${user.password}
您的真实姓名是:${user.realName}
运行结果:
完整demo可在我的github上clone运行:Demo
运行环境&工具:
- IDEA
- JDK 1.8
- Tomcat 8.5