日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java Web系列:Spring MVC基础

發布時間:2025/3/21 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java Web系列:Spring MVC基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.Web MVC基礎

MVC的本質是表現層模式,我們以視圖模型為中心,將視圖和控制器分離出來。就如同分層模式一樣,我們以業務邏輯為中心,把表現層和數據訪問層代碼分離出來是一樣的方法。框架只能在技術層面上給我們幫助,無法在思考和過程上幫助我們,而我們很多人都不喜歡思考和嘗試。

2.實現Web MVC的基礎

實現Web MVC基礎可以概括為1個前段控制器和2個映射。

(1)前端控制器FrontController

ASP.NET和JSP都是以Page路徑和URL一一對應,Web MVC要通過URL映射Controller和View,就需要一個前端控制器統一接收和解析請求,再根據的URL將請求分發到Controller。由于ASP.NET和Java分別以IHttpHandler和Servlet作為核心,因此ASP.NET MVC和Spring MVC分別使用實現了對應接口的MvcHandler和DispatcherServlet作為前段控制器。

ASP.NET中通過HttpModule的實現類處理URL映射,UrlRoutingModule根據URL將請求轉發給前端控制器MvcHandler。Spring MVC中,則根據URL的配置,直接將請求轉發給前端控制器DispatcherServlet。

(2)URL和Contrller的映射

ASP.NET MVC將URL和Controller的映射規則存儲在RouteCollection中,前端控制器MvcHandler通過IController接口查找控制器。Spring MVC則通過RequestMapping和Controller注解標識映射規則,無需通過接口依賴實現控制i器。

(3)URL和View的映射

ASP.NET MVC 默認通過RazorViewEngine來根據URL和視圖名稱查找視圖,核心接口是IViewEngine。Spring MVC 通過internalResourceViewResolver根據URL和視圖名稱查找視圖,核心接口是ViewResolver。

3.Spring MVC的基礎配置

(1)前端控制器DispatcherServlet初始化:AbstractAnnotationConfigDispatcherServletInitializer

ASP.NET MVC初始化需要我們在HttpApplication.Application_Start方法中注冊默認的URL和Controller規則,Spring MVC由于采用注解映射URL和Controller,因此沒有對應的步驟。ASP.NET在根web.config中配置了UrlRoutingModule可以將請求轉發給MvcHandler,Spring MVC我們需要我們配置DispatcherServlet以及其對應的URL來達到接管所有請求的目的,Spring已經利用Servlet3.0定義的ServletContainerInitializer機制,為我們提供了內置的AbstractAnnotationConfigDispatcherServletInitializer,只要只需要像繼承HttpApplication的MvcApplication一樣,寫一個MvcInitializer。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package s4s; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class MvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { ????@Override ????protected Class<?>[] getRootConfigClasses() { ????????return new Class[] { }; ????} ????@Override ????protected Class<?>[] getServletConfigClasses() { ????????return new Class[] { MvcConfig.class }; ????} ????@Override ????protected String[] getServletMappings() { ????????return new String[] { "/" }; ????} }

(2)URL和View的映射:WebMvcConfigurerAdapter

ASP.NET的RazorViewEngine內置了View的Path和擴展名.cshtml的規則。Spring MVC的internalResourceViewResolver沒有提供默認值,一般我們會指定將View放置在統一的視圖目錄中,使用特定的擴展名。Spring同樣提供了內置的WebMvcConfigurerAdapter,我們只需寫一個自己的MvcConfig繼承它,重寫configureViewResolvers方法即可。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package s4s; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ViewResolverRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.view.InternalResourceViewResolver; @EnableWebMvc @ComponentScan @Configuration public class MvcConfig extends WebMvcConfigurerAdapter { ????@Override ????public void configureViewResolvers(ViewResolverRegistry registry) { ????????InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); ????????viewResolver.setPrefix("/WEB-INF/views/"); ????????viewResolver.setSuffix(".jsp"); ????????registry.viewResolver(viewResolver); ????} }

4.Spring MVC的Controller、Model和View

(1)URL和Controller的映射:

Spring MVC和ASP.NET MVC的不同,不通過IController接口標識Controller,也不通過RouteCollection定義URL和Controller,取而代之的是兩個注解:Controller和RequestMapping。因此我們在普通的POJO類上應用@Controller和@RequestMapping即可。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 package s4s; import javax.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MyController { ????@ResponseBody ????@RequestMapping(value = "/") ????public String home() { ????????return "home"; ????} ????@RequestMapping(value = "/register") ????public String register(@ModelAttribute("model") RegisterUserModel model) { ????????return "register"; ????} ????@RequestMapping(value = "/register", method = RequestMethod.POST) ????public String register(@ModelAttribute("model") @Valid RegisterUserModel model, BindingResult result) { ????????if (!result.hasErrors()) { ????????????return "redirect:/account"; ????????} ????????return "register"; ????} }

(2)Model:

通過使用@ModelAttribute、@Valid和BindingResult參數,我們可以指定Model的Name是否參與驗證并獲取驗證結果。為在Model上使用注解驗證,還需要引入validation-api和hibernate-validator。

ASP.NET將視圖最終編譯為WebViewPage<object>,View和Model是一一對應并且類型匹配的,Model可以是任意的POCO。Spring MVC中View和Model是一對多的,提供了ModelMap和其子類ModelAndView提供類似ASP.NET MVC中ViewResult的功能。ModelMap的基類是LinkedHashMap<String, Object>。

Spring MVC中沒有ViewResult類型。在Spring MVC中,我們一般返回String類型,可以有多種含義:

a.返回View的名稱。

b.返回文本:在Action上應用@ResponseBody注解時。

c.返回跳轉:以”redirect:”開頭時。如:return “redirect:/success”

模型的驗證:

(1)在Model字段上使用JSR-303定義的注解(需要引入hibernate validator)。

(2)在Controller的Model參數上應用@ModelAttribute、@Valid

(3)在View中使用<form:errors>標簽

Spring MVC需要添加jstl和spring的tag支持才能完成模型相關的操作。由于Spring MVC中的View和ASP.NET MVC中的區別較大,沒有辦法指定View持有的Model類型也就沒有了智能提示和錯誤檢測的優勢。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 package s4s; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; public class RegisterUserModel { ????@Size(max = 20, min = 5) ????private String userName; ????@Size(max = 20, min = 5) ????private String password; ????@NotNull ????private String confirmPassword; ????public String getUserName() { ????????return userName; ????} ????public void setUserName(String userName) { ????????this.userName = userName; ????} ????public String getPassword() { ????????return password; ????} ????public void setPassword(String password) { ????????this.password = password; ????} ????public String getConfirmPassword() { ????????return confirmPassword; ????} ????public void setConfirmPassword(String confirmPassword) { ????????this.confirmPassword = confirmPassword; ????} }

register.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 25 26 27 28 29 30 31 32 33 34 35 36 <%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://www.springframework.org/tags" prefix="s"%> <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> <!DOCTYPE HTML> <html> <head> <title>Getting Started: Serving Web Content</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> ????<h2>Register</h2> ????<form:form modelAttribute="model"> ????????<s:bind path="*"> ????????????<c:if test="${status.error}"> ????????????????<div id="message" class="error">Form has errors</div> ????????????</c:if> ????????</s:bind> ????????<div> ????????????<form:label path="userName">userName</form:label> ????????????<form:input path="userName" /> ????????????<form:errors path="userName" cssClass="error" /> ????????</div> ????????<div> ????????????<form:label path="password">password</form:label> ????????????<form:password path="password" /> ????????????<form:errors path="password" cssClass="error" /> ????????</div> ????????<div> ????????????<form:label path="confirmPassword">confirmPassword</form:label> ????????????<form:password path="confirmPassword" /> ????????????<form:errors path="confirmPassword" cssClass="error" /> ????????</div> ????????<input type="submit" value="submit"> ????</form:form> </html>

5.Spring MVC的初始化機制

Spring實現了Servlet 3.0規范定義的javax.servlet.ServletContainerInitializer接口并通過javax.servlet.annotation.HandlesTypes注解引用了WebApplicationInitializer接口。因此在Servlet容器初始化時,在當前class path路徑下的WebApplicationInitializer實現類的onStartup方法會自動執行(這和ASP.NET的Application_Start作用類似,在系列中的Java Web基礎時曾經提到過)。

ASP.NET中我們在Application_Start中初始化依賴注入容器。在Spring MVC中,我們實現WebApplicationInitializer接口同樣可以執行依賴注入的初始化。在Web環境中,我們使用的ApplicationContext接口的實現類為基于注解的AnnotationConfigWebApplicationContext(在系列中的Spring依賴注入基礎中曾經提到過),但我們無需直接實現WebApplicationInitializer并手動初始化AnnotationConfigWebApplicationContext對象,因為Spring已經定義了AbstractAnnotationConfigDispatcherServletInitializer作為WebApplicationInitializer接口的實現類,已經包含了AnnotationConfigWebApplicationContext的初始化。

采用基于Annotation注解時可以通過@Configurateion指定POJO來替代web.xml配置依賴注入。同樣,@ComponentScan可以替代web.xml中的掃描配置功能,使用ComponentScan配合Configurateion可以達到0xml配置的方式。上文中提到的Contrller相關的注解,都是啟用ComponentScan后才會被掃描生效。

AbstractAnnotationConfigDispatcherServletInitializer類的父類AbstractDispatcherServletInitializer中已經包含DispatcherServlet的初始化。相關類圖如下:

5.Spring MVC的Action Filter

.NET MVC提供了眾多Filter接口和一個ActionFilterAttribute抽象類作為Filter的基礎,其中以實現了IAuthorizationFilter接口的AuthorizeAttribute攔截器最為我們熟知。Spring MVC則提供了基于HandlerInterceptor接口的眾多接口、抽象類和實現類,其中也有和.NET MVC類似的權限驗證UserRoleAuthorizationInterceptor攔截器。內置的攔截器可以滿足大部分需求,為了省事圖就畫在一張上了,上面是Spring MVC的,下面是.NET MVC的。

總結

(1)MVC實現的要點是前端控制器、URL和Controller的映射、URL和View的映射

(2)MvcHandler和DispatcherServlet

(3)ServletContainerInitializer和HttpApplication.Application_Start

(4)RazorViewEngine和internalResourceViewResolver

(5)IMvcFilter和HandlerInterceptor

目前沒有找到類似ASP.NET中的從特性(注解)生成客戶端JavaScript驗證的方式,如果大家有相關資料分享,提前謝謝大家。

參考:

(1)http://www.ibm.com/developerworks/cn/java/j-lo-jsr303/index.html

(2)http://spring.oschina.mopaas.com/validation.html#validation-binder

(3)http://www.mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/


原文出處:?王剛

from:?http://www.importnew.com/17404.html

總結

以上是生活随笔為你收集整理的Java Web系列:Spring MVC基础的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。