1. 程式人生 > >spring(五)spring web MVC

spring(五)spring web MVC

ports 字符 web-inf 第一次 internal col art 下一個 handle

原教程: https://www.w3cschool.cn/wkspring/

  • 模型封裝了應用程序數據,並且通常它們由 POJO 組成。

  • 視圖主要用於呈現模型數據,並且通常它生成客戶端的瀏覽器可以解釋的 HTML 輸出。

  • 控制器主要用於處理用戶請求,並且構建合適的模型並將其傳遞到視圖呈現。

DispatcherServlet

spring MVC是圍繞DispatcherServlet 設計的,DispatcherServlet 用來處理所有的 HTTP 請求和響應。

技術分享圖片

DispatcherServlet 接收到HTTP請求後:

  • DispatcherServlet
    根據 HandlerMapping 來選擇並且調用適當的控制器
  • 控制器接受請求,並基於使用的 GET 或 POST 方法來調用適當的 service 方法。並返回視圖名稱到 DispatcherServlet 中。

  • DispatcherServlet 會從 ViewResolver 為請求檢取定義視圖。

  • 一旦確定視圖,DispatcherServlet 將把模型數據傳遞給視圖,最後呈現在瀏覽器中

框架的使用

1. DispatcherServlet配置

 1 // WebContent/WEB-INF/web.xml
  <web-app id="WebApp_ID" version="2.4" 2
xmlns="http://java.sun.com/xml/ns/j2ee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 5 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 6 <display-name>Spring MVC Application</display-name> 7 <servlet> 8
<servlet-name>HelloWeb</servlet-name> 9 <servlet-class> 10 org.springframework.web.servlet.DispatcherServlet 11 </servlet-class> 12 <load-on-startup>1</load-on-startup> 13 </servlet> 14 <servlet-mapping> 15 <servlet-name>HelloWeb</servlet-name> 16 <url-pattern>*.jsp</url-pattern> 17 </servlet-mapping> 18 </web-app>
  • 在初始化HelloWeb DispatcherServlet時,框架會嘗試加載WebContent/WEB-INF/[servlet-name]-servlet.xml文件,此處改文件為HelloWeb-servlet.xml.
  • <url-pattern>指定該servlet服務的對象,此處是只用於處理jsp文件的請求
  • 默認[servlet-name]-servlet.xml文件的更名
    • 在 web.xml 文件中添加 servlet 監聽器 ContextLoaderListener 自定義該文件的名稱和位置
    • <param-value>中指定新名字
 1 // web.xml
 2 <web-app...>
 3 
 4 ....
 5 <context-param>
 6    <param-name>contextConfigLocation</param-name>
 7    <param-value>/WEB-INF/HelloWeb-servlet.xml</param-value>
 8 </context-param>
 9 <listener>
10    <listener-class>
11       org.springframework.web.context.ContextLoaderListener
12    </listener-class>
13 </listener>
14 </web-app>
15 
16 // WebContent/WEB-INF/HelloWeb-servlet.xml
17 <beans xmlns="http://www.springframework.org/schema/beans"
18    xmlns:context="http://www.springframework.org/schema/context"
19    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
20    xsi:schemaLocation="
21    http://www.springframework.org/schema/beans
22    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
23    http://www.springframework.org/schema/context 
24    http://www.springframework.org/schema/context/spring-context-3.0.xsd">
25 
26    <context:component-scan base-package="com.tutorialspoint" />
27 
28    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
29       <property name="prefix" value="/WEB-INF/jsp/" />
30       <property name="suffix" value=".jsp" />
31    </bean>
32 
33 </beans>

<context:component-scan>用於激活spring MVC註釋掃描功能,如@Controller和@RequestMapping等

InternalResourceViewResolver定義了檢索視圖的規則。一個名稱為 hello 的邏輯視圖將發送給位於 /WEB-INF/jsp/hello.jsp

2. 定義控制器

  • 控制器聲明:@Controller註解一個類,表示該類是一個控制器類
  • @RequestMapping用於映射URL到整個類或者某個方法

示例1:

1 @Controller
2 @RequestMapping("/hello")
3 public class HelloController{
4    @RequestMapping(method = RequestMethod.GET)
5    public String printHello(ModelMap model) {
6       model.addAttribute("message", "Hello Spring MVC Framework!");
7       return "hello";
8    }
9 }
  • @Controller 註釋定義該類作為一個 Spring MVC 控制器。
  • 第一次使用的 @RequestMapping 表明在該控制器中處理的所有方法都是相對於 /hello 路徑的。
  • 下一個註釋 @RequestMapping(method = RequestMethod.GET) 用於聲明 printHello() 方法作為控制器的默認 service 方法來處理 HTTP GET 請求。

示例2:

1 @Controller
2 public class HelloController{
3    @RequestMapping(value = "/hello", method = RequestMethod.GET)
4    public String printHello(ModelMap model) {
5       model.addAttribute("message", "Hello Spring MVC Framework!");
6       return "hello";
7    }
8 }
  • 在此service 方法中定義需要的業務邏輯,也可以根據需要調用其他方法
  • 在此方法中創建一個模型,模型屬性可以隨便設置,設置的屬性可以在視圖層(jsp文件)中通過${}顯示屬性值。如${message}
  • 此service 方法可以返回一個包含視圖名稱的字符串用於呈現該模型。這個示例返回 “hello” 作為邏輯視圖的名稱。

3. 創建jsp視圖

spring mvc支持的視圖有很多,比如JSP、HTML、PDF、Excel 工作表、XML、Velocity 模板、XSLT、JSON、Atom 和 RSS 提要、JasperReports 等等

1 // hello.jsp
2 <html>
3    <head>
4    <title>Hello Spring MVC</title>
5    </head>
6    <body>
7    <h2>${message}</h2>
8    </body>
9 </html>

spring mvc的標配文件

  • 註解類及service方法
  • web.xml (配置servlet)
  • [servlet-name]-servlet.xml
  • jsp視圖文件

spring mvc表單的處理

  • 用@Controller聲明控制器,並在其中定義GET或POST service方法,方法用@RequestMapping(value = "/方法名", method = RequestMethod.POST)來註解
  • GET或POST service方法中建立模型,並設置模型屬性(如表單內容),然後返回視圖名稱字符串(一般是jsp文件名)
  • web.xml中用DispatcherServlet定新的servlet
  • [servlet-name]-servlet.xml中定義ViewResolver bean(代碼固定)
  • 編寫jsp視圖文件(可展示service方法中的模型屬性)

註意表單文件中action的路徑問題,一般是servlet-name/service方法名

每個service方法都與一個網頁頁面關聯

spring mvc頁面重定向

 1 @Controller
 2 public class WebController {
 3    @RequestMapping(value = "/index", method = RequestMethod.GET)
 4    public String index() {
 5        return "index";
 6    }   
 7    @RequestMapping(value = "/redirect", method = RequestMethod.GET)
 8    public String redirect() {     
 9       return "redirect:finalPage";
10    }   
11    @RequestMapping(value = "/finalPage", method = RequestMethod.GET)
12    public String finalPage() {     
13       return "final";
14    }
15 }

spring(五)spring web MVC