Spring MVC
Spring MVC框架
MVC模式
MVC模式是指Model-View-Controller(模型-视图-控制器),是开发web应用程序时常用的一种代码分层方式
基本组成
视图(View):负责格式化数据并把他们呈现给用户,包括数据展示,数据验证,界面设计等功能。
对应组件:JSP或HTML文件
控制器(Controller):负责接收并转发请求,对请求进行处理后指派视图并将相应结果发送给客户端
对应组件:Servlet
模型(Model):模型对象拥有最多的处理任务,是应用程序的主题部分,它负责业务逻辑的处理和实现对数据的操作
对应组件:JavaBean(包括处理业务逻辑的Service层,与数据库操作相关的DAO层及贯穿于各层之间的数据模 型 POJO)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5zlx0kYX-1618907309512)(C:\Users\郭念念\AppData\Roaming\Typora\typora-user-images\image-20210129150006690.png)]
MVC处理过程
- 视图提供系统与用户交互的界面,并发送用户输入的请求给控制器
- 控制器接收用户的请求,并决定应该调用的模型
- 模型根据用户请求进行相应的业务逻辑处理,并返回处理结果(数据)
- 控制器根据返回的处理结果,调用相应的视图格式化模型返回的数据,并通过视图呈现结果给用户
优点
- MVC三个模块相互独立,松耦合架构
- 多视图共享一个模型,大大提高代码的可重用性
- 控制器提高了应用程序的灵活性和可配置性
- 有利于软件工程化管理
缺点
- 增加了系统结构和实现的复杂性,不适合小规模的项目
- 层与模型之间需要控制器做中间的链接控制,所以效率低
搭建Spring MVC环境
1.下载相关jar文件
2. 创建项目并导入依赖包
- 创建 JavaWeb项目
-
将
Spring 的 JAR 文件
和
SpringMVC 的 JAR 文件
都导入到
web/WEB-INF/lib
目录下 -
将
log4j.properties
配置文件拷贝到
resources
资源目录下
3. 创建控制器
创建
controller.HellController
类
package controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest reqeust, HttpServletResponse response) throws Exception {
System.out.println("Spring MVC框架搭建成功。");
return null;
}
}
4. 创建核心配置文件
创建
resources/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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="/index.html" class="controller.HelloController"/>
</beans>
5. 配置 SpringMVC 入口
修改
web/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
6.访问测试
在浏览器中访问
http://localhost:8080/index.html
在控制台中会输出
使用注解实现SpringMVC
修改
resources/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"
+mlns: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.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/mvc
+ http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- IOC 注解支持-->
+ <context:component-scan base-package="controller"/>
<!-- MVC 注解支持 -->
+ <mvc:annotation-driven/>
- <bean name="/index.html" class="controller.HelloController"/>
</beans>
修改
controller.HelloController
类
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/index.html")
public String hello() throws Exception {
return "hello";
}
}
视图解析器
创建
web/WEB-INF/jsp/hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>我的第一个SpringMVC程序,运行成功啦!</h1>
</body>
</html>
修改
controller.HelloController
类
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(){
System.out.println("hello Controller");
return "hello";
}
}
修改
resources/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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="/index.html" class="controller.HelloController"/>
<!-- 视图解析器 -->
+ <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+ <property name="prefix" value="/WEB-INF/jsp/"/>
+ <property name="suffix" value=".jsp"/>
+ </bean>
</beans>
重启服务并访问测试
静态资源解析
-
创建静态资源目录:
web/statics
- 在 SpringMVC 的配置文件中进行配置:
<!-- 将 URL '/statics/** 与 本地物理路径 'web/statics/' 进行绑定 -->
<mvc:resources mapping="/statics/**" location="/statics/"></mvc:resources>
3. 修改视图页面的静态资源路径:
<link rel="stylesheet" href="/statics/css/custom.css">
<script src="/statics/js/custom.js"></script>
请求映射
映射到方法上
当请求
/index.html
的时候,就会执行该方法
@Controller
public class HelloController {
@RequestMapping("/index.html")
public String index() {
return "hello";
}
}
映射到类上
当请求
/user/index.html
的时候,就会执行
index
方法
@Controller
@RequestMapping("/user")
public class HelloController{
@RequestMapping("/index.html")
public String hello() throws Exception {
return "hello";
}
}
只允许GET请求
@RequestMapping(value="/index.html",method=RequestMethod.GET)
@GetMapping("/index.html")
只允许POST请求
@RequestMapping(value="/index.html",method=RequestMethod.POST)
@PostMapping("/index.html")
控制器入参
直接接收
参数名与形参名保持一致时,可以直接获取
@Controller
public class IndexController {
@RequestMapping("/index")
public String index(String name, Integer age){
System.out.println(name);
System.out.println(age);
return "index";
}
}
用@RequestParam注解接收
@Controller
public class IndexController {
@RequestMapping("/index")
public String index(@RequestParam String name, @RequestParam Integer age){
System.out.println(name);
System.out.println(age);
return "index";
}
}
参数名与形参名不一致时,可以使用
@RequestParam
进行获取
@RequestParam
里的值与参数名保持一致
@Controller
public class IndexController {
@RequestMapping("/index")
public String index(@RequestParam("uname") String name, @RequestParam("uage") Integer age){
System.out.println(name);
System.out.println(age);
return "index";
}
}
用@RequestMapping接收
@Controller
public class IndexController {
@RequestMapping(value = "/index", params = { "name", "age" })
public String index(String name, Integer age) {
System.out.println(name);
System.out.println(age);
return "index";
}
}
非必填参数
访问URL:
/index
@Controller
public class IndexController {
@RequestMapping("/index")
public String index(@RequestParam(required=false,value="name")String name) {
System.out.println(name); // null
return "index";
}
}
参数默认值
访问URL:
/index
@Controller
public class IndexController {
@RequestMapping("/index")
public String index(@RequestParam(required=false,value="name",defaultValue="匿名")String name) {
System.out.println(name); // 匿名
return "index";
}
}
对象入参
参数名应该与对象的属性名保持一致
需要给
java.Utils.Date
类型的属性添加
@DateTimeFormat(pattern="yyyy-MM-dd")
注解
形参不能使用
@RequestParam
注解
控制器
@RequestMapping(value = "/add.html", method = RequestMethod.POST)
public String addSave(User user) {
return "user/userlist";
}
pojo.User时间属性
@DateTimeFormat(pattern="yyyy-mm-dd")
private Date birthday;
控制器出参
用ModelAndView实现
值类型出参
控制器
@RequestMapping("/index")
public ModelAndView index() {
ModelAndView mView = new ModelAndView("index");
mView.addObject("username", "admin");
mView.addObject("password", "123456");
return mView;
}
视图
<h1>${username}</h1>
<h1>${password}</h1>
Map出参
控制器
@RequestMapping("/index")
public ModelAndView index() {
ModelAndView mView = new ModelAndView("index");
Map<String, String> modelMap = new HashMap<String, String>();
modelMap.put("username", "admin");
modelMap.put("password", "123456");
mView.addAllObjects(modelMap);
return mView;
}
视图
<h1>${username}</h1>
<h1>${password}</h1>
对象出参
控制器
@RequestMapping("/index")
public ModelAndView index() {
ModelAndView mView = new ModelAndView("index");
User user = new User();
user.setUsername("admin");
user.setPassword("123456");
mView.addObject(user);
return mView;
}
视图
<h1>username:${user.username}</h1>
<h1>password:${user.password}</h1>
用Model实现
值类型出参
控制器
@RequestMapping("/index")
public String index(Model model) {
model.addAttribute("username", "admin");
model.addAttribute("password", "123456");
return "index";
}
视图
<h1>${username}</h1>
<h1>${password}</h1>
Map出参
控制器
@RequestMapping(value="/index")
public String index(Model model) {
Map<String, String> datas = new HashMap<String, String>();
datas.put("username", "admin");
datas.put("password", "123456");
model.addAllAttributes(datas);
return "index";
}
视图
<h1>username:${username}</h1>
<h1>password:${password}</h1>
对象出参
控制器
@RequestMapping("/index")
public String index(Model model) {
User user = new User();
user.setUsername("admin");
user.setPassword("123456");
model.addAttribute(user);
return "index";
}
视图
<h1>username:${user.username}</h1>
<h1>password:${user.password}</h1>
用Map实现
控制器
@RequestMapping("/index")
public String index(Map<String, Object> model) {
model.put("username","张三");
model.put("password","123456");
return "index";
}
视图
<h1>username:${username}</h1>
<h1>password:${password}</h1>
el model) {
User user = new User();
user.setUsername("admin");
user.setPassword("123456");
model.addAttribute(user);
return "index";
}
视图
<h1>username:${user.username}</h1>
<h1>password:${user.password}</h1>
用Map实现
控制器
@RequestMapping("/index")
public String index(Map<String, Object> model) {
model.put("username","张三");
model.put("password","123456");
return "index";
}
视图
<h1>username:${username}</h1>
<h1>password:${password}</h1>