Spring MVC基礎入門
Spring MVC簡介
Spring Web MVC是一種基於Java的實現了Web MVC設計模式的請求驅動型別的輕量級Web框架,即使用了MVC架構模式的思想,將web層進行職責解耦,基於請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發,Spring Web MVC也是要簡化我們日常Web開發的。
Spring Web MVC處理請求的流程:
具體執行步驟如下:
1、 首先使用者傳送請求到前端控制器,前端控制器根據請求資訊(如URL)來決定選擇哪一個頁面控制器進行處理並把請求委託給它;
2、 頁面控制器接收到請求後,進行功能處理,處理請求和建立相應的Model,處理完畢後返回一個ModelAndView(模型資料和邏輯檢視名);
3、 前端控制器收回控制權,然後根據返回的邏輯檢視名,選擇相應的檢視進行渲染,並把模型資料傳入以便檢視渲染;
4、 前端控制器將響應返回給使用者,至此整個結束。
Spring MVC Demo
寫一個簡單的例子來說明Spring MVC是如何工作的,該例子預設啟動一個歡迎頁面,並有一個login的頁面,輸入使用者名稱和密碼,當用戶名和密碼不為空返回“登入成功”,當輸入有空時,則停留在login頁面,例子非常簡單。
新建一個Dynamic Web Project。
看web.xml的配置:
<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID"version="3.0"> <display-name>SpringMVC_01</display-name> <welcome-file-list> <!--預設啟動頁面--> <welcome-file>home.jsp</welcome-file> </welcome-file-list> <!--配置SpringMVCDispatcherServlet--> <servlet> <!--這裡的name要和servlet-mapping裡的name一樣--> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/springConfig.xml</param-value> </init-param> <!--startup時就load配置檔案--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <!--servlet要攔截的地址格式--> <!--<url-pattern>*.html</url-pattern>--><!--只攔截html--> <url-pattern>/</url-pattern><!--所有的都攔截--> </servlet-mapping> <!--監聽spring上下文容器--> <!--<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>--> <!--如果配置了ContextLoaderListener,就要配置這裡的contextConfigLocation--> <!--<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:config/applicationContext.xml</param-value> </context-param>--> </web-app>
load-on-startup:表示啟動容器時初始化該Servlet;
url-pattern:表示哪些請求交給Spring Web MVC處理, “/” 是用來定義預設servlet對映的。也可以如“*.html”表示攔截所有以html為副檔名的請求。
注意配置Spring MVC DispatcherServlet:預設DispatcherServlet會載入WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml配置檔案。即每個servlet都要有個配置檔案,檔名為[Servlet名字]-servlet.xml配置檔案。但這裡我使用了contextConfigLocation來設定配置檔案的檔名和路徑。
springConfig.xml的配置:
<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsd"> <!--spring註解要掃描的包--> <context:component-scanbase-package="com.spring.test"/> <beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--配置還回的View的字首和字尾--> <propertyname="prefix"value="/WEB-INF/pages/"/> <propertyname="suffix"value=".jsp"/> </bean></beans>
InternalResourceViewResolver:用於支援Servlet、JSP檢視解析;
prefix和suffix:查詢檢視頁面的字首和字尾(字首[邏輯檢視名]字尾),比如傳進來的邏輯檢視名為hello,則該該jsp檢視頁面應該存放在“WEB-INF/pages/hello.jsp”;
login 頁面:
<%@pagelanguage="java"contentType="text/html;charset=utf-8" pageEncoding="utf-8"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html;charset=ISO-8859-1"><title>登入</title></head><body><h2>登入</h2><formaction="login.html"method="post"> username:<inputtype="text"name="username"/> <p> password:<inputtype="password"name="password"/> <p> <inputtype="submit"value="submit"/> </form> </body></html>
login成功頁面:
<%@pagelanguage="java"contentType="text/html;charset=utf-8" pageEncoding="utf-8"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"><title>登入成功</title></head><body><h2>登入成功</h2>username:${username} <p>password:${password} </body></html>
Home頁面:
<%@pagelanguage="java"contentType="text/html;charset=utf-8" pageEncoding="utf-8"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html;charset=ISO-8859-1"><title>HelloSpringMVC</title></head><body> <h2>springmvc歡迎你</h2> </body></html>
Controller實現:
HomeController:
packagecom.spring.test;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.servlet.ModelAndView; @ControllerpublicclassHomeController{ @RequestMapping("/home") publicModelAndViewindex(){ //建立模型跟檢視,用於渲染頁面。並且指定要返回的頁面為home頁面 ModelAndViewmav=newModelAndView("home"); returnmav; } }
UserController:
packagecom.spring.test;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.servlet.ModelAndView; @ControllerpublicclassUserController{ @RequestMapping(value="/login") publicModelAndViewlogin(Stringusername,Stringpassword){ //驗證傳遞過來的引數是否正確,否則返回到登陸頁面。 if(this.checkParams(newString[]{username,password})){ //指定要返回的頁面為succ.jsp ModelAndViewmav=newModelAndView("success"); //將引數返回給頁面 mav.addObject("username",username); mav.addObject("password",password); returnmav; } returnnewModelAndView("login"); } privatebooleancheckParams(String[]params){ for(Stringparam:params){ if(param==""||param==null||param.isEmpty()){ returnfalse; } } returntrue; } }
Spring常用註解:
@Autowired:Spring通過一個BeanPostProcessor對 @Autowired 進行解析,所以要讓 @Autowired 起作用必須事先在 Spring 容器中宣告 AutowiredAnnotationBeanPostProcessor Bean。
<!--該BeanPostProcessor將自動起作用,對標註@Autowired的Bean進行自動注入--><beanclass="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
@Controller:通過@Controller標註即可將class定義為一個controller類,成為Spring的一個bean。為使Spring能找到定義為controller的bean,需要在spring配置檔案中增加如下配置:
<context:component-scanbase-package="com.spring.test"/>
@RequestMapping:在類定義處和方法定義處使用 @RequestMapping 註解,就可以很容易通過URL引數指定Controller的處理方法了。
@RequestParam:通過 @RequestParam 註解指定繫結的URL引數。
@RequestMapping(params="method=listBoardTopic")publicStringlistBoardTopic(@RequestParam("id")inttopicId,Useruser)
對listBoardTopic()請求處理方法的 topicId 入參標註了 @RequestParam("id") 註解,所以它將和id的URL引數繫結。
執行結果: