溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java Spring MVC4環(huán)境搭建實例詳解(步驟)

發(fā)布時間:2020-10-01 20:26:06 來源:腳本之家 閱讀:145 作者:東陸之滇 欄目:編程語言

spring WEB MVC框架提供了一個MVC(model-view-controller)模型-視圖-控制器的結(jié)構(gòu)和組件,利用它可以開發(fā)更靈活、松耦合的web應(yīng)用。MVC模式使得整個服務(wù)應(yīng)用的各部分(控制邏輯、業(yè)務(wù)邏輯、UI界面展示)分離開來,使它們之間的耦合性更低。

Model
模型層封裝了整個應(yīng)用程序的數(shù)據(jù)對象并且將會持久化POJO
View
視圖層負(fù)責(zé)渲染模型層的數(shù)據(jù),一般最終使用HTML展示到用戶瀏覽器或移動設(shè)備終端
Controller
控制層負(fù)責(zé)處理用戶的請求、構(gòu)建合適的模型數(shù)據(jù)并將其傳輸?shù)揭晥D層進行渲染

SpringMVC核心-DispatcherServlet分發(fā)器

SpringMVC框架是設(shè)計用來處理所有的HTTP請求和響應(yīng)的,它的核心是圍繞著一個分發(fā)器DispatcherServlet。在Spring Web MVC DispatcherServlet的請求處理流程如下圖所示:

java Spring MVC4環(huán)境搭建實例詳解(步驟)

以下是對應(yīng)一個HTTP請求時分發(fā)器的處理流程:

1.接收到一個Http請求后,DispatcherServlet 告訴映射處理器HandlerMapping 去調(diào)用相應(yīng)的Controller(控制器)。

2.然后Controller控制器根據(jù)接收到的的請求調(diào)用相應(yīng)的Service服務(wù)方法,基于請求所使用的GET或PUT等其它請求方式。Service方法將會根據(jù)業(yè)務(wù)邏輯設(shè)置模型數(shù)據(jù)并且返回一個視圖給DispatcherServlet分發(fā)器。

3.DispatcherServlet 分發(fā)器將會請求視圖解析器ViewResolver去處理找到該請求對應(yīng)的已經(jīng)定義的視圖view。

4.一旦視圖確定了,DispatcherServlet 會將模型數(shù)據(jù)傳輸給該視圖view,最終渲染到用戶瀏覽設(shè)備上。

上述提到的所有組件:映射處理器HandlerMapping, 控制器Controller 和視圖解析器ViewResolver都是WebApplicationContext 的組成部分。WebApplicationContext 擴展了ApplicationContext ,但是為web應(yīng)用程序提供了更多的必要的特性。

SpringMVC需要的配置要求

為了將用戶的請求映射到分發(fā)器DispatcherServlet 去處理,需要在web.xml中配置URL映射。
以下是一個聲明和映射了Demo應(yīng)用HelloWeb的分發(fā)器DispatcherServlet 的配置示例(就是servlet映射配置):

<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>
 <servlet-name>HelloWeb</servlet-name>
 <servlet-class>
  org.springframework.web.servlet.DispatcherServlet
 </servlet-class>
 <load-on-startup>1</load-on-startup>
 </servlet>

 <!--配置servlet與處理請求的映射模式-->
 <servlet-mapping>
 <servlet-name>HelloWeb</servlet-name>
 <url-pattern>/</url-pattern>
 </servlet-mapping>

</web-app>

首先: web.xml文件根據(jù)servlet規(guī)范放在WebContent/WEB-INF目錄下,使用Mavan風(fēng)格的放在scr/main/webapp/WEB-INF目錄下。

一旦初始化HelloWeb的的DispatcherServlet,框架將會嘗試從WebContent/WEB-INF目錄下的[servlet-name]-servlet.xml配置文件加載應(yīng)用上下文application context。在這個Demo中,會去加載 HelloWeb-servlet.xml文件。這是默認(rèn)行為,我們也可以指定加載配置文件的位置,這點后面會有實例示范。

然后: <\servlet-mapping>標(biāo)簽指明什么樣的URL才會被DispatcherServlet映射處理。這里配置的是所有的HTTP請求都會被HelloWeb的DispatcherServlet映射處理

如果你不想使用默認(rèn)的文件名[servlet-name]-servlet.xml和默認(rèn)的context加載位置WebContent/WEB-INF(或者scr/main/webapp/WEB-INF),你也可以在web.xml中通過添加一個servlet監(jiān)聽器ContextLoaderListener來自定義指定文件名和位置。示例配置如下:

<web-app...>

<!-------- DispatcherServlet的定義,上面的配置這里略過了----->
....


<!--指定上下文配置文件的位置,指定classpath下的spring-mvc-config.xml文件
使用Maven風(fēng)格,可以將該文件放在src/main/resources目錄下
-->
<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>classpath:spring-mvc-config.xml</param-value>
</context-param>
<!--增加監(jiān)聽器-->
<listener>
 <listener-class>
 org.springframework.web.context.ContextLoaderListener
 </listener-class>
</listener>
</web-app>

接下來: 使用自定義servlet上下文配置后,我們來看看spring-mvc-config.xml文件的配置信息,該文件放在src/main/resources目錄下,文末會展示Demo結(jié)構(gòu)視圖:

<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"
 xmlns:mvc="http://www.springframework.org/schema/mvc"
 xsi:schemaLocation="
 http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/mvc
 http://www.springframework.org/schema/mvc/spring-mvc.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context.xsd ">

 <context:component-scan base-package="org.byron4j" />

 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
 <property name="prefix" value="/WEB-INF/jsp/" />
 <property name="suffix" value=".jsp" />
 </bean>

 <mvc:resources mapping="/resources/**" location="/resources/" />

 <mvc:annotation-driven />

</beans>

這里有幾點比較重要:

[servlet-name]-servlet.xml文件(現(xiàn)在我們自定義為spring-mvc-config.xml) 會創(chuàng)建已經(jīng)定義的bean, 會覆蓋其他位置已經(jīng)定義的同名的全局的bean,這點是血淚的教訓(xùn),參見mapper注入失敗問題解決

<context:component-scan...> 標(biāo)簽用于激活Spring MVC注解掃描功能,像@Controller、 @RequestMapping等

InternalResourceViewResolver 將使用下面定義的規(guī)則來解析視圖名稱。 按照我們配置的規(guī)則:一個名為”hello”的邏輯視圖的實現(xiàn)將會是/WEB-INF/jsp/目錄下的hello.jsp文件來渲染。

接下來: 我們編寫一些實際使用的組件例如Controller, Model and View。

定義一個Controller

DispatcherServlet代表請求通過控制器來執(zhí)行該請求的指定業(yè)務(wù)處理功能。@Controller 注解表明該類是一個控制器。@RequestMapping注解用于請求的URL映射到一個類或一個特定的處理方法

package org.byron4j.helloWeb;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Hello world!
 *
 */
@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 的控制器controller。 在這里@RequestMapping的第一個使用位置是表明這個Controller類的所有方法都是處理/hello請求的。 第二個位置的用法@RequestMapping(method = RequestMethod.GET) 表明printHello()方法作為這個Controller類的默認(rèn)服務(wù)方法去處理HTTP的GET請求。你可以依葫蘆畫瓢定義一個方法處理同名的的URL的POST請求,試試,你僅僅需要在新方法中將@RequestMapping(method = RequestMethod.GET)替換為@RequestMapping(method = RequestMethod.POST)即可。

你也可以將上面的Controller替換成下面的的這種寫法:

@Controller
public class HelloController{

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

}

功能是一樣的。

@RequestMapping的value屬性指明該方法僅僅映射處理的GET方式的請求/hello。 以下有幾點比較重要:

你可以在Controller的處理方法中調(diào)用其他業(yè)務(wù)方法去處理業(yè)務(wù)邏輯。

基于定義的業(yè)務(wù)邏輯,你需要在該方法中創(chuàng)建一個模型對象。你可以設(shè)置不同的模型屬性,這些屬性可以讓視圖訪問最終渲染給用戶。這個demo中創(chuàng)建了一個包含”message”屬性的模型對象。

一個定義的服務(wù)方法可以返回一個包含渲染模型的視圖名字的字符串。這個demo返回的”hello” 作為一個邏輯視圖的名字。

創(chuàng)建JSP視圖

SpringMVC支持多種類型的視圖顯示技術(shù)。包括 JSP, HTML, PDF, Excel worksheets, XML, Velocity 末班, XSLT, JSON, Atom 和RSS feeds, JasperReports, Thymeleaf等等。這里我們使用jap視圖, 在/WEB-INF/hello/jsp目錄下創(chuàng)建一個hello.jsp:

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

這里的${message} 是Controller中模型對象設(shè)置的屬性message的值。你還可以在你的視圖中展示另外的其他屬性。

demo最后自定義的web.xml:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 version="2.5">

 <display-name>Spring MVC Application</display-name>
 <welcome-file-list>
 <welcome-file>
  /index.jsp
 </welcome-file>
 </welcome-file-list>
 <!--聲明一個servlet配置-->
 <servlet>
 <servlet-name>dispatcherServlet</servlet-name>
 <servlet-class>
  org.springframework.web.servlet.DispatcherServlet
 </servlet-class>
 <!-- 自定義servlet文件名、文件位置需要使用該參數(shù)配置 -->
 <init-param>
 <!-- 分發(fā)器攔截的上下文-contextConfigLocation|指定servlet context配置文件的位置 -->
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:spring-mvc-config.xml</param-value>
 </init-param>
 <load-on-startup>1</load-on-startup>
 </servlet>

 <!--配置servlet與處理請求的映射模式,會對所有*.jsp的后綴請求處理-->
 <servlet-mapping>
 <servlet-name>dispatcherServlet</servlet-name>
 <url-pattern>/</url-pattern>
 </servlet-mapping>


 <!--指定上下文配置文件的位置,指定classpath下的spring-mvc-config.xml文件
使用Maven風(fēng)格,可以將該文件放在src/main/resources目錄下
-->
<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>classpath:spring-mvc-config.xml</param-value>
</context-param>
<!--增加監(jiān)聽器-->
<listener>
 <listener-class>
 org.springframework.web.context.ContextLoaderListener
 </listener-class>
</listener>
</web-app>

demo項目的pom.xml:

<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/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

 <groupId>org.byron4j</groupId>
 <artifactId>helloWeb</artifactId>
 <version>1.0.0-SNAPSHOT</version>
 <packaging>war</packaging>

 <name>helloWeb</name>
 <url>http://blog.csdn.net/zixiao217</url>

 <properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <spring.version>4.2.5.RELEASE</spring.version>
 <log4j.version>1.2.17</log4j.version>
 </properties>

 <dependencies>

 <!-- Spring -->
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>${spring.version}</version>
 </dependency>

 <!-- Log4j -->
 <dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>${log4j.version}</version>
 </dependency>


 <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
 <dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>servlet-api</artifactId>
  <version>2.5</version>
 </dependency>


 <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>3.8.1</version>
  <scope>test</scope>
 </dependency>
 <dependency>
  <groupId>jstl</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
 </dependency>
 </dependencies>


 <build>
 <plugins>
  <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.5.1</version>
  <configuration>
   <source>1.8</source>
   <target>1.8</target>
  </configuration>
  </plugin>
 </plugins>
 <finalName>helloWeb</finalName>
 </build>
</project>

以下是demo在eclipse的package explorer視圖:

java Spring MVC4環(huán)境搭建實例詳解(步驟)


以下是demo在eclipse的navigator視圖:

java Spring MVC4環(huán)境搭建實例詳解(步驟)

運行項目,在瀏覽器輸入http://localhost:8080/helloWeb/hello,顯示:

java Spring MVC4環(huán)境搭建實例詳解(步驟)

若參考本文編寫第一個SpringMVC Demo跑不起來,可以到原文留言提出意見。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI