MVC模式
MVC是Model、View和Controller的缩写。是Java Web应用的推荐架构。
一个实现MVC模式的应用包含模型、视图和控制器3个模块。视图负责应用的展示。模型封装了应用的数据和业务逻辑。控制器负责接收用户输入,改变模型,以及调整视图的显示。其架构图大致为:
Spring MVC
Spring MVC是基于SpringFrameWork来开发Web应用的MVC框架。其特点有:
- 提供了一个Dispatcher Servlet,无需额外开发。
- 自动实例化控制器,并根据用户输入来构造bean。
- 可以自动绑定用户输入,并正确地转换数据类型。
- 可以校验用户输入,若校验不通过,则重定向回输入表单。
- 支持国际化和本地化。
- 支持多视图技术。如:JSP、Velocity和FreeMarker。
SpringMVC实例
IDE:IntelliJ IDEA 2017.1
实例说明:在页面中输入数据,提交表单,跳转到显示输入数据的页面。
新建项目
New Project → Maven → maven-archetype-webapp → cn.jujianfei.test(GroupId) ,
test-springmvc(ArtifactId) → ....... → Finish
新建Maven项目时,如果使用默认的settings.xml文件,下载依赖会比较慢,因为Maven中央仓库在国外。
解决方案:在settings.xml中添加配置,使用阿里的仓库。具体配置如下:
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
添加依赖
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
项目目录
项目代码
@Controller
public class UserController {
@RequestMapping("/user_input")
public String inputUser(){
return "InputUser";
}
@RequestMapping("/user_show")
public String showUser(@RequestParam String name,@RequestParam String pwd,Model model){
User user = new User();
user.setUserName(name);
user.setUserPwd(pwd);
model.addAttribute("user",user);
return "ShowUser";
}
}
public class User {
private String userName;
private String userPwd;
//get和set方法,略
}
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd">
<context:component-scan base-package="controller"/>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
InputUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>input</title>
</head>
<body>
<form action="/user_show" method="post">
UserName:<input type="text" name="name"><br>
UserPwd:<input type="text" name="pwd"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
ShowUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>show</title>
</head>
<body>
UserName:${user.userName}<br>
UserPwd:${user.userPwd}<br>
</body>
</html>
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<servlet>
<servlet-name>spring_mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/spring_mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring_mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
实际效果
配置Tomcat Server:Run → Edit Configurations → ……. → Ok。
点击运行,访问地址:http://localhost:8080/user_input 。效果为:
填写信息,单击提交。效果为:
请求处理方法
每个请求处理方法可以有多个不同类型的参数,以及一个多种类型的返回结果。
请求处理方法可以使用的参数类型
- javax.servlet.ServletRequest 或 javax.servlet.http.HttpServletRequest
- javax.servlet.ServletReponse 或 javax.servlet.http.HttpServletResponse
- javax.servlet.http.HttpSession
- org.springframework.web.context.request.WebRequest 或 org.springframework.web.context.request.NativeWebRequest
- java.util.Locale
- java.io.InputStream 或 java.io.Reader
- java.io.OutputStream 或 java.io.Writer
- java.security.Principal
HttpEntity<?>
- java.util.Map / org.springframework.ui.Model / org.springframework.ui.ModelMap
- org.springframework.web.servlet.mvc.support.RedirectAttributes
- org.springframework.validation.Errors / org.springframework.validation.BindingResult
- 命令或表单对象
- org.springframework.web.bind.support.SessionStatus
- org.springframework.web.util.UriComponentsBuilder
- 带@PathVariable,@MatrixVariable注释的对象
- @RequestParam,@RequestHeader,@RequestBody或@RequestPart
特别重要的是org.springframework.ui.Model类型。这不是一个Servlet API类型,而是一个包含Map的Spring MVC类型。每次调用请求处理方法时,Spring MVC都会创建一个Model对象。
请求处理方法可以使用的返回的类型
- ModelAndView
- Model
- Map包含模型的属性
- View
- 代表逻辑视图名的String
- void
- 提供对Servlet的访问,以响应HTTP头部和内容HttpEntity或ResponseEntity对象
- Callable
- DeferredResult
- 其他任意类型,Spring将其视作输出给View的对象模型
小结
浏览器发出一个请求,DispatcherServlet根据请求中的URI,将请求映射到服务器中对应的处理方法上。处理方法接收参数,书写业务逻辑,并返回视图名称的字符串。最后,jsp将响应内容发送到浏览器。