1. 程式人生 > >Spring MVC入門

Spring MVC入門

第一章 概述

  1. Spring MVC快速入門
  2. Spring MVC詳解
  3. Spring MVC的使用
  4. Maven開發Spring MVC

第二章 Spring MVC快速入門及詳解

2-1 Spring MVC快速入門
(1)什麼是MVC設計模式?

  • Controller:負責接收並處理請求,響應客戶端。
  • Model:模型資料,業務邏輯。
  • View:呈現模型,與使用者進行互動。
    在這裡插入圖片描述
    (2)什麼是Spring MVC?
  • 目前最好的實現MVC設計模式的框架。
  • Spring框架的一個後續產品。
  • Spring框架的一個子模組,二者可以很好的結合使用,不需要整合。

2-2 Spring MVC詳解
(1)Spring MVC核心元件(8個)

  • DispatcherServlet:前置控制器。
  • HandlerMapping:將請求對映到Handler。
  • andler:後端控制器,完成具體業務邏輯
  • HandlerInterceptor:處理器攔截器。
  • HandlerExecutionChain:處理器執行鏈。 -
  • HandlerAdapter:處理器介面卡。
  • ModelAndView:裝載模型資料和檢視資訊。
  • ViewResolver:檢視解析器。

(2)Spring MVC實現流程

  • 客戶端請求被DispatcherServlet接收。
  • DispatcherServlet將請求對映到Handler。
  • 生成Handler以及HandlerInterceptor。
  • 返回HandlerExecutionChain(Handler+HandlerInterceptor)。
  • DispatcherServlet通過HandlerAdapter執行Handler。
  • 返回一個ModelAndView。
  • ispatcherServlet通過ViewResoler進行解析。
  • 返回填充了模型資料的View,響應給客戶端。
    在這裡插入圖片描述

第三章 Spring MVC使用

Spring MVC的使用

  • 大部分元件由框架提供,開發者只需通過配置進行關聯。
  • 開發者只需要手動編寫Handler,View。

3-1 Spring MVC使用—基於XML配置
Spring MVC基礎配置。

  • XML配置Controller,HandlerMapping元件對映。
  • XML配置ViewResolver元件對映。

(1)目錄結構
在這裡插入圖片描述
(2)建立maven webapp專案,在pom.xml中匯入Spring MVC,servlet需要的依賴。

<!-- 匯入springmvc需要的jar --> 
 <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-webmvc</artifactId>
     <version>3.2.4.RELEASE</version>
 </dependency>
 <!-- 匯入Servlet相關的jar -->
 <dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>javax.servlet-api</artifactId>
     <version>3.1.0</version>
     <scope>provided</scope>
 </dependency>

(3)在web.xml中配置DispatcherServlet前置控制器。

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <!-- 前置控制器 -->
  <servlet>
   <servlet-name>SpringMVC</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 <init-param><!-- 初始化引數,指定springmvc的路徑 -->
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:springmvc.xml</param-value>
 </init-param>
  </servlet>
  
  <!-- Servlet-mapping對映 -->
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

(4)在resource中建立springmvc.xml檔案,將Hanler和檢視jsp關聯起來。

<?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">
       
 <!-- 配置HandlerMapping,將url請求對映到Handler -->
 <bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <!-- 配置Mapping -->
  <property name="mappings">
   <props>
    <!-- 配置test請求對應的handler -->
    <prop key="/test">testHandler</prop>
   </props>
  </property>
 </bean>
 
 <!-- 配置Handler -->
 <bean id="testHandler" class="com.demo.handler.MyHandler" ></bean><!-- id值對應上面的prop值 -->
 
 <!-- 配置檢視解析器 -->
 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <!-- 配置字首 -->
  <property name="prefix" value="/"></property><!-- 單斜槓表示根目錄,配置前後綴針對MyHandler中的邏輯檢視而言 -->
  <!-- 配置字尾 -->
  <property name="suffix" value=".jsp"></property>
 </bean>
</beans>

(5)建立MyHandler.java檔案實現Controller介面。

public class MyHandler implements Controller {
 @Override
 public ModelAndView handleRequest(HttpServletRequest arg0,HttpServletResponse arg1) throws Exception {
  //裝載模型資料和邏輯檢視
  ModelAndView modelAndView = new ModelAndView();
  //新增模型資料
  modelAndView.addObject("name","Tom");
  //新增邏輯檢視
  modelAndView.setViewName("show");//把Tom傳到show檢視中
  return modelAndView;
 }
}

(6)因為MyHandler檔案中是setViewName(“show”),所以建立show.jsp檔案。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %><!-- 是否忽略EL -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
 ${name}
</body>
</html>

(7)在瀏覽器中輸入地址,以及在springmvc.xml中定好的test,即可取出資料。
在這裡插入圖片描述
3-2 Spring MVC使用—基於註解
SpringMVC基礎配置。

  • Controller,HandlerMapping通過註解進行對映。
  • XML配置ViewResolver元件對映。

(1)目錄結構
在這裡插入圖片描述
(2)pom.xml,show.jsp,web.xml三個檔案和之前一樣。
(3)建立AnnotationHandler.java檔案,通過註解完成SpringMVC可以不實現Controller介面。

@Controller  //通過註解的方式告訴springmvc,這是一個控制器
public class AnnotationHandler {
 /**
  * 業務方法:ModelAndView完成資料的傳遞,檢視的解析
  */
 @RequestMapping("/modelAndViewTest")  //這個方法是客戶端處理對應的請求的
 public ModelAndView modelAndViewTest(){
  //建立ModelAndView物件
  ModelAndView modelAndView = new ModelAndView();
  //填充模型資料
  modelAndView.addObject("name","這是ModelAndView的註解");
  //設定邏輯檢視
  modelAndView.setViewName("show");
  return modelAndView;
 }
 
 /**
  * 業務方法:Model傳值,String進行檢視解析
  */
 @RequestMapping("/ModelTest")
 public String ModelTest(Model model){
  //填充模型資料
  model.addAttribute("name","這是Model傳值(註解方式)");
  //設定邏輯檢視
  return "show";
 }
 
 /**
  * 業務方法:Map傳值,String進行檢視解析
  */
 @RequestMapping("/MapTest")
 public String MapTest(Map<String,String> map){
  //填充模型資料
  map.put("name", "這是Map傳值方式(註解)");
  //設定邏輯
  return "show";
 }
}

(4)建立springmvc.xml檔案,實現ViewResolver的對映

<?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">
    
    <!-- 將AnnotationHandler自動掃描到IOC容器中 -->
    <context:component-scan base-package="com.demo.handler"></context:component-scan>
 
 <!-- 配置檢視解析器 -->
 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <!-- 配置字首 -->
  <property name="prefix" value="/"></property><!-- 單斜槓表示根目錄,配置前後綴針對MyHandler中的邏輯檢視而言 -->
  <!-- 配置字尾 -->
  <property name="suffix" value=".jsp"></property>
 </bean>
</beans>

(5)啟動tomcat伺服器,輸入專案地址以及AnnotationHandler的RequestMapping值
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

第四章 案例

4-1 案例一:新增商品(JSP)
需求:新增商品資訊(名字,價格),後臺對資料進行封裝,封裝好後再進行展示,再回到前臺。
(1)目錄結構,樣式採用BootStrap。
在這裡插入圖片描述
(2)在pom.xml中引入對應依賴,和前面講述的一樣
(3)建立add.jsp檔案,作為商品的輸入頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<link href="lib/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
<style type="text/css">
 body{
  over-flow-x:hidden;
 }
</style>
</head>
<body>
 <form class="form-horizontal" role="form" action="addGoods" method="post">
     <div class="form-group">
         <label class="col-sm-1 control-label">名稱</label>
         <div class="col-sm-3">
             <input type="text" class="form-control" name="name" placeholder="請輸入商品名稱">
         </div>
     </div>
     <div class="form-group">
         <label class="col-sm-1 control-label">價格</label>
         <div class="col-sm-3">
             <input type="text" class="form-control" name="price" placeholder="請輸入商品價格">
         </div>
     </div>
     <div class="form-group">
         <div class="col-sm-offset-1 col-sm-3">
             <button type="submit" class="btn btn-default">提交</button>
         </div>
     </div>
 </form>
</body>
</html>

(4)為解決中文亂碼,CSS樣式問題,在web.xml檔案中作好配置

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  
  <!-- 處理中文亂碼,filter過濾器 -->
  <filter>
   <filter-name>encodingFilter</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>
   <init-param>
    <param-name>forceEncoding</param-name>
    <param-value>true</param-value>
   </init-param>
  </filter>
  <filter-mapping>
   <filter-name>encodingFilter</filter-name>
   <url-pattern>/*</url-pattern><!-- 捕獲所有請求 -->
  </filter-mapping>
  
  <!-- 前置控制器 -->
  <servlet>
   <servlet-name>SpringMVC</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 <init-param><!-- 初始化引數,指定springmvc的路徑 -->
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:springmvc.xml</param-value>
 </init-param>
  </servlet>
  
  <!-- Servlet-mapping對映 -->
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  
    <!-- 設定訪問靜態資源 -->
  <servlet-mapping>
   <servlet-name>default</servlet-name>
   <url-pattern>*.css</url-pattern><!-- 捕獲所有css樣式 -->
  </servlet-mapping>
</web-app>

(5)建立springmvc.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">
    
    <!-- 將AnnotationHandler自動掃描到IOC容器中 -->
    <context:component-scan base-package="com.demo.handler"></context:component-scan>
 
 <!-- 配置檢視解析器 -->
 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <!-- 配置字首 -->
  <property name="prefix" value="/"></property><!-- 單斜槓表示根目錄,配置前後綴針對MyHandler中的邏輯檢視而言 -->
  <!-- 配置字尾 -->
  <property name="suffix" value=".jsp"></property>
 </bean>
</beans>

(6)建立AnnotationHandler.java檔案

@Controller  //通過註解的方式告訴springmvc,這是一個控制器
public class AnnotationHandler {
 /**
  * 新增商品並展示
  */
 @RequestMapping("/addGoods")
 public ModelAndView addGoods(Goods goods){
  System.out.println(goods.getName()+"\t"+goods.getprice());
  //建立ModelAndView物件
  ModelAndView modelAndView = new ModelAndView();
  //填充模型資料,將Goods傳入到頁面中
  modelAndView.addObject("goods",goods);
  //設定邏輯檢視
  modelAndView.setViewName("showGoods");
  return modelAndView;
 }
}

(7)建立showGoods.jsp檔案,顯示輸入的商品

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %><!-- 是否忽略EL -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
 商品名稱:${requestScope.goods.name}<br/>
   商品價格:${requestScope.goods.price}
</body>
</html>

在這裡插入圖片描述
4-2 案例二:靜態頁面的跳轉(超連結並傳值,表單,替換當前頁面內容)
(1)目錄結構
在這裡插入圖片描述
(2)pom.xml引入如之前案例的servlet,springMVC的依賴。
(3)配置web.xml檔案

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <!-- 前置控制器 -->
  <servlet>
   <servlet-name>SpringMVC</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 <init-param><!-- 初始化引數,指定springmvc的路徑 -->
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:springmvc.xml</param-value>
 </init-param>
  </servlet>
  <!-- Servlet-mapping對映 -->
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

(4)配置springmvc.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:mvc="http://www.springframework.org/schema/mvc"
       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
            http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
    
    <!-- 將AnnotationHandler自動掃描到IOC容器中 -->
    <context:component-scan base-package="com.demo.handler"></context:component-scan>
    <!-- 註解的意思是 全攔截只預設處理 servlet請求,不處理靜態資源  html css js -->           
    <mvc:default-servlet-handler/> 
    <!-- 開啟註解 -->
    <mvc:annotation-driven/>
     
 <!-- 配置檢視解析器 -->
 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <!-- 配置字首 -->
  <property name="prefix" value="/"></property><!-- 單斜槓表示根目錄,配置前後綴針對MyHandler中的邏輯檢視而言 -->
  <!-- 配置字尾 -->
  <property name="suffix" value=".html"></property>
 </bean>
</beans>

(5)建立FirstController.java檔案

@Controller
public class FirstController {
 @RequestMapping("/getFirest")  //訪問的url
 public String getFirest(){
  System.out.println("請求到了我的這個方法");
  return "success";
 }
 
 @RequestMapping("/ShowName")
 public void ShowName(HttpServletRequest request,HttpServletResponse response) throws IOException{
  String name = request.getParameter("name");
  response.getWriter().write(name+" is a good person");
 }
 
 @RequestMapping(value="/ShowFormName",method=RequestMethod.POST)
 public String ShowFormName(String name,HttpServletResponse response){
  System.out.println(name);
  return "success";
 }
}

(6)超連結從test.html跳轉到success.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 <a href="getFirest">測試</a>
</body>
</html>

在這裡插入圖片描述
(7)表單傳值,替換當前頁面內容

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 <form action="ShowName" method="POST">
  姓名:<input type="text" name="name"><input type="submit" value="提交">
 </form>
</body>
</html>

在這裡插入圖片描述
(8)超連結替換當前頁面內容

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 <a href="ShowName?name=Tom">測試</a>
</body>
</html>

在這裡插入圖片描述
4-3 案例三:使用者註冊(html)
(1)目錄結構
在這裡插入圖片描述
(2)pom.xml,springmvc.xml參考4-2案例。
(3)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>
  <display-name>Archetype Created Web Application</display-name>
  <!-- 處理中文亂碼,filter過濾器 -->
  <filter>
   <filter-name>encodingFilter</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>
   <init-param>
    <param-name>forceEncoding</param-name>
    <param-value>true</param-value>
   </init-param>
  </filter>
  <filter-mapping>
   <filter-name>encodingFilter</filter-name>
   <url-pattern>/*</url-pattern><!-- 捕獲所有請求 -->
  </filter-mapping>
  <!-- 前置控制器 -->
  <servlet>
   <servlet-name>SpringMVC</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 <init-param><!-- 初始化引數,指定springmvc的路徑 -->
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:springmvc.xml</param-value>
 </init-param>
  </servlet>
  <!-- Servlet-mapping對映 -->
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <!-- 設定訪問靜態資源 -->
  <servlet-mapping>
   <servlet-name>default</servlet-name>
   <url-pattern>*.css</url-pattern><!-- 捕獲所有css樣式 -->
  </servlet-mapping>
</web-app>

(4)建立User.java檔案

public class User {
 private String username;
 private Integer passWorld;
}

(5)建立FirstController.java檔案

@Controller
public class FirstController {
 @RequestMapping(value="/register",method=RequestMethod.POST)
 public String register(User user,HttpSession session){
  if(user!=null){
   System.out.println(user);
   session.setAttribute("message", "註冊成功");
  }else{
   session.setAttribute("message", "註冊失敗");
  }
  return "success";
 } 
}

(6)建立registerTest.html檔案

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 <form action="register" method="POST">
  <h1>註冊頁面</h1>
  姓名:<input type="text" name="username"><br>
  密碼:<input type="text" name="passWorld">
  <input type="submit" value="註冊">
 </form>
</body>
</html>

(7)執行測試結果
在這裡插入圖片描述

第五章 總結

(1)SpringMVC基本概念
(2)SpringMVC底層實現原理
(3)SpringMVC的使用(基於XML,基於註解)