這個例子中,我們將使用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)用。
12345678910111213141516171819202122 | import 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。
1234567891011121314151617181920 | package 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ù)庫的交互。
12345678 | import java.util.List;import com.howtodoinjava.demo.model.EmployeeVO;public interface EmployeeDAO{public List<EmployeeVO> getAllEmployees();} |
EmployeeDAOImpl.java
1234567891011121314151617181920212223242526272829 | import 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層的交互。
12345678 | import java.util.List;import com.howtodoinjava.demo.model.EmployeeVO;public interface EmployeeManager{public List<EmployeeVO> getAllEmployees();} |
EmployeeManagerImpl.java
12345678910111213141516171819 | import 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邏輯),同時在這些元素之間提供松散的耦合。
Spring Web模型視圖控制器(MVC)框架是圍繞處理所有HTTP請求和響應(yīng)的DispatcherServlet設(shè)計的。下圖說明了Spring Web MVC DispatcherServlet的請求處理工作流程-
以下是與對DispatcherServlet的傳入HTTP請求相對應(yīng)的事件序列-
所有上述組件,即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文件的要點-
下一節(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)于上面定義的控制器,需要注意以下要點-
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)部顯示多個屬性。
基于上述概念,讓我們檢查一些重要的示例,這些示例將幫助您構(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中處理異常。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。