SpringMVC 學習筆記(一) Hello World

u013457570發表於2016-12-18

springMVC概述:

spring MVC 是目前最主流的MVC 框架之一

Spring MVC 通過一套 MVC 註解,讓 POJO 成為處理請

求的控制器,而無須實現任何介面。

支援 REST 風格的 URL 請求

採用了鬆散耦合可插拔元件結構,比其他 MVC 框架更具

擴充套件性和靈活性

專案結構圖:


pom.xml:

[html] view plain copy
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  3.     <modelVersion>4.0.0</modelVersion>  
  4.     <groupId>com.ibigsea</groupId>  
  5.     <artifactId>springmvc</artifactId>  
  6.     <packaging>war</packaging>  
  7.     <version>0.0.1-SNAPSHOT</version>  
  8.     <name>springmvc</name>  
  9.     <url>http://maven.apache.org</url>  
  10.     <dependencies>  
  11.         <dependency>  
  12.             <groupId>org.springframework</groupId>  
  13.             <artifactId>spring-core</artifactId>  
  14.             <version>${spring_version}</version>  
  15.         </dependency>  
  16.         <dependency>  
  17.             <groupId>org.springframework</groupId>  
  18.             <artifactId>spring-web</artifactId>  
  19.             <version>${spring_version}</version>  
  20.         </dependency>  
  21.         <dependency>  
  22.             <groupId>org.springframework</groupId>  
  23.             <artifactId>spring-webmvc</artifactId>  
  24.             <version>${spring_version}</version>  
  25.         </dependency>  
  26.         <dependency>  
  27.             <groupId>org.springframework</groupId>  
  28.             <artifactId>spring-context</artifactId>  
  29.             <version>${spring_version}</version>  
  30.         </dependency>  
  31.         <dependency>  
  32.             <groupId>org.springframework</groupId>  
  33.             <artifactId>spring-aop</artifactId>  
  34.             <version>${spring_version}</version>  
  35.         </dependency>  
  36.         <dependency>  
  37.             <groupId>org.springframework</groupId>  
  38.             <artifactId>spring-beans</artifactId>  
  39.             <version>${spring_version}</version>  
  40.         </dependency>  
  41.         <dependency>  
  42.             <groupId>org.springframework</groupId>  
  43.             <artifactId>spring-expression</artifactId>  
  44.             <version>${spring_version}</version>  
  45.         </dependency>  
  46.         <dependency>  
  47.             <groupId>javax.servlet.jsp.jstl</groupId>  
  48.             <artifactId>jstl-api</artifactId>  
  49.             <version>1.2</version>  
  50.         </dependency>  
  51.         <dependency>  
  52.             <groupId>jstl</groupId>  
  53.             <artifactId>jstl</artifactId>  
  54.             <version>1.2</version>  
  55.         </dependency>  
  56.         <dependency>  
  57.             <groupId>junit</groupId>  
  58.             <artifactId>junit</artifactId>  
  59.             <version>3.8.1</version>  
  60.             <scope>test</scope>  
  61.         </dependency>  
  62.     </dependencies>  
  63.   
  64.     <properties>  
  65.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  66.         <spring_version>4.1.2.RELEASE</spring_version>  
  67.     </properties>  
  68.   
  69.     <build>  
  70.         <finalName>springmvc</finalName>  
  71.         <plugins>  
  72.             <plugin>  
  73.                 <groupId>org.apache.maven.plugins</groupId>  
  74.                 <artifactId>maven-compiler-plugin</artifactId>  
  75.                 <version>2.3.2</version>  
  76.                 <configuration>  
  77.                     <source>1.7</source>  
  78.                     <target>1.7</target>  
  79.                 </configuration>  
  80.             </plugin>  
  81.         </plugins>  
  82.     </build>  
  83.   
  84. </project>  

Web.xml:

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xmlns="http://java.sun.com/xml/ns/javaee"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
  5.     version="3.0" >  
  6.     <!-- The front controller of this Spring Web application, responsible for handling all application requests -->  
  7.     <servlet>  
  8.         <servlet-name>springDispatcherServlet</servlet-name>  
  9.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  10.         <!-- 載入spirng配置檔案 -->  
  11.         <init-param>  
  12.             <param-name>contextConfigLocation</param-name>  
  13.             <param-value>classpath:spring-mvc.xml</param-value>  
  14.         </init-param>  
  15.         <!-- 啟動就載入 -->  
  16.         <load-on-startup>1</load-on-startup>  
  17.     </servlet>  
  18.   
  19.     <!-- 攔截所有請求 -->  
  20.     <servlet-mapping>  
  21.         <servlet-name>springDispatcherServlet</servlet-name>  
  22.         <url-pattern>/</url-pattern>  
  23.     </servlet-mapping>  
  24. </web-app>  
  25.       

通過在web.xml配置DispatcherServlet前端控制器, web容器 啟動時載入,並且進行初始化.

因為HttpServlet繼承了HttpServlet 所以在web容器啟動執行時將會呼叫 init() 方法


其中initServletBean() 是HttpServletBean 提供給子類擴充套件的

FrameworkServlet 繼承了 HttpServletBean 實現了initServletBean()這個方法,web上下文進行初始化 並且提供了onRefresh(wac) 方法給子類實現   




DispatcherServlet繼承了 FrameworkServlet 實現了onRefresh()這個方法


如果 web.xml中沒有指定 contextConfigLocation . 則使用servlet-name 尋找xml檔案.





 HelloWorld.java 

[java] view plain copy
  1. package com.ibigsea.springmvc.helloworld;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5.   
  6. @Controller  
  7. public class HelloWorld {  
  8.       
  9.     /** 
  10.      * 配置@RequestMapping 攔截 localhost:8080/springmvc/hello 請求  
  11.      * @return 
  12.      */  
  13.     @RequestMapping("/hello")  
  14.     public String helloWorld(){  
  15.   
  16.         System.out.println("hello world");  
  17.         return "helloworld";  
  18.     }  
  19. }  

 RequestMapping

詳情請見第2章節

Spirng-mvc.xml

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd  
  7.         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
  8.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">  
  9.     <!-- 配置自動掃描包  掃描com.ibigsea.springmvc 包下的類 -->  
  10.     <context:component-scan base-package="com.ibigsea.springmvc"/>  
  11. <!-- 配置檢視解析器 如返回helloworld       
  12.                          為 [/WEB-INF/pages/helloworld.jsp] -->  
  13.     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  14.      <!-- 字首 -->  
  15.         <property name="prefix" value="/WEB-INF/pages/"/>  
  16.          <!-- 字尾 -->  
  17.         <property name="suffix" value=".jsp"/>  
  18.     </bean>  
  19. </beans>  

當訪問 http://localhost:8080/springmvc/hello 後 DispatcherServlet 會攔截請求 



InternalResourceViewResolver 繼承了 UrlBasedViewResolver 最終通過buildView() 解析



重定向和轉發

一般情況下,控制器方法返回字串型別的值會被當成邏輯檢視名處理

• 如果返回的字串中帶 forward: 或 redirect: 字首時,SpringMVC 會對他們進行特殊處理:將 forward: redirect: 當成指示符,其後的字串作為 URL 來處理

– redirect:helloworld.jsp:會完成一個到 helloworld.jsp 的重定向的操作

– forward:helloworld.jsp:會完成一個到 helloworld.jsp 的轉發操作

 

在 UrlBasedViewResolver 類裡面的 createView 方法 解析

 

相關文章