整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          Spring MVC入門示例

          Spring MVC入門示例

          這個例子中,我們將使用SpringMVC框架構(gòu)建一個hello world的web應(yīng)用程序。SpringMVC是Spring框架中最重要的模塊之一。它以強大的Spring IOC容器為基礎(chǔ)并且充分的利用容器的特征來簡化它的配置。

          目錄表

          · 什么是MVC框架?

          · Dispatcher Servlet(Spring Controller)

          · Spring MVC Hello World例子

          · 運行時依賴

          · 配置web.xml和spring-servlet.xml文件

          · 請求處理器EmployeeController.java

          · 視圖模型EmployeeVO.java

          · Dao層類

          · Service層類

          · 視圖employeesListDisplay.jsp

          什么是MVC框架?

          Model-view-controller (MVC) 是一個眾所周知的以應(yīng)用程序為基礎(chǔ)的界面設(shè)計的設(shè)計模式。在一個應(yīng)用程序中,它主要是從UI中解耦業(yè)務(wù)邏輯通過分離model,view,和 controller的作用。通常,models是負責為當前視圖封裝應(yīng)用程序數(shù)據(jù)。views僅應(yīng)該展現(xiàn)這些數(shù)據(jù),并不包含任何業(yè)務(wù)邏輯。 controller是負責接收用戶的請求并調(diào)用后端services(manager or dao)進行業(yè)務(wù)邏輯處理。處理之后,后端services可能返回一些數(shù)據(jù)供views展示。Controllers 收集這些數(shù)據(jù)并且準備models給view展示。MVC模式的核心思想是從UI中分析業(yè)務(wù)邏輯以允許它們各自改變而不相互影響。



          在 一個SpringMVC應(yīng)用程序中,models通常由POJO對象組成,它被service層處理,在持久層被持久化。Views通常是用Java Standard Tag Library(JSTL)寫的JSP模板。Controller 部分是由dispatcher servlet來管理,我們將在這個教程中學習更多細節(jié)。

          一些開發(fā)者認為service層和DAO層類在MVC中是model的組成部分,在這里我有不同的觀點。我不認為service層和DAO層類是 MVC框架中的部分。通常一個web應(yīng)用程序是3層架構(gòu),即data-service-presentation。MVC通常是表現(xiàn)層 (presentation )的一部分。



          Dispatcher Servlet (Spring Controller)

          在 最簡單的Spring MVC應(yīng)用程序中,你需要在一個Java web部署描述(即web.xml)中配置的唯一的servlet。一個Spring MVC controller ——經(jīng)常被叫做一個實現(xiàn)front controller設(shè)計模式的Dispatcher Servlet,并且每個web請求必須通過它以至于它能管理所有的請求生命周期。

          當一個web請求發(fā)送到一個Spring MVC應(yīng)用程序時,dispatcher servlet首先接收這個請求。然后,它將在Spring’s web應(yīng)用上下文中組織不同的組件配置(例如:真實的請求處理控制器和視圖解析器)或者在controller本身中注解目前所有需要處理的請求。



          為了在Spring 3.0中定義一個controller類,類不得不被@Controller注解標記。當一個帶有@Controller注解的controller接收 一個請求,它會尋找一個適合的處理方法來處理請求。這就需要一個controller類映射每個請求到一個處理方法,通過一個或多個處理映射。為了如此, 一個controller類的方法會被@RequestMapping注解來修飾,使它們成為處理方法。

          一個處理方法處理請求完成后,它將控制權(quán)委托給視圖,表示為處理方法的返回值。為了提供一個靈活的方法,一個處理方法的返回值不代表一個視圖的實 現(xiàn),但是相當于一個沒有任何的文件擴展的邏輯視圖。你能夠映射這些邏輯視圖到正確的實現(xiàn)到applicationContext文件以至于你可以容易的改 變你的視圖層而沒有接觸請求處理的類代碼。

          為了解決一個邏輯名稱匹配正確的文件,這是視圖解析器(view resolvers)的責任。一旦controller類把視圖名稱解析到一個視圖實現(xiàn),它會根據(jù)每個視圖的實現(xiàn)設(shè)計來渲染對象。

          Hello World例子

          在這個應(yīng)用程序中,我創(chuàng)建了最簡單的員工管理程序示例,它僅有一個功能即在系統(tǒng)中列出所有的在職員工。讓我們來看下面這個應(yīng)用程序的目錄結(jié)構(gòu)。



          現(xiàn)在來讓我們來寫所有有關(guān)的文件到這個hello world應(yīng)用中。

          pom.xml

          下面 pom.xml 文件包含了 spring mvc的依賴和寫Jsp文件的標簽庫。

          123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.howtodoinjava.demo</groupId> <artifactId>springmvcexample</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>springmvcexample Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- Spring MVC support --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.1.4.RELEASE</version> </dependency> <!-- Tag libs support for view layer --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> <scope>runtime</scope> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> <scope>runtime</scope> </dependency> </dependencies> <build> <finalName>springmvcexample</finalName> </build></project>

          web.xml

          這個最簡web.xml文件聲明一個servlet(即dispatcher servlet)用于接收所有種類的請求。dispatcher servlet這里充當前置控制器。

          12345678910111213141516171819202122<web-app id="WebApp_ID" version="2.4"xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><display-name>Spring Web MVC Hello World Application</display-name><servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>spring</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>

          spring-servlet.xml (你也能夠使用applicationContext.xml文件)

          我們在請求handler、service、dao層使用帶注解的類,所以在基礎(chǔ)的包中我對所有的類文件進行注解處理。

          “com.howtodoinjava.demo“

          12345678910111213141516171819<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-3.0.xsd http://www.springframework.org/schema/context/ http://www.springframework.org/schema/context/spring-context-3.0.xsd"><context:component-scan base-package="com.howtodoinjava.demo" /><bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /><bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /></bean></beans>

          EmployeeController.java

          在類和方法上注解@RequestMapping來決定URL在哪個方法會被調(diào)用。

          12345678910111213141516171819202122import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import com.howtodoinjava.demo.service.EmployeeManager;@Controller@RequestMapping("/employee-module")public class EmployeeController{@AutowiredEmployeeManager manager;@RequestMapping(value="/getAllEmployees", method=RequestMethod.GET)public String getAllEmployees(Model model){model.addAttribute("employees", manager.getAllEmployees());return "employeesListDisplay";}}

          更多關(guān)于: How to use @Component, @Repository, @Service and @Controller Annotations?

          EmployeeVO.java

          這個類充當MVC模式的model。

          1234567891011121314151617181920package com.howtodoinjava.demo.model;import java.io.Serializable;public class EmployeeVO implements Serializable{private static final long serialVersionUID=1L;private Integer id;private String firstName;private String lastName;//Setters and Getters@Overridepublic String toString() {return "EmployeeVO [id=" + id + ", firstName=" + firstName+ ", lastName=" + lastName + "]";}}

          EmployeeDAO.java

          這個類在三層結(jié)構(gòu)中是第三層,負責與底層數(shù)據(jù)庫的交互。

          12345678import java.util.List;import com.howtodoinjava.demo.model.EmployeeVO;public interface EmployeeDAO{public List<EmployeeVO> getAllEmployees();}

          EmployeeDAOImpl.java

          1234567891011121314151617181920212223242526272829import java.util.ArrayList;import java.util.List;import org.springframework.stereotype.Repository;import com.howtodoinjava.demo.model.EmployeeVO;@Repositorypublic class EmployeeDAOImpl implements EmployeeDAO {public List<EmployeeVO> getAllEmployees(){List<EmployeeVO> employees=new ArrayList<EmployeeVO>();EmployeeVO vo1=new EmployeeVO();vo1.setId(1);vo1.setFirstName("Lokesh");vo1.setLastName("Gupta");employees.add(vo1);EmployeeVO vo2=new EmployeeVO();vo2.setId(2);vo2.setFirstName("Raj");vo2.setLastName("Kishore");employees.add(vo2);return employees;}}

          EmployeeManager.java

          這個類在三層架構(gòu)中屬于第二層,負責與DAO層的交互。

          12345678import java.util.List;import com.howtodoinjava.demo.model.EmployeeVO;public interface EmployeeManager{public List<EmployeeVO> getAllEmployees();}

          EmployeeManagerImpl.java

          12345678910111213141516171819import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.howtodoinjava.demo.dao.EmployeeDAO;import com.howtodoinjava.demo.model.EmployeeVO;@Servicepublic class EmployeeManagerImpl implements EmployeeManager {@AutowiredEmployeeDAO dao;public List<EmployeeVO> getAllEmployees(){return dao.getAllEmployees();}}

          employeesListDisplay.jsp

          這個jsp用于展示系統(tǒng)中所有的員工。它循環(huán)遍歷員工集合,并且輸出他們的詳細到表格中。這符合MVC的視圖層。

          12345678910111213141516171819202122232425262728<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%><html><head><title>Spring MVC Hello World</title></head><body><h2>All Employees in System</h2><table border="1"><tr><th>Employee Id</th><th>First Name</th><th>Last Name</th></tr><c:forEach items="${employees}" var="employee"><tr><td>${employee.id}</td><td>${employee.firstName}</td><td>${employee.lastName}</td></tr></c:forEach></table></body></html>

          現(xiàn)在部署應(yīng)用程序到你的服務(wù)器(我使用的是tomcat 7)。并且點擊URL“http://localhost:8080/springmvcexample/employee-module/getAllEmployees”。

          如果你正確配置所有,你會看到下面屏幕。

          pring Web MVC框架提供了Model-View-Controller(MVC)架構(gòu)和現(xiàn)成的組件,可用于開發(fā)靈活且松散耦合的Web應(yīng)用程序。MVC模式導致分離應(yīng)用程序的不同方面(輸入邏輯,業(yè)務(wù)邏輯和UI邏輯),同時在這些元素之間提供松散的耦合。

          • Model: 封裝了應(yīng)用程序數(shù)據(jù),通常它們將由POJO組成。
          • View 負責呈現(xiàn)模型數(shù)據(jù),并在總體上產(chǎn)生HTML輸出,客戶端的瀏覽器可以解釋。
          • Controller 負責處理用戶請求,并且建立一個合適的模型,并將其傳遞到用于渲染的圖。

          DispatcherServlet

          Spring Web模型視圖控制器(MVC)框架是圍繞處理所有HTTP請求和響應(yīng)的DispatcherServlet設(shè)計的。下圖說明了Spring Web MVC DispatcherServlet的請求處理工作流程-

          以下是與對DispatcherServlet的傳入HTTP請求相對應(yīng)的事件序列-

          • 接收到HTTP請求之后,DispatcherServlet咨詢HandlerMapping 來調(diào)用適當?shù)腃ontroller。
          • 該控制器接受請求,并調(diào)用基于所使用GET或POST方法相應(yīng)的服務(wù)的方法。服務(wù)方法將基于定義的業(yè)務(wù)邏輯設(shè)置模型數(shù)據(jù),并將視圖名稱返回給DispatcherServlet。
          • 所述的DispatcherServlet將幫助從的ViewResolver到拾取該請求的已定義視圖。
          • 視圖完成后,DispatcherServlet將模型數(shù)據(jù)傳遞到視圖,該視圖最終在瀏覽器上呈現(xiàn)。

          所有上述組件,即HandlerMapping,Controller和ViewResolver都是WebApplicationContext w的一部分,它是純ApplicationContext的擴展,具有Web應(yīng)用程序必需的一些額外功能。

          所需配置

          您需要通過使用web.xml文件中的URL映射來映射希望DispatcherServlet處理的請求。以下是顯示HelloWeb DispatcherServlet示例的聲明和映射的示例-

          <web-app id="WebApp_ID" version="2.4"
             xmlns="http://java.sun.com/xml/ns/j2ee" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
             http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
              
             <display-name>Spring MVC Application</display-name>
             
             <servlet>
                <servlet-name>HelloWeb</servlet-name>
                <servlet-class>
                   org.springframework.web.servlet.DispatcherServlet
                </servlet-class>
                <load-on-startup>1</load-on-startup>
             </servlet>
          
             <servlet-mapping>
                <servlet-name>HelloWeb</servlet-name>
                <url-pattern>*.jsp</url-pattern>
             </servlet-mapping>
          
          </web-app>

          web.xml中的文件將被保存在你的Web應(yīng)用程序的WebContent / WEB-INF目錄下。初始化HelloWeb DispatcherServlet時,框架將嘗試從位于應(yīng)用程序的WebContent / WEB-INF 目錄中名為[servlet-name] -servlet.xml的文件中加載應(yīng)用程序上下文。在這種情況下,我們的文件將是HelloWebservlet.xml

          接下來,<servlet-mapping>標記指示哪個DispatcherServlet將處理哪些URL。在這里,所有以.jsp結(jié)尾的HTTP請求都將由HelloWeb DispatcherServlet 處理。

          如果不想使用默認文件名作為[servlet-name] -servlet.xml和默認位置作為WebContent / WEB-INF,則可以通過在web.xml文件中添加servlet偵聽器ContextLoaderListener來自定義此文件名和位置。如下-

          <web-app...>
          
             <!-------- DispatcherServlet definition goes here----->
             ....
             <context-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>/WEB-INF/HelloWeb-servlet.xml</param-value>
             </context-param>
          
             <listener>
                <listener-class>
                   org.springframework.web.context.ContextLoaderListener
                </listener-class>
             </listener>
             
          </web-app>

          現(xiàn)在,讓我們檢查位于Web應(yīng)用程序的WebContent / WEB-INF目錄中的HelloWeb-servlet.xml文件的必需配置-

          <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:context="http://www.springframework.org/schema/context"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             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">
          
             <context:component-scan base-package="com.tutorialspoint" />
          
             <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="prefix" value="/WEB-INF/jsp/" />
                <property name="suffix" value=".jsp" />
             </bean>
          
          </beans>

          以下是關(guān)于HelloWeb-servlet.xml文件的要點-

          • 在[servlet的名稱] -servlet.xml后綴的文件將被用來創(chuàng)建定義的豆類,覆蓋在全球范圍內(nèi)的名字相同的Bean的定義。
          • 所述<上下文:組分掃描...>標簽將使用以激活彈簧MVC注釋掃描功能,其允許使用像@Controller和@RequestMapping等注解
          • 該 InternalResourceViewResolver這個將定義解析視圖名稱規(guī)則。根據(jù)上述定義的規(guī)則,名為hello的邏輯視圖被委派給位于/WEB-INF/jsp/hello.jsp的視圖實現(xiàn)。

          下一節(jié)將向您展示如何創(chuàng)建實際的組件,即Controller,Model和View。

          定義控制器

          DispatcherServlet將請求委托給控制器以執(zhí)行特定于其的功能。該@Controller注解表明特定類供應(yīng)控制器的作用。的@RequestMapping注解用于將URL映射到要么整個類或特定處理程序方法。

          @Controller
          @RequestMapping("/hello")
          public class HelloController { 
             @RequestMapping(method=RequestMethod.GET)
             public String printHello(ModelMap model) {
                model.addAttribute("message", "Hello Spring MVC Framework!");
                return "hello";
             }
          }

          @Controller注解類定義為Spring MVC的控制器。在這里,@ RequestMapping的首次使用表明該控制器上的所有處理方法都相對于/ hello路徑。下一個注釋@RequestMapping(method=RequestMethod.GET)用于將printHello()方法聲明為控制器的默認服務(wù)方法,以處理HTTP GET請求。您可以定義另一個方法來處理同一URL上的任何POST請求。

          您可以用另一種形式編寫上述控制器,您可以在@RequestMapping中添加其他屬性, 如下所示:

          @Controller
          public class HelloController {
             @RequestMapping(value="/hello", method=RequestMethod.GET)
             public String printHello(ModelMap model) {
                model.addAttribute("message", "Hello Spring MVC Framework!");
                return "hello";
             }
          }

          所述屬性表示該處理程序方法被映射的URL和方法屬性定義了服務(wù)的方法來處理HTTP GET請求。關(guān)于上面定義的控制器,需要注意以下要點-

          • 您將在服務(wù)方法中定義所需的業(yè)務(wù)邏輯。您可以根據(jù)需要在此方法內(nèi)調(diào)用另一個方法。
          • 根據(jù)定義的業(yè)務(wù)邏輯,您將在此方法中創(chuàng)建一個模型。您可以使用setter的不同模型屬性,視圖將訪問這些屬性以顯示最終結(jié)果。本示例創(chuàng)建一個屬性為“ message”的模型。
          • 定義的服務(wù)方法可以返回String,該String包含用于呈現(xiàn)模型的視圖的名稱。本示例返回“ hello”作為邏輯視圖名稱。

          創(chuàng)建JSP視圖

          Spring MVC為不同的表示技術(shù)支持多種類型的視圖。這些包括-JSP,HTML,PDF,Excel工作表,XML,Velocity模板,XSLT,JSON,Atom和RSS feed,JasperReports等。但是最常見的是,我們使用用JSTL編寫的JSP模板。

          讓我們在/WEB-INF/hello/hello.jsp中編寫一個簡單的hello視圖-

          <html>
             <head>
                <title>Hello Spring MVC</title>
             </head>
             
             <body>
                <h2>${message}</h2>
             </body>
          </html>

          這里$ {}的消息是,我們已經(jīng)建立了內(nèi)部控制的屬性。您可以在視圖內(nèi)部顯示多個屬性。

          Spring Web MVC框架示例

          基于上述概念,讓我們檢查一些重要的示例,這些示例將幫助您構(gòu)建Spring Web應(yīng)用程序-

          序號范例與說明1個Spring MVC Hello World示例

          這個例子將解釋如何編寫一個簡單的Spring Web Hello World應(yīng)用程序。

          2Spring MVC表單處理示例

          這個示例將說明如何使用HTML表單編寫Spring Web應(yīng)用程序,以將數(shù)據(jù)提交給控制器并顯示處理后的結(jié)果。

          3春季頁面重定向示例

          了解如何在Spring MVC Framework中使用頁面重定向功能。

          4Spring靜態(tài)頁面示例

          了解如何在Spring MVC Framework中訪問靜態(tài)頁面和動態(tài)頁面。

          5Spring異常處理示例

          了解如何在Spring MVC Framework中處理異常。


          主站蜘蛛池模板: 2022年亚洲午夜一区二区福利| 亚洲综合无码一区二区痴汉| 精品无码人妻一区二区三区| 国产精品福利一区| 人妻无码一区二区不卡无码av| 三上悠亚亚洲一区高清| 一区二区高清视频在线观看| 久久精品无码一区二区三区免费| 日本不卡一区二区三区| 亚洲一区二区三区免费| 国产三级一区二区三区| 国产MD视频一区二区三区| 国产精品久久无码一区二区三区网| 国产a∨精品一区二区三区不卡| 久久毛片免费看一区二区三区| 成人在线一区二区| 国产精品第一区第27页| 国产精品 一区 在线| 不卡无码人妻一区三区音频| 国产一区二区三区在线影院| 在线观看免费视频一区| 久久se精品一区精品二区| 精品国产一区二区三区久久| 久久久国产精品亚洲一区| 精品一区二区三区在线观看视频 | 亚洲AV永久无码精品一区二区国产 | 亚洲午夜电影一区二区三区 | 日本国产一区二区三区在线观看 | 麻豆国产一区二区在线观看| 人妖在线精品一区二区三区| 国模无码一区二区三区| 国产一区二区在线视频播放| 婷婷国产成人精品一区二| 中文字幕无码免费久久9一区9| 国精品无码一区二区三区左线| 午夜福利一区二区三区高清视频| 精品少妇ay一区二区三区| 日韩三级一区二区三区| 香蕉免费看一区二区三区| 蜜臀Av午夜一区二区三区| 天堂成人一区二区三区|