spring MVC入門示例(hello world demo)

1. Spring MVC介紹

Spring Web MVC是一種基於Java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架,即使用了MVC架構模式的思想,將web層進行職責解耦,基於請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發,Spring Web MVC也是要簡化我們日常Web開發的。

Spring Web MVC也是服務到工作者模式的實現,但進行可優化。前端控制器是DispatcherServlet;應用控制器其實拆爲處理器映射器(Handler Mapping)進行處理器管理和視圖解析器(View Resolver)進行視圖管理;頁面控制器/動作/處理器爲Controller接口(僅包含ModelAndView handleRequest(request, response) 方法)的實現(也可以是任何的POJO類);支持本地化(Locale)解析、主題(Theme)解析及文件上傳等;提供了非常靈活的數據驗證、格式化和數據綁定機制;提供了強大的約定大於配置(慣例優先原則)的契約式編程支持。

2. Spring MVC的優點

  • 讓我們能非常簡單的設計出乾淨的Web層和薄薄的Web層;
  • 進行更簡潔的Web層的開發;
  • 天生與Spring框架集成(如IoC容器、AOP等);
  • 提供強大的約定大於配置的契約式編程支持;
  • 能簡單的進行Web層的單元測試;
  • 支持靈活的URL到頁面控制器的映射;
  • 非常容易與其他視圖技術集成,如Velocity、FreeMarker等等,因爲模型數據不放在特定的API裏,而是放在一個Model裏(Map數據結構實現,因此很容易被其他框架使用);
  • 非常靈活的數據驗證、格式化和數據綁定機制,能使用任何對象進行數據綁定,不必實現特定框架的API;
  • 提供一套強大的JSP標籤庫,簡化JSP開發;
  • 支持靈活的本地化、主題等解析;
  • 更加簡單的異常處理;
  • 對靜態資源的支持;
  • 支持Restful風格。

2. 環境配置

新建一個web工程,file->new->web project,取名爲SpringMVC。將spring中的jar中複製到SpringMVC/WEB-INF/lib下。spring中有些與struts相關的包可以不復制,因爲這裏用不到。除此之外,還需要

commons-logging.jar/jstl.jar/standard.jar這三個依賴包。配置完後,lib下的jar包如下所示:

3. 入門示例

3.1 我們首先從web.xml開始配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name>SpringMVC</display-name>   
   
    <servlet> 
        <servlet-name>SpringMVC</servlet-name> 
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class
        <load-on-startup>1</load-on-startup> 
        </servlet> 
    <servlet-mapping> 
        <servlet-name>SpringMVC</servlet-name> 
        <url-pattern>/</url-pattern> 
    </servlet-mapping>
     
    <welcome-file-list>
        <welcome-file>MyJsp.jsp</welcome-file>
    </welcome-file-list>
</web-app>

load-on-startup:表示啓動容器時初始化該Servlet;

url-pattern:表示哪些請求交給Spring Web MVC處理, “/” 是用來定義默認servlet映射的。也可以如“*.html”表示攔截所有以html爲擴展名的請求。

自此請求已交給Spring Web MVC框架處理,因此我們需要配置Spring的配置文件,默認DispatcherServlet會加載WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml配置文件。本示例爲WEB-INF/ SpringMVC-servlet.xml。

3.2 再來配置SpringMVC-servlet.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
    xmlns:p="http://www.springframework.org/schema/p"    
    xmlns:context="http://www.springframework.org/schema/context"    
    xmlns:mvc="http://www.springframework.org/schema/mvc"    
    xsi:schemaLocation="     
           http://www.springframework.org/schema/beans     
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     
           http://www.springframework.org/schema/context     
           http://www.springframework.org/schema/context/spring-context-3.0.xsd    
           http://www.springframework.org/schema/mvc     
           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 
     
    <bean name="/test1/helloWorld" class="com.SpringMVC.web.controller.HelloWorldController" /> 
     
    <!-- ViewResolver --> 
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF"/> 
        <property name="suffix" value=".jsp"/> 
    </bean>
     
</beans>

InternalResourceViewResolver:用於支持Servlet、JSP視圖解析;

prefix和suffix:查找視圖頁面的前綴和後綴(前綴[邏輯視圖名]後綴),比如傳進來的邏輯視圖名爲hello,則該jsp視圖頁面應該存放在“WEB-INF/hello.jsp”;

<bean name="test1/helloWorld" ... />這裏表示傳來的url與代碼中的controller的對應關係。

3.3 下面我們來寫controller類代碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.SpringMVC.web.controller;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
 
 
public class HelloWorldController implements Controller{
 
    public ModelAndView handleRequest(HttpServletRequest arg0,
            HttpServletResponse arg1) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("--------------hello world! 世界你好!--------------------");
        return new ModelAndView("/helloWorld");
    }
}

這裏實現了一個接口,重寫了其中的handleRequest函數。函數中,在後臺打印一段文件,並將helloWorld.jsp頁面返回給瀏覽器。因爲在-servlet.xml中進行了配置,所以helloWorld.jsp文件應在WEB-INF文件夾下,且此處返回時僅寫helloWorld即可,無需加後綴.jsp。

3.4 jsp頁面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
     
    <title>Hello World!</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">   
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
   
  <body>
    -----------------Hello World! ----------------------<br>
  </body>
</html>

3.5 完成後的目錄結構

1
2
3
4
5
6
7
8
9
10
SpringMVC
  src
    com.SpringMVC.web.controller
      HelloWorldController.java
  WebRoot
    WEB-INF
      lib
      helloWorld.jsp
      SpringMVC-servlet.xml
      web.xml

5. 運行、訪問頁面

將SpringMVC部署到tomcat服務器上,運行。在瀏覽器中輸入訪問地址:http://localhost:8080/SpringMVC/test1/helloWorld。應該就可以看到前臺顯示helloWorld.jsp頁面,後臺打印“--------------hello world! 世界你好!--------------------”字符串了。

6. 遇到的小問題

我最先開始配置-servlet.xml文件時,將<property name="prefix" value="/WEB-INF"/> 配置爲 <property name="prefix" value="/"/>,即返回SpringMVC根目錄,即WebRoot的jsp頁面。結果,後臺可以打印出預期的字符串,而jsp頁面卻提示找不到資源,404錯誤,可是事實上我已經將helloWorld.jsp頁面放置在SpringMVC的根目錄下了。不知道這是爲什麼……


注:6 中的小問題可以通過將<property name="prefix" value="/WEB-INF"/>改成<property name="prefix" value="/WEB-INF/" />解決

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章