Spring MVC入門
第一章 概述
- Spring MVC快速入門
- Spring MVC詳解
- Spring MVC的使用
- 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,基於註解)