1. 程式人生 > 實用技巧 >Spring MVC基礎入門

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引數繫結。

執行結果: