-
web-INF 目錄下為私有文件
查看全部 -
視圖層:為用戶提供UI,重點(diǎn)關(guān)注業(yè)務(wù)的呈現(xiàn)。
模型層,業(yè)務(wù)數(shù)據(jù)的信息表示,關(guān)注支撐業(yè)務(wù)的信息構(gòu)成,通常是多個(gè)業(yè)務(wù)實(shí)體的組合。
Controller 調(diào)用業(yè)務(wù)邏輯產(chǎn)生合適的數(shù)據(jù)。
查看全部 -
Spring MVC基本概念
查看全部 -
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/maven-v4_0_0.xsd">
? <modelVersion>4.0.0</modelVersion>
? <groupId>imcc-zyh</groupId>
? <artifactId>spring-mvc-demo</artifactId>
? <packaging>jar</packaging>
? <version>1.0-SNAPSHOT</version>
? <name>spring-mvc-demo Maven Webapp</name>
? <url>http://maven.apache.org</url>
??
? <properties>
? <commons-lang.version>2.6</commons-lang.version>
? <slf4j.version>1.7.6</slf4j.version>
? <spring.version>4.1.3.RELEASE</spring.version>
? </properties>
??
? <!-- 依賴管理, 管理傳遞依賴, 比如兩個(gè)工程依賴的spring 包版本不一致, 可以通過依賴管理來指定 -->
? <dependencyManagement>
? <dependencies>
? <dependency>
? <groupId>org.springframework</groupId>
? <artifactId>spring-framework-bom</artifactId>
? <version>${spring.version}</version>
? <type>pom</type>
? <scope>import</scope>
? </dependency>
? </dependencies>
? </dependencyManagement>
??
? <dependencies>
? <dependency>
? <groupId>org.springframework</groupId>
? <artifactId>spring-webmvc</artifactId>
? </dependency>
?
? <dependency>
? <groupId>commons-lang</groupId>
? <artifactId>commons-lang</artifactId>
? <version>${commons-lang.version}</version>
? </dependency>
?
? <dependency>
? <groupId>org.slf4j</groupId>
? <artifactId>slf4j-log4j12</artifactId>
? <version>${slf4j.version}</version>
? <exclusions>
? <exclusion>
? <artifactId>slf4j-api</artifactId>
? <groupId>org.slf4j</groupId>
? </exclusion>
? </exclusions>
? </dependency>
? </dependencies>
??
? <build>
? <plugins>
? <plugin>
? <groupId>org.eclipse.jetty</groupId>
? <artifactId>jetty-maven-plugin</artifactId>
? <version>9.2.2.v20140723</version>
? </plugin>
? </plugins>
? </build>
</project>
查看全部 -
SpringMVC中啟動(dòng)對JSON的支持:
步驟1:SpringMVC的上下文環(huán)境mvc-dispatcher-serlver.xml中配置ContentNegotiatingViewResolver,具體參數(shù)不做詳細(xì)講解,只需要知道它可以將SpringMVC相同的數(shù)據(jù)呈現(xiàn)不同的數(shù)據(jù)表現(xiàn)形式,由于這里主要講解JSON數(shù)據(jù)格式,這里使用MappingJackson2JsonView工具類庫,將模型數(shù)據(jù)轉(zhuǎn)化稱JSON格式。如下圖配置,其中JsonView類的作用是將模型數(shù)據(jù)轉(zhuǎn)化成JSON格式。
步驟2:Maven的pom文件引入依賴,使用jackson提供工程的javaBean的JSON的轉(zhuǎn)換。
案例:Controller中編寫支持JSON的方法,其它同之前課程一樣,只不過方法的返回參數(shù)Course前添加了@ResponseBody注解(并不是唯一的方式,它是簡潔的方式,不需要其他配置),返回的數(shù)據(jù)將以JSON格式進(jìn)行呈現(xiàn),可以把數(shù)據(jù)復(fù)制到具有JSON功能的文本編輯器,并使用JSON的視圖進(jìn)行展示。數(shù)據(jù)轉(zhuǎn)換為JSON的格式2:方法返回值前使用@ResponseEntity注解(該注解是SpringMVC抽象的實(shí)體,它用泛型包裹了實(shí)體類),只需要返回這個(gè)類的實(shí)例。如下圖(了解)
查看全部 -
SpringMVC協(xié)同JSON工作
JSON(JavaScript Object Notation)定義:輕量級的數(shù)據(jù)交換格式,SpringMVC協(xié)同JSON使得模型數(shù)據(jù)在前端具有不同的表現(xiàn)形式。JSON在Restful Web Service中發(fā)揮重要作用,也使得Restful Web Service 稱為Web Service的一種標(biāo)準(zhǔn)。
SpringMVC處理JSON的方式:使用ContentNegotiatingViewResolver的機(jī)制處理相同數(shù)據(jù)不同呈現(xiàn)方式要求的應(yīng)用場景,使用ViewResolver處理數(shù)據(jù)的不同呈現(xiàn)格式,如果需要HTML的數(shù)據(jù)呈現(xiàn)格式,它就會(huì)把數(shù)據(jù)代理給JSPView,如果需要JSON數(shù)據(jù)格式,它就把數(shù)據(jù)代理給JsonView。
SpringMVC看待JSON方式:數(shù)據(jù)格式?jīng)]有改變,改變的只是數(shù)據(jù)的呈現(xiàn)方式。
查看全部 -
repository:.容器;倉庫
查看全部 -
maven 中的坐標(biāo)包含 groupId,artifactId,version,packaging。這四個(gè)方面可以唯一確定我們需要的產(chǎn)品以及包
查看全部 -
SpringMVC中啟動(dòng)對JSON的支持:
步驟1:SpringMVC的上下文環(huán)境mvc-dispatcher-serlver.xml中配置ContentNegotiatingViewResolver,具體參數(shù)不做詳細(xì)講解,只需要知道它可以將SpringMVC相同的數(shù)據(jù)呈現(xiàn)不同的數(shù)據(jù)表現(xiàn)形式,其中JsonView類的作用是將模型數(shù)據(jù)轉(zhuǎn)化成JSON格式。
步驟2:Maven的pom文件引入依賴,提供工程JSON的轉(zhuǎn)換。
案例:Controller中編寫支持JSON的方法,其它同之前課程一樣,只不過方法的返回參數(shù)Course前添加了@ResponseBody注解(并不是唯一的方式,它是簡潔的方式,不需要其他配置),返回的數(shù)據(jù)將以JSON格式進(jìn)行呈現(xiàn),可以把數(shù)據(jù)復(fù)制到具有JSON功能的文本編輯器,并使用JSON的視圖進(jìn)行展示。數(shù)據(jù)轉(zhuǎn)換為JSON的格式2:方法返回值前使用@ResponseEntity注解,并添加泛型,只需要返回這個(gè)類的實(shí)例。如下圖(了解)
查看全部 -
FileUpload——單文件上傳(SpirngMVC提供了文件上傳的支持,通過配置,就可以使用SpringMVC提供的接口來完成文件的上傳)
配置:在SpringMVC的上下文環(huán)境mvc-dispatcher-servlet.xml中添加一個(gè)<bean>如下圖,其中CommonsMultpartResolver是解析上傳文件的類,它其中的屬性maxUploadSize,是用來限制上傳文件的大小,并設(shè)置大小為200兆的字節(jié)(209715200),默認(rèn)編碼屬性defaultEncoding選用UTF-8,屬性resolveLazily為是否使用延遲加載,這里值為true,使用延遲加載提高性能,在需要時(shí)才進(jìn)行文件上傳的解析,并在依賴管理中引入這個(gè)commons-fileupload的jar包,并且該jar包依賴commons-io的jar包(隱性的引入了該jar包),正好編碼中也是用到了這個(gè)io包,這里就不用顯示的引入它了。
書寫Controller:提供一個(gè)名為showUploadPage()方法,該方法用于跳轉(zhuǎn)到下載文件的界面,跳轉(zhuǎn)的JSP界面提供了一個(gè)form表單,表單包含input的類型為file的標(biāo)簽和input的類型為submit的標(biāo)簽,表單form中加入一個(gè)enctype屬性,值為multipart/form-data,該屬性是文件上傳必須要顯示指明的一個(gè)屬性,如果沒有該屬性無法完成文件上傳,form表單的action屬性值為/courses/doUpload,所以要在CourseController中提供一個(gè)方法,并且文件上傳通常指明它是通過POST方式傳遞過來,RequestMapping(value="doUpload",method=RequestMethod.POST),在方法的參數(shù)里使用到了SpringMVC提供的支持文件上傳的類(MultipartIFile),可以查看該類的源代碼(可以上網(wǎng)查閱如何查看Maven下的源代碼),MuilipartFile提供了一些方法來訪問文件,比如,獲取文件名、獲取文件的最初文件名(也就是本地文件名)、獲取文件類型、查看該文件是否是空文件、文件大小以及文件二進(jìn)制、還可以獲取它的流進(jìn)行讀取操作,如下圖二,并且這里使用@RequestParam("file")使表單的file的input標(biāo)簽與該方法參數(shù)相關(guān)聯(lián),這樣SpringMVC就會(huì)將input的name為file的元素值綁定到Controller的參數(shù)上,并且類型會(huì)轉(zhuǎn)換成MultipartFile,接下就需要把服務(wù)器傳過來的文件存儲在某個(gè)地方,以提供其他應(yīng)用所使用,這里把它拷貝到C盤的目錄(C:\temp\imooc),如果文件不為空,輸出日志信息和本地文件名字,F(xiàn)ileUtils是Commons-io的一個(gè)文件類,可以用它的copyInputStreamToFile做文件的拷貝和文件流的操作,該方法有兩個(gè)參數(shù),第一參數(shù)是源文件所代表的流(InputStream類型,這里使用MultipartFile的getInputStream()獲取該流),第二個(gè)參數(shù)是File類型,并且File的第一個(gè)參數(shù)是目標(biāo)地,第二個(gè)是文件名,這里必須+文件的原始名稱,否則報(bào)錯(cuò)。
查看全部 -
Binding:將請求中的字段按照名字匹配的原則填入對象模型(模型對象和頁面數(shù)據(jù)的綁定)。
案例:課程添加及保存的維護(hù)界面。
描述:創(chuàng)建增加課程的方法,并跳轉(zhuǎn)課程增加的界面,設(shè)定訪問該方法的路徑為admin,請求限定為request,限制有一個(gè)請求參數(shù)add(意思是瀏覽器訪問時(shí)候路徑后+?add),注意:edit.jsp中標(biāo)簽的name屬性應(yīng)當(dāng)和模型對象中的Course屬性名稱一致,
隨后Controller中添加增加課程的方法,該方法通過在方法里設(shè)置Course對象來獲取前端form表單提交的數(shù)據(jù),這里通過返回"redirect:view2/"+course.getCourseId();就可以重定向到viewCourse2的方法并進(jìn)行添加課程的展示,添加日志信息確定是否攔截到了表單的數(shù)據(jù)信息,并把它綁定到了模型對象中l(wèi)og.debug("Info of Course:");log.debug(ReflectionToStringBuilder.toString(course)),ReflectionToStringBuilder是apache.lang包中Builder的一個(gè)類,進(jìn)行日志輸出進(jìn)行程序的調(diào)試很常見,將課程的內(nèi)容以鍵值對的形式,輸出在日志當(dāng)中,這樣就可以查看是否映射到了Course對象中。
映射多目錄結(jié)構(gòu)JSP:相對路徑即可。
@ModelAttribute:放在方法參數(shù)的注解,也可以完成數(shù)據(jù)綁定的功能,當(dāng)@ModelAttribute放在方法參數(shù)上時(shí),和使用這個(gè)標(biāo)簽沒有區(qū)別。當(dāng)將@ModelAttribute放在方法上標(biāo)識的時(shí)候,表示執(zhí)行這個(gè)controller類中的@RequestMapping標(biāo)注的方法前都要先執(zhí)行標(biāo)有@ModelAttribute的方法。
查看全部 -
Controller——傳統(tǒng)方式
Controller中使用HttpServletRequest對象(方法中使用HttpServletRequest對象)
【步驟1】pom文件中引入Servlet的API
【步驟2】通過request把邏輯數(shù)據(jù)放入域?qū)ο髍equest對象中
課程總結(jié):
1、通過@Controller的annotation聲明了一個(gè)Controller
2、通過@RequestMapping的annotation映射了URL和方法,通常出現(xiàn)在類級別和方法級別,二者共同組合完成了對一個(gè)URL映射請求的攔截。
3、通過URL template結(jié)合使用(@Requestparam and @PathVariable)兩個(gè)標(biāo)記可以將URL路徑之中的參數(shù)綁定到方法參數(shù)中
4、可以通過使用HttpServletRequest或者HttpSession之類的對象來獲取想要的結(jié)果。
查看全部 -
Controller——現(xiàn)代方式
通過注解SpringMVC可以識別Controller,并且將請求映射到正確的方
法。
【步驟1】:通知SpringMVC的DispatcherServlet這是一個(gè)Controller,所以在類上添加@Controller,這樣它就會(huì)被DispatcherServlet上下文環(huán)境管理,并且完成它的依賴注入。
【步驟2】:指明該Controller負(fù)責(zé)處理哪一個(gè)URL,通過添加@RequestMapping("/courses"),它處理Controller負(fù)責(zé)處理根URL,也就是courses下的路徑都會(huì)被它攔截到。
【步驟3】:指明映射到哪一個(gè)方法,所以在相應(yīng)方法上添加注解@RequestMapping(value="/view",method=RequestMethod.GET),同時(shí)可以限制從get方法過來的請求。
【步驟4】處理前端傳過來的參數(shù),第一種方式:也就是get請求帶了一個(gè)參數(shù)courseId=123,它需要被方法所識別,這里在方法的參數(shù)上綁定annotation,屬性就是前端傳過來的key(courseId)的名,通過在方法參數(shù)前使用@RequestParam("courseId"),這里可以通過日志查看綁定數(shù)據(jù)的行為(log.debug("In viewCourse,courseId={}",courseId)
解決不能再JSP頁面引入JSTL的原因?
<dependency>
? ? <groupId>javax.servlet</groupId>
? ? <artifactId>jstl</artifactId>
? ? <version>1.2</version>
</dependency>
第二種方式:綁定路徑參數(shù),這里使用@PathVariable("course"),要在URL路徑中顯示聲明這個(gè)路徑,也就是在@RequestMapping注解的value屬性中,在路徑后使用/{courseId}花括號括起來表示一個(gè)路徑變量。
例如訪問路徑:http://localhost:8080/view2/courseId=123
查看全部 -
Controller——基礎(chǔ)代碼
根據(jù)課程的ID查詢某一個(gè)課程的詳情
創(chuàng)建名稱為CourceController,首先有個(gè)依賴CourseService來完成課程查詢的業(yè)務(wù)邏輯功能,并且通過@Autowired對其進(jìn)行自動(dòng)注入,之后可以添加日志,在pom中添加日志的依賴,private static Logger log=LoggerFactory.getLogger(CourseController.class),調(diào)用業(yè)務(wù)邏輯方法完成ID的查詢,所以提供一個(gè)方法,傳入課程ID和SpringMVC提供特有的類型Model,然后再向Model中添加模型對象,調(diào)用CourseService的邏輯方法,并把返回的對象通過Model的addAttribute(course),前端頁面EL表達(dá)式的對象名就是course,就可以通過該對象進(jìn)行取屬性,由于使用了SpringMVC的InternalResourceViewResolver,所以返回的時(shí)候只需要給定jsp的名字即可如下圖。
查看全部 -
用Spring MVC開發(fā)一個(gè)課程管理模塊
配置文件:
【配置1】——web應(yīng)用的部署描述文件web.xml,當(dāng)前的web.xml是由maven自動(dòng)生成的,它用到web-app_2_3的版本,這個(gè)標(biāo)準(zhǔn)之下,JSP頁面會(huì)默認(rèn)將EL表達(dá)式語言關(guān)閉,所以要將它替換掉,使用web_app_2_4以上版本,如下圖,這樣Web應(yīng)用就可以使用EL表達(dá)式。
【配置2】——web.xml中加入Spring和SpringMVC的聲明,以及所需Spring配置文件和SpirngMVC所需路徑,如下圖,所以現(xiàn)在有兩個(gè)上下文環(huán)境一個(gè)是SpringMVC的上下文環(huán)境,一個(gè)是Spring的上下文環(huán)境(提供了所有應(yīng)用公共使用的一些組件、一些服務(wù),有service層、dao層等等,這些服務(wù)是被整個(gè)應(yīng)用所共享的,沒有局限在某一個(gè)DispatcherServlet上下文環(huán)境之中),另外一個(gè)則是與DispatcherServlet上下文相關(guān)的WebApplicationContext上下文,該上下文包含Controllers、HandlerMapping、ViewResolver,這里通常指的是配置文件,可以有多個(gè)DispatcherServlet,多個(gè)DispatcherServlet可以使用公共的WebApplicationContext,可以使用不同的DispathcerServlet進(jìn)行不同的分發(fā),更好進(jìn)行不同類型的請求。
【配置3】——DispatcherServlet配置文件的配置。
【配置4】——Spring配置文件的配置。
查看全部
舉報(bào)