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";
}