1.SpringMVC概述
1.1 SpringMVC的歷史
SpringMVC 它可以稱為一個(gè)解決 JavaEE 開發(fā)的 B/S 架構(gòu)項(xiàng)目的表現(xiàn)層的 MVC 的框架笔喉。其實(shí)在 SpringFramework項(xiàng)目中只是一個(gè)子模塊而已罗捎,最開始在SpringFramework項(xiàng)目中沒有SpringMVC子模塊,在一段時(shí)間里慢慢發(fā)展起來解決表現(xiàn)層業(yè)務(wù)邏輯的時(shí)候乎芳,才有了Springmvc 這樣的子模塊是在 SpringFramework項(xiàng)目中基于(AOP IOC 為基礎(chǔ)發(fā)展起來的),Springmvc 模塊應(yīng)該依賴 ioc 以及 aop。
Spring MVC屬于SpringFrameWork的后續(xù)產(chǎn)品帖池,已經(jīng)融合在Spring Web Flow里面奈惑。Spring 框架提供了構(gòu)建 Web 應(yīng)用程序的全功能 MVC 模塊。使用 Spring 可插入的 MVC 架構(gòu)睡汹,從而在使用Spring進(jìn)行WEB開發(fā)時(shí)肴甸,可以選擇使用Spring的SpringMVC框架或集成其他MVC開發(fā)框架,如Struts1囚巴,Struts2等原在。
1.2. Springmvc是什么友扰?
Springmvc 也是一個(gè)類似于struts2框架的基于MVC 設(shè)計(jì)模式的表現(xiàn)層框架
1.2.1JAVAEE 開發(fā)應(yīng)用采用經(jīng)典的三層架構(gòu)
- 表現(xiàn)層:完成跟客戶端進(jìn)行數(shù)據(jù)交互的, 處理數(shù)據(jù)以及模型跳轉(zhuǎn)的。
- 業(yè)務(wù)邏輯層:完成數(shù)據(jù)針對(duì)需求進(jìn)行數(shù)據(jù)加工作處理
- 數(shù)據(jù)訪問層(持久層): 完成對(duì)數(shù)據(jù)的持久化到數(shù)據(jù)庫提供操作對(duì)象
1.2.2 MVC 設(shè)計(jì)模式 沒在Java 23種設(shè)計(jì)模式中
- Model(模型):數(shù)據(jù)模型(POJO)以及業(yè)務(wù)模型(Service層中)
- View(視圖):模型渲染庶柿、填充模型數(shù)據(jù)用 Jsp 村怪、 pdf 、freemarker
- Controller(控制器):Filter浮庐、Servlet作為中央控制器
2. SpringMVC 第一個(gè)程序
2.1 pom 文件配置 (導(dǎo)包)
<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>com.xingxue.springmvc</groupId>
<artifactId>springmvc-demo1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<!-- 導(dǎo)入 springmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<!-- 導(dǎo)入 servlet 相關(guān)依賴 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<!-- 最小支持的 編譯版本 -->
<target>1.7</target>
<!-- 1.7 編譯源碼 -->
<source>1.7</source>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.2 配置 web.xml (應(yīng)用的描述文件)甚负,服務(wù)器啟動(dòng)的時(shí)候,要去讀
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<!--
mvc 框架 都有兩種控制器:
1.前端控制器 (框架提供) StrutsPrepareAndExectuteFilter (Filter ) 审残、 DispatcherServlet (Servlet)
2.頁面控制器(程序員自己定義) UserAction梭域、RoleAction...... 、 UserController搅轿、RoleController
(Action Contoller Handler)
Filter vs Servlet 區(qū)別:
相同點(diǎn):都可以處理http 請(qǐng)求:
Filter : public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
Servlet:public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
不同點(diǎn):Filter 功能要比 Servlet 強(qiáng)大病涨。 FilterChain chain 實(shí)現(xiàn)請(qǐng)求預(yù)處理
-->
<servlet>
<!-- DispatcherServlet 組件在init 初始化的時(shí)候,會(huì)去讀取 mvc 配置文件 -->
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc.xml</param-value>
</init-param>
<!-- Servlet 組件創(chuàng)建的時(shí)候是在第一次請(qǐng)求來的時(shí)候才會(huì)創(chuàng)建璧坟,配上下面可以使 Servlet 組件在應(yīng)用啟動(dòng)的時(shí)候就被創(chuàng)建 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<!-- Tomcat 有一個(gè) rg.apache.catalina.servlets.DefaultServlet 默認(rèn)攔截 / 既穆,可以處理靜態(tài)數(shù)據(jù)(html css js...)
DispatcherServlet 前端控制器 配置上 / 也就覆蓋了DefaultServlet
如果不配,就使用不了Spring mvc 提供的 restFul 風(fēng)格的網(wǎng)絡(luò)資源架構(gòu)
restFul :不是一種技術(shù)實(shí)現(xiàn)雀鹃,它是一種網(wǎng)絡(luò)資源架構(gòu)規(guī)則
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2.3 開發(fā) Controller 控制器
//頁面控制器
@Controller
public class UserController {
@RequestMapping(value="/hello")
public String hello() {
System.out.println("請(qǐng)求來了...");
return "ok";
}
}
2.4 mvc.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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
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-4.0.xsd">
<!-- 靜態(tài)資源處理 -->
<mvc:default-servlet-handler/>
<context:component-scan base-package="com.xingxue"></context:component-scan>
<mvc:annotation-driven/>
<!-- 內(nèi)部資源視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
3. @RequestMapping 請(qǐng)求映射注解
- 該注解用于映射請(qǐng)求 是通過 該注解的 value 屬性來映射循衰。
- 該注解可以修飾在類上,也可以修飾在方法上:如果修飾在類上會(huì)自動(dòng)在每個(gè)方法的url路徑上加上類上的前綴
- 該注解可以使用 method 屬性來映射 請(qǐng)求方式
- 該注解可以使用params 屬性來映射 請(qǐng)求攜帶的參數(shù)
總結(jié) : RequestMapping 注解中的 value 屬性用來映射 url褐澎,method屬性用于映射請(qǐng)求方式,params 屬性用于 映射 請(qǐng)求攜帶的參數(shù)
4.Springmvc 處理請(qǐng)求流程
1.頁面發(fā)出請(qǐng)求到 dispatcherServlet中央控制器進(jìn)行處理
2.中央控制器調(diào)用 處理器映射器 HandelMapping 查詢 Handel
3.處理器映射處理完畢后会钝,返回Handel 以及 HandelExcutionChain(攔截器鏈)
4.中央控制器調(diào)用 處理器適配器 執(zhí)行Handle
5.處理適配器調(diào)用真正的Handel執(zhí)行
6.Handle執(zhí)行完畢后,返回ModelAndView
7.處理器適配器ModelAndView返回給中央控制器
8.中央控制器調(diào)用視圖解析器查詢具體的View
9.視圖解析器返回真正的View 地址
10.中央控制器調(diào)用View 執(zhí)行 數(shù)據(jù)模型的 渲染
11.響應(yīng)請(qǐng)求
總結(jié):
- 玩 springmvc 要配置好 一中心(dispatcherServlet) 三器(HandelMapping工三、 HandelApater 迁酸、 ViewResoler)但是一中心要在web.xml 文件配置 、 三器沒有特殊需求的時(shí)候可以不配俭正,三器在springmvc 配置文件中配置奸鬓,但是視圖解析器要顯示去配置一下(原因視圖的位置將來不確定)
- 為什么三器不用配置:前端控制器dispatcherServlet 在創(chuàng)建完成后會(huì)自動(dòng)加載dispatcherServlet.properties 文件,在該文件中就已經(jīng)配置了相應(yīng)的三器的實(shí)現(xiàn)掸读,如果在springmvc.xml 配置文件中顯示的配置了默認(rèn)的三器串远,就會(huì)覆蓋默認(rèn)的配置
- 程序員:只需要編寫View Handel
5.@RequestParam映射請(qǐng)求參數(shù)
該注解用于映射請(qǐng)求參數(shù)
該注解中的value 屬性 用于匹配http 請(qǐng)求過來的參數(shù)的名字
該注解中的required 屬性用于限定請(qǐng)求是否必須攜帶參數(shù),默認(rèn)是true
注解中的defaultValue 屬性用于沒有攜帶請(qǐng)求參數(shù)的時(shí)候儿惫,給方法變量賦默認(rèn)值
可以利用 Controller 動(dòng)作類方法的簽名的方式來獲取請(qǐng)求參數(shù)值澡罚,保證頁面參數(shù)的名稱要跟方法中的形參名稱一致,如果方法形參為POJO 類型肾请,要保證頁面參數(shù)的名稱要跟方法中形參POJO中的屬性名稱一致留搔,滿足以上規(guī)則可以接收頁面數(shù)據(jù)
處理頁面數(shù)據(jù)中文亂碼問題
在 web.xml 應(yīng)用描述文件中配置
<!-- 引入spring 提供的 POST 提交方式的中文亂碼過濾器 :注意一點(diǎn) 提供的 中文亂碼過濾器只能處理 POST -->
<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>
- RestFul風(fēng)格的模板URL 攜帶參數(shù)方式:方便后期做網(wǎng)站的SEO優(yōu)化
獲取模板參數(shù)使用 @PathVariable
@RequestMapping(value="m4/{id}",method=RequestMethod.GET)
public String m4 (@PathVariable(value="id") String id) {
System.out.println(id);
return "ok";
}
- forward指令和redirect指令
forward指令:可以實(shí)現(xiàn)視圖的轉(zhuǎn)發(fā)以及動(dòng)作的轉(zhuǎn)發(fā)
redirect 指令:可以實(shí)現(xiàn)視圖的重定向以及動(dòng)作的重定向
指令的格式:
forward:/xxx.jsp
redirect :/xxx.jsp
如果Handler 方法執(zhí)行完畢后返回的字符串帶有forward 或者redirect ,視圖解析器就會(huì)另外處理铛铁,不會(huì)在返回的字符串前后加前綴和后綴
6.Springmvc 提供的隱式對(duì)象
- 隱式對(duì)象:不需要程序員自己創(chuàng)建的對(duì)象隔显,springmvc 自動(dòng)會(huì)創(chuàng)建的對(duì)象却妨。拿來就使用
- 框架提供的隱式對(duì)象:ModelAndView 、 Model 括眠、 ModelMap 彪标、 Map ,HttpServletRequest掷豺、HttpServletResponse等對(duì)象可以把數(shù)據(jù)放入到模型中捐下,自動(dòng)的放入到請(qǐng)求域中
擴(kuò)展:
框架還可以自動(dòng)注入 HttpSession 、 HttpServletRequest 萌业、 HttpServletResponse 等
- 利用 框架提供的 隱式對(duì)象來完成數(shù)據(jù)向頁面?zhèn)鬟f