深入淺出地理解springmvc及第一個小例子
Spring MVC框架是有一個MVC框架,通過實現Model-View-Controller模式來很好地將資料、業務與展現進行分離。從這樣一個角度來說,Spring MVC和Struts、Struts2非常類似。Spring MVC的設計是圍繞DispatcherServlet展開的,DispatcherServlet負責將請求派發到特定的handler。通過可配置的handler
mappings、view resolution、locale以及theme resolution來處理請求並且轉到對應的檢視。這篇博文小編主要來講解一下springmvc的相關知識,小編會從以下幾個方面進行詳細介紹:
b、常用的mvc框架
c、mvc模式的優缺點
d、springmvc的體系結構
e、springmvc Demo
接著,小編就對以上列出的幾點進行詳細介紹,希望對有需要的小夥伴有幫助,還請小夥伴們多多指教。
mvc與springmvc有什麼區別和聯絡
mvc是一種使用mvc(model+view+controller即:模型+檢視+控制器)設計建立web應用程式的模式:
model(模型)表示應用程式核心,比如資料庫記錄列表;
view(檢視)顯示資料,比如資料庫記錄;
controller(控制器)處理輸入,比如寫入資料庫記錄;
下圖是小編畫的一個mvc模式處理流程如下所示:
解釋一下mvc的處理流程,首先使用者發出請求,給控制器controller,controller負責將使用者的引數傳遞給業務模型model,model進行業務邏輯判斷,和資料庫的增刪改查操作,最後,根據業務邏輯選擇不同的檢視view,並將結果反饋給使用者,這就是mvc設計模式的處理流程,mvc分成三層,由助於管理複雜的業務程式,同時也簡化了分組開發。不同的開發人員可同時開發view、控制器邏輯和業務邏輯。
說到spring mvc,小夥伴們可能會想到mvc,mvc和三層架構是什麼關係呢?在小編目前的理解中,三層是三層,mvc是mvc,她們之間沒有關係。三層是從整個應用程式架構的角度來分的三層,如果程式有需要,還可以再進行分層,三層是為了解決整個應用程式中各個業務操作過程中不同階段的程式碼封裝的問題,為了使程式設計師更加專注的處理某階段的業務邏輯。比如將資料庫操作程式碼封裝到一層中,提供一些方法根據引數直接返回使用者需要的相應資料,這樣在處理具體的業務邏輯的時候,就不用關心資料的儲存問題了。MVC是在應用程式(BS結構)的檢視層劃分出來的不同功能的幾個模組。
常用的mvc框架
比較常用的mvc框架有struts和springmvc:
1)struts是Java Web mvc框架中的霸主,經過長達幾年的發展,struts已經逐漸成長為一個穩定、成熟的架構,並且佔有了mvc框架中最大的市場份額,但是struts某些技術特性上已經落後於新興的mvc框架,面對springMVC、webWork2這些設計更加的精密,擴充套件性更強的框架,struts的霸主地位受到挑戰。
2)springmvc通過一套mvc註解,讓pojo成為處理請求的控制器,無須實現任何介面,同時,springmvc還支援rest風格的url請求,註解驅動以及rest風格的springmvc是spring3.0最出彩的功能之一,此外,springmvc在資料繫結、檢視解析、本地處理及靜態資料處理上都有許多不俗的表現,她在框架設計,擴充套件性、靈活性等方面超越了struts、webWork等mvc框架,從原來的追趕者一躍成為mvc的領跑者。
mvc模式的優缺點優點:
1)、耦合性低
2)、重用性高
3)、生命週期成本低
4)、部署快
5)、可維護性高
6)、有利於軟體工程化管理
缺點:
1)、沒有明確的定義
2)、不適合小型、中等規模的應用程式
3)、增加系統結構和實現的複雜性
4)、檢視與控制器間的過於緊密的連線
5)、檢視對模型資料的低效率訪問
6)、一般高階的介面工具或構造器不支援模式
springmvc的體系結構
小編來簡單的介紹一下springmvc的體系結構:
Model2就是jsp+servlet+javabean是經典的mvc模型的web應用變體,這個改變,主要源於http協議的無狀態性,model2的目的和mvc一樣,也是利用處理器分離模型、檢視和控制達到不同層級間鬆耦合的效果,提高系統的靈活性、複用性、可維護性、在多數情況下,可以把model2和mvc等同起來,由於mvc就是基於model2實現的框架,所以她底層的機制也是mvc,我們通過上圖來描述spring mvc的巨集觀體系結構,從接收請求到返回響應,spring mvc框架的眾多元件大家各司其職,有條不紊的完成自己的工作,在整個框架中,一個非常關鍵的類,DispatcherServlet,她處於核心的位置,負責協調和組織不同元件,共同完成請求相應的工作,和大多數mvc框架一樣,spring mvc通過一個前端servlet處理器,接收所有的請求,並將工作委派給其他元件進行具體處理,DispatcherServlet就是springmvc前端的servlet處理器,下面我們對springmvc請求處理的過程進行詳細解釋:
a、整個過程開始與客戶端傳送的一個http請求
b、DispatcherServlet類接收請求,會將請求的處理工作委託給具體的處理器Handler,或者,負責處理請求執行相應的業務邏輯,在這之前DispatcherServlet必須能夠憑藉請求資訊也就是url或請求引數等按照某種機制找到請求對應的處理器,DispatcherServlet是通過查詢handlermapping來完成這一工作的。
c、當DispatcherServlet從handlermapping中得到當前請求對應的處理器之後,他就將請求分配給這個處理器,處理器根據請求的資訊執行相應的業務邏輯,一個設計良好的處理器應該通過呼叫service層的業務邏輯物件完成業務處理而非自己越俎代庖,spring提供了豐富的處理器型別,在真正處理業務邏輯前,有些處理器會事先執行兩項預處理工作:
a、將httpservletrequest請求引數繫結到一個pojo物件中
b、對綁定了請求引數的pojo物件進行資料合法性校驗
d、處理器完成業務邏輯的處理後返回一個modelandview物件給DispatcherServlet類,modelandview包含了檢視邏輯名和渲染檢視時需要用到的資料模型物件
e、由於modelandview中包含的是檢視邏輯名,DispatcherServlet必須知道這個邏輯名對應的真實物件,這項檢視解析的工作通過呼叫viewResolver來完成
f、當得到真實的檢視物件後,DispatcherServlet將請求分配給view這個物件,從而完成渲染工作
g、最終客戶端得到返回的相應,這可能是一個普通的html頁面,也可能是一個excel電子表格,也可能是一個pdf等不同的檢視形式,spring的檢視型別是比較豐富和靈活的,以上就是springmvc的處理的流程。 springmvc Demo
使用者登入系統進行密碼驗證,如果驗證成功跳轉到成功頁面,如果失敗,跳轉到登入頁面,提示失敗原因,如下圖所示:
第一步,編寫pom.xml的程式碼,程式碼如下所示:
[java] view plain copy print ?
- <span style="font-family:Comic Sans MS;font-size:18px;"><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>
- </span>
[java] view plain copy print ?
- <span style="font-family:Comic Sans MS;font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
- id="WebApp_ID" version="2.5">
- <display-name></display-name>
- <listener>
- <listener-class>org.springframeword.web.context.ContextLoaderListener</listener-class>
- </listener>
- <context-param>
- <param-name>contextConfigLoaction</param-name>
- <param-value>classpath*:applicationContext.xml</param-value>
- </context-param>
- <servlet>
- <servlet-name>spring</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfitLocation</param-name>
- <param-value>WEB-INF/spring-mvc.xml</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>spring</servlet-name>
- <url-pattern>*.html</url-pattern>
- </servlet-mapping>
- </web-app>
- </span>
[java] view plain copy print ?
- <span style="font-family:Comic Sans MS;font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd">
- <!-- 使用註解的包,包括子集 -->
- <context:component-scan base-package="com.springmvc"/>
- </beans>
- </span>
[java] view plain copy print ?
- <span style="font-family:Comic Sans MS;font-size:18px;"><%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>登入</title>
- </head>
- <body>
- <form action="Login.html" method="post">
- <p>
- 使用者名稱:<input name="uname" type="text">
- </p>
- <p>
- 密 碼:<input name="upasswd" type="password">
- </p>
- <p>
- <input type="submit">
- </p>
- </form>
- <font color="red">${error}</font>
- </body>
- </html>
- </span>
[java] view plain copy print ?
- <span style="font-family:Comic Sans MS;font-size:18px;"><%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>登入成功</title>
- </head>
- <body>
- <h1>登入成功</h1>
- </body>
- </html>
- </span>
[java] view plain copy print ?
- <span style="font-family:Comic Sans MS;font-size:18px;">package com.demo.springmvc.controller;
- import javax.annotation.Resource;
- import javax.servlet.http.HttpServletRequest;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.servlet.ModelAndView;
- import com.demo.springmvc.service.LoginService;
- public class LoginController {
- @Resource
- LoginService service;
- @Resource
- HttpServletRequest request;
- @RequestMapping("index")
- public ModelAndView toLoginPage(){
- return new ModelAndView("WEB-INF/jsp/login.jsp");
- }
- @RequestMapping("login")
- public ModelAndView doLogin(){
- String loginPageUrl="WEB-INF/jsp/login.jsp";
- String successPageUrl="WEB-INF/jsp/success.jsp";
- String uname = request.getParameter("uname");
- String upasswd = request.getParameter("upasswd");
- return service.doLogin(loginPageUrl,successPageUrl,uname,upasswd);
- }
- }
- </span>
[java] view plain copy print ?
- <span style="font-family:Comic Sans MS;font-size:18px;">package com.demo.springmvc.service;
- import org.springframework.web.servlet.ModelAndView;
- public class LoginService {
- public ModelAndView doLogin(String loginPageUrl, String successPageUrl,String uname, String upasswd) {
- if(uname == null||"".equals(uname)){
- return new ModelAndView(loginPageUrl,"error","使用者名稱不能為空");
- }
- if(uname == null||"".equals(upasswd)){
- return new ModelAndView(loginPageUrl,"error","密碼不能為空");
- }
- if(uname.equals("admin") && upasswd.equals("123")){
- return new ModelAndView(successPageUrl);
- }
- return new ModelAndView(loginPageUrl,"error","使用者名稱或者密碼錯誤");
- }
- }
- </span>