SpringMVC介绍
回顾MVC设计模式
-
model:模型 JavaBean(1.处理业务逻辑 2.封装数据)
-
view:视图 Jsp/html(展示数据)
-
controller:控制器 Servlet(1.接收请求 2.调用模型 3.转发视图)
三层架构
-
web层:用户与java交互
-
service层:处理业务逻辑
-
dao层:java与数据库交互
SpringMVC介绍
SpringMVC 是一种基于 Java 的实现 MVC 设计模式的轻量级 Web 框架,它可以通过一套注解,让一个简单的Java类成为控制器,而无须实现任何接口
springMVC框架本质上就是一个servlet,封装了共有的行为(请求、响应),简化代码
SpringMVC快速入门
步骤:
- 创建maven工程
- 引入依赖管理
- 创建一个普通类,@controller,创建处理请求的方法
- 准备一个页面,用于响应
- 创建springmvc的配置文件,开启注解扫描
- 配置一个前端的控制器(可以理解为之前的BaseServlet的方法)将springmvc的配置文件配起来
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.itcast</groupId>
<artifactId>SpringMvc_day01_quick</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<!--
1、创建maven工程
2、引入依赖管理
3、创建一个普通类,@controller,创建处理请求的方法
4、准备一个页面,用于响应
5、创建springmvc的配置文件,开启注解扫描
6、配置一个前端的控制器(可以理解为之前的BaseServlet的方法)将springmvc的配置文件配起来
-->
<!--依赖管理-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<!--springmvc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<!--jdk1.8插件-->
<build>
<plugins>
<!-- 设置编译版本为1.8 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!--配置springmvc的前端控制器-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--将springmvc的配置文件交给spring的前端控制器来解析-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
</servlet>
<!--拦截url规则:/(默认)-->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
demo.jsp:
<%--
Created by IntelliJ IDEA.
User: hxc
Date: 2020/6/22
Time: 19:30
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
applicationContext.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:context="http://www.springframework.org/schema/context"
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">
<!-- bean definitions here -->
<!-- 开启注解扫描 -->
<context:component-scan base-package="cn.itcast"></context:component-scan>
</beans>
Controller:
@Controller //声明这是一个处理请求的controller
public class MyController {
@RequestMapping("/demo") //指定当前方法处理哪一个请求
public ModelAndView demo(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","hello springMVC");
modelAndView.setViewName("/WEB-INF/jsp/demo.jsp");
return modelAndView;
}
}
SpringMVC的执行流程
时序图
流程图
SpringMVC组件概述
三大组件
-
处理器映射器:HandlerMapping
将 请求url 和 处理器的方法 建立映射关系 -
处理器适配器:HandlerAdapter
从多个处理器当中,适配其中一个,调用目标执行… -
视图解析器:ViewResolver
将逻辑视图解析为物理视图
常用注解
@Controller
SpringMVC基于Spring容器,所以在进行SpringMVC操作时,需要将Controller存储到Spring容器中,故使用此注解
@RequestMapping
用于建立请求 URL 和处理请求方法之间的对应关系
/**
* @RequestMapping:
* 1.指定当前方法需要处理的请求的路径
* value:就是路径,可以是一个数组.
* 如果有后缀,此处的后缀可以省略.
* 2. 限定请求的方式的
* method: 是一个RequestMethod枚举类型的数组
* 3. 分类管理url
* 使用在类名上,作为当前访问controller的统一的父级路径.从而达到分类管理的目的
* /order/*
* /user/*
* /route/*
*
* @return
*/
//@RequestMapping({"/demo.do","/abc"}) //指定当前方法处理哪一个请求
@RequestMapping(value = "/demo",method = RequestMethod.GET)
public ModelAndView demo(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","hello springMVC");
// 视图路径 应该由 视图解析器的 前缀+名字+后缀
modelAndView.setViewName("demo");
return modelAndView;
}
SpringMVC的请求
服务器要获取请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数:
默认支持参数
/**
* springMVC默认支持的参数
* 1. HttpServletRequest : 请求
* 2. HttpServletResponse 响应
* 3. HttpSession session域
*
* 4.Model: model+string返回值 = ModelAndView
*
* @return
*/
@RequestMapping("/demo2")
public ModelAndView demo2(HttpServletRequest request, HttpServletResponse response, HttpSession session){
System.out.println(request);
System.out.println(response);
System.out.println(session);
ModelAndView modelAndView = new ModelAndView();
//设置视图
modelAndView.setViewName("item/list");
return modelAndView;
}
基本类型参数
/**
* @RequestParam : 用来获取请求中的参数的.
* value值就是表单提交时的key. 底层就是 request.getParameter(key);
*
* 如果表单提交时的key和方法中声明的参数名一致时,这个@RequestParam注解可以省略
*
*
* 对于请求中基本类型参数,直接在handler中声明参数,保证参数名和请求中提交的key值一样即可
*
*/
@RequestMapping("/queryItem.do")
public ModelAndView demo1(@RequestParam("productName") String productName){
System.out.println(productName);
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("item/list");
return modelAndView;
}
pojo类型的参数
//只是用于页面跳转
@RequestMapping("/queryItemById.do")
public String queryItemById(int id){
System.out.println("拿到id,调用service去获取数据,然后跳转修改页面:"+id);
return "item/edit";
}
/**
* 请求中的数据封装到pojo对象. 直接声明pojo即可.但是注意,pojo的属性名必须和请求中的key值一致.
*
* 请求参数的乱码,直接配置spring提供的乱码过滤器 ,在spring-web包
*
* @return
*/
@RequestMapping("/updateItem.do")
public String updateItem(Item item){
System.out.println("请求中的数据封装成的item对象:"+item);
return "item/edit";
}
web.xml配置乱码过滤器:
<!-- spring的乱码过滤器-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 配置编码格式-->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
pojo包装类型的参数
pojo.java:
package com.itheima.pojo;
public class QueryVo {
private Item item;
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
}
/**
* 包装类型: 保证前端提交的 key 是如下格式:
* 包装类型的属性名.属性名
*
* @param queryVo
* @return
*/
@RequestMapping("/queryItem.do")
public String queryItem(QueryVo queryVo){
System.out.println(queryVo.getItem());
return "item/list";
}
自定义类型的转换器
StringToDateConverterl.java
public class StringToDateConverter implements Converter<String, Date>{
/**
实现Converter<S,T>接口
S(source): 需要被转的类型
T(target): 需要转成的类型
*/
@Override
public Date convert(String s) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM--dd hh:mm:ss");
Date date=null;
try {
date=format.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
applicationContext.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: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">
<!--开启注解扫描-->
<context:component-scan base-package="cn.itcast.controller"></context:component-scan>
<!--前端控制器是/,所以要配置释放静态资源-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!--springmvc的注解驱动
1、显示配置使用注解的 映射器和适配器
2、支持json解析
-->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!--配置springmvc的类型转换器-->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!--配置工厂创建的对象-->
<property name="converters">
<set>
<!--自定义的类型转换器-->
<bean class="cn.itcast.converter.StringToDateConverter"></bean>
</set>
</property>
</bean>
<!--显示配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--视图名的前缀-->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!--视图名的后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
集合类型的参数
数组
提交数组类型,直接声明数组类型的变量,变量和前端提交的key值保持一致
/*
提交数组类型,直接声明数组类型的变量,变量和前端提交的key值保持一致
*/
@RequestMapping("/demo4.do")
public String demo4(Integer[] ids){
System.out.println(Arrays.toString(ids));
return "item/list";
}
集合类型
/*
提交的是集合.
1.后台应该创建一个包装类,将集合属性作为包装类的属性
2.前端提交的参数应该通过key来指定 数据封装到包装类的集合属性的第几个对象中去.
*/
@RequestMapping("/demo5.do")
public String demo5(QueryVo queryVo){
System.out.println(queryVo.getItemList());
return "item/list";
}
controller返回值
modelAndView类型
ModelAndView : 用于封装数据和视图名的对象.springmvc自动解析这个对象
@RequestMapping("/demo1")
public ModelAndView demo1(){
ModelAndView modelAndView = new ModelAndView();
//设置参数 向request域存放数据.
modelAndView.addObject("msg","消息");
//设置视图名 完整的路径 = 视图解析器的前缀 + 名字 + 后缀 ,底层是java的转发技术.
modelAndView.setViewName("demo");
return modelAndView;
}
void类型
@RequestMapping("/demo2")
public void demo2(HttpServletRequest request, HttpServletResponse response){
try {
request.setAttribute("msg","原生态的转发技术");
request.getRequestDispatcher("/WEB-INF/jsp/demo.jsp").forward(request,response);
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@RequestMapping("/demo3")
public void demo3(HttpServletResponse response){
try {
response.sendRedirect("/a.html");
} catch (IOException e) {
e.printStackTrace();
}
}
@RequestMapping("/demo4")
public void demo4(HttpServletResponse response){
try {
response.getWriter().write("<font color='red'>hello</font>");
} catch (IOException e) {
e.printStackTrace();
}
}
@RequestMapping("/demo5")
@ResponseStatus(HttpStatus.OK) //如果handler是void类型,并且不给任何响应体,必须使用当前注解
public void demo5(){
System.out.println("我不给浏览器响应");
}
String类型
string类型返回值,springmvc直接默认就是视图名
@RequestMapping("/demo6")
public String demo6(Model model){
//设置数据,向request域保存数据
model.addAttribute("msg","hello");
return "demo";
}