1. 程式人生 > >SpringMVC簡單介紹

SpringMVC簡單介紹

首先,大家只要理解了MVC。其實所有的MVC 框架都是大同小異的。

無非是使用者頁面通過HttpServletRequest向後臺傳值。框架的配置檔案會通過Request中的URL格式和引數找到相對應的Action(Spring mvc中叫Controller)。Action執行完成後或者返回一個新的頁面或者只返回一些資料。可以放在Request中或者Session中在頁面中取得。然後頁面繼續其他功能。(個人理解!)

先看一下Spring MVC 的處理流程:

1.客戶發出請求request,DispatchServlet(Spring 的前端控制器)負責統一分發請求到Spring控制器(Controller)。
2.統一分發之前,需要藉助於handlermapping物件定位到具體的Spring控制器(Controller)。
3.Spring控制器處理DispatchServlet分發過來的的請求,執行業務邏輯或呼叫業務邏輯元件。
4.一旦控制器處理完客戶請求,則返回一個ModelAndView 物件給DispatchServlet前端控制器.,ModelAndView 物件包含資料模型和檢視資訊(很明顯Model和View)。

5.DispatchServlet詢問檢視解析器,查詢相應檢視。

6.由某具體檢視為使用者顯示頁面。

還是很容易理解的吧。就開始試試吧。

首先在web.xml中配置上DispatchServlet(Spring 的前端控制器)

新增上<!-- Spring配置 -->
  <servlet>
    <servlet-name>spring-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
 <param-value>/WEB-INF/config/spring/spring-dispather.xml</param-value> <!-- 指明Spring mvc的配置檔案地址 -->
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>spring-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

配置好這個就在相應的目錄下建立spring的配置檔案。先來個Spring 配置檔案的片段吧。對應著說:

<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"
xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
        http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util-3241.xsd
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.2.xsd
        http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
       
    <!-- 開啟controller註解支援 -->      
    <mvc:annotation-driven />

<!-- 注:指定應用註解的包,如果base-package=com.avicit 則註解事務不起作用 -->
<context:component-scan base-package="com.hcc">
</context:component-scan>

<!-- 載入靜態資源 -->
<mvc:default-servlet-handler/>

<!-- 對模型檢視名稱的解析,即在模型檢視名稱新增前後綴 -->    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"

 p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
    
    <!-- 上傳攔截,如最大上傳值及最小上傳值  
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
    
        <property name="maxUploadSize" value="10000000" />
        <property name="maxInMemorySize" value="4096"/>
    </bean>  
     -->
<!--  ***************配置資料來源************** --> 
<!-- mysql資料來源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">   

 
      <property name="driverClassName" value="com.mysql.jdbc.Driver" />         
      <property name="url" value="jdbc:mysql://localhost:3306/test" />         
      <property name="username" value="root" />         
      <property name="password" value="123456" />   


      
      <property name="maxActive"><value>500</value></property>
      <!-- 設定最大空閒時間(毫秒) -->
      <property name="maxIdle"><value>10000</value></property>
      <!-- 設定最大等待時間(毫秒) -->
      <property name="maxWait"><value>1000</value></property>
      <!-- 超時自動收回 -->
      <property name="removeAbandoned"><value>true</value></property>
      <!--
                  超時時間(以秒數為單位)設定超時時間有一個要注意的地方,
                  超時時間=現在的時間-程式中建立Connection的時間,如果
                  maxActive比較大,比如超過100,那麼removeAbandonedTimeout
                  可以設定長一點比如180, 也就是三分鐘無響應的連線進行回收,
                  當然應用的不同設定長度也不同。
      -->
      <property name="removeAbandonedTimeout"><value>180</value></property>
      <!-- 在自動回收超時連線的時候列印連線的超時錯誤 -->
      <property name="logAbandoned"><value>true</value></property>        
</bean> 

<!-- (事務管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

<!--  jdbcTemplate資料庫操作類 -->  
    <bean id="jdbcTemplate"  class="org.springframework.jdbc.core.JdbcTemplate">  
        <property name="dataSource" ref="dataSource" />  
    </bean>  
</beans>

上面都寫了註釋,相信能看到這篇文章的人都能看懂吧,不多解釋。以上都是常用到的配置,其他的配置我還沒碰到,

不多說。說多了也掌握不了。學東西還是在專案上學得快。

配置好之後就是Spring mvc的框架下開發了。

之所以認為Spring mvc開發比Struts2簡單很多就是因為註釋。 你看Spring檔案中就沒有對應Controller的配置。

不像Struts2每個Action都要配置上來,雖然用萬用字元也簡單不少。不過這個完全不寫,通過註釋搞定就行了。舉個例子:

@Controller
public class LoginController {
@RequestMapping( value = "dologin") 
@ResponseBody 

@SessionAttributes({"username","xxx"})
public Map<String,Object> dologin(HttpServletRequest req,

Model model,
@RequestParam(value = "username") String username,
@RequestParam(value = "password") String password
){
Map<String,Object> res = new HashMap<String,Object>();

model.addAttribute("username",username);
if(username.equals("hello")&&password.equals("hello")){
res.put("status", true);
res.put("result", "success");
}else{
res.put("status",false);
res.put("result", "使用者名稱或密碼錯誤!");
}
return res;
}
}

這段程式碼的意思就不用我解釋了吧。

直接看註釋,@Controller 這個註釋就是表明此類是個Controller類(對應於Struts2的Action類),

有了此註釋就不用繼承基本Controller類了。

@RequestMapping( value = "login/dologin") 這個註釋可以用於方法上面也可以用於類上面。

我只說用在方法上面(我覺得用在類上面複雜)。 看到裡面有個value引數了吧。

這個引數的值就是匹配的request中url的值,也就是訪問這個方法的話在url後面寫login/dologin這個就找到這個方法了。

這個對應比Struts2中寫個Action方法都去配置檔案中寫個配置簡單吧。

@ResponseBody 這個註釋是指不反回檢視了只返回資料。 

SpringMVC中controller的預設返回值型別是ModelAndView就是檢視和資料。

別問我為什麼資料用Model來存,Model是什麼?我也不懂,跟著用就行了。

就我理解我認為Model就是個jsp中用來頁面間傳值的request。程式碼中有句model.addAttribute("username",username);

就是把username的值存在名字叫做”username“的屬性中。然後在返回的頁面中就可以通過${username}來取得username的值。

@SessionAttributes 這個註釋放在類的上面。看了上面model.addAttribute("username",username);就好理解了。

model.addAttribute("username",username);是將屬性”username“放在request中。

如果在類上面加了@SessionAttributes({"username"})那麼”username“這個屬性就會加到session中隨時來取。

@RequestParam(value = "username",defaultValue ="xxx") 這個註釋,是指頁面訪問此方法的時候url後面加的引數在這接收。

例如url 是 ……login/dologin?username="aaa 就是想後臺傳了個username引數。那麼可以通過此註釋來接收引數。

還有這段程式碼中沒用到的註釋:

@Service("businessService")     對於這個註釋我認為就是向Spring配置檔案中註釋<bean>.這個註釋放在類的上面。

例如放在BusinessServiceImpl 的上面那麼就相當於在配置檔案中配置了

<bean id="businessService"  class="com.xxx.xxx.BusinessServiceImpl" />

@Resource(name = "businessService") 這個註釋就是注入的意思。

上面註釋相當於配置了bean那麼這個註釋就是取得那個bean的意思。用法為 在註釋下面宣告一個此物件就相當於new 了這物件了,

就可以拿來用了。例如:

@Resource(name = "businessService")

BusinessService businessService;

(BusinessService是BusinessServiceImpl 實現的介面,應該能想到。)這樣就可以直接拿businessService這個物件來用了。

註釋就說這麼幾個吧。其他的我用的還不多。

然後說下Spring mvc的controller方法預設返回 的ModelAndView型別是怎麼回事。 這個類應該是spring mvc中特有的。

一般如果需要返回頁面的話 就用這個返回類。 這個類物件的生成方法是:ModelAndView mv = new ModelAndView("login/success");

其中的引數是個jsp頁面。可能你要問這為什麼是個jsp頁面,看上面的spring配置檔案中有個配置是:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />

看到了嗎。他會自動把檢視的前後綴加上。這個頁面就是"/WEB-INF/jsp/login/success.jsp"。這樣的話就會返回success.jsp這個頁面,

Model上面說了就是向頁面傳值。作用域和Request一樣。把他當做Request就行了。取值方式都一樣。${requestScope.xxxxxx}。

如果是傳大量資料的話 一般也不用這個傳。比如用List返回一系列資料的話。這樣的話 返回值就不是ModelAndView型別了。

就不能同時返回檢視。所以用@ResponseBody 註釋。來指明只返回資料部返回檢視。

想學習的話 可以找點demo試試。看是不是比Struts簡單多了。就寫這點吧。其他的還沒怎麼了解。