SpringMVC簡單介紹
無非是使用者頁面通過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簡單多了。就寫這點吧。其他的還沒怎麼了解。