spring mvc 中web.xml配置信息解釋

原文轉(zhuǎn)至:http://www.cnblogs.com/superjt/p/3309255.html

圖片發(fā)自簡書App

現(xiàn)在主流的Web MVC框架除了Struts這個主力 外肮之,其次就是Spring MVC了胁艰,因此這也是作為一名程序員需要掌握的主流框架,框架選擇多了,應(yīng)對多變的需求和業(yè)務(wù)時帅矗,可實(shí)行的方案自然就多了戒努。不過要想靈活運(yùn)用Spring MVC來應(yīng)對大多數(shù)的Web開發(fā)港谊,就必須要掌握它的配置及原理永乌。
一贾漏、Spring MVC環(huán)境搭建:(Spring 2.5.6 + Hibernate 3.2.0)
1. jar包引入
Spring 2.5.6:spring.jar候学、spring-webmvc.jar、commons-logging.jar纵散、cglib-nodep-2.1_3.jar
Hibernate 3.6.8:hibernate3.jar梳码、hibernate-jpa-2.0-api-1.0.1.Final.jar、antlr-2.7.6.jar伍掀、
commons-collections-3.1掰茶、dom4j-1.6.1.jar、javassist-3.12.0.GA.jar硕盹、jta-1.1.jar符匾、slf4j-api-
1.6.1.jar、slf4j-nop-1.6.4.jar瘩例、相應(yīng)數(shù)據(jù)庫的驅(qū)動jar包

SpringMVC是一個基于DispatcherServlet的MVC框架啊胶,每一個請求最先訪問的都是DispatcherServlet,DispatcherServlet負(fù)責(zé)轉(zhuǎn)發(fā)每一個Request請求給相應(yīng)的Handler垛贤,Handler處理以后再返回相應(yīng)的視圖(View)和模型(Model)焰坪,返回的視圖和模型都可以不指定,即可以只返回Model或只返回View或都不返回聘惦。
DispatcherServlet是繼承自HttpServlet的某饰,既然SpringMVC是基于DispatcherServlet的,那么我們先來配置一下DispatcherServlet,好讓它能夠管理我們希望它管理的內(nèi)容黔漂。

HttpServlet是在web.xml文件中聲明的诫尽。
<!-- Spring MVC配置 --><!-- ====================================== --><servlet> 
<servlet-name>spring</servlet-name> 
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 <!-- 可以自定義servlet.xml配置文件的位置和名稱,默認(rèn)為WEB-INF目錄下炬守,名稱為[<servlet-  name>]-servlet.xml牧嫉,
  如spring-servlet.xml <init-param> <param-name>contextConfigLocation</param-name> 
  <param-value>/WEB-INF/spring-servlet.xml</param-value> 默認(rèn) </init-param> --> 
  <load-on-startup>1</load-on-startup></servlet>
<servlet-mapping> <servlet-name>spring</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>
 <!--Spring配置 -->
  <listener> <listenerclass> org.springframework.web.context.ContextLoaderListener 
  </listener-class></listener> 
  <!-- 指定Spring Bean的配置文件所在目錄。默認(rèn)配置在WEB-INF目錄下 -->
  <context-param> <param-name>contextConfigLocation</param-name> 
  <param-value>classpath:config/applicationContext.xml</param-value>
</context-param>

spring-servlet.xml配置
  spring-servlet這個名字是因?yàn)樯厦鎤eb.xml中<servlet-name>標(biāo)簽配的值為spring(<servlet-name>spring</servlet-name>)减途,再加上“-servlet”后綴而形成的spring-servlet.xml文件名酣藻,如果改為springMVC,對應(yīng)的文件名則為springMVC-servlet.xml鳍置。

<pre>
<?xml version="1.0" encoding="UTF-8"?>
<~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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context<a >
http://www.springframework.org/schema/context/spring-context-3.0.xsd</a>">

<context:annotation-config />

<context:component-scan base-package="controller">
</context:component-scan>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />  

<~bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/jsp/" p:suffix=".jsp" />
</beans>
</pre>

DispatcherServlet會利用一些特殊的bean來處理Request請求和生成相應(yīng)的視圖返回辽剧。
關(guān)于視圖的返回,Controller只負(fù)責(zé)傳回來一個值税产,然后到底返回的是什么視圖怕轿,是由視圖解析器控制的,在jsp中常用的視圖解析器是InternalResourceViewResovler砖第,它會要求一個前綴和一個后綴
在上述視圖解析器中撤卢,如果Controller返回的是blog/index,那么通過視圖解析器解析之后的視圖就是/jsp/blog/index.jsp梧兼。

主要是說說Controller.
一個類使用了@Controller進(jìn)行標(biāo)記的都是Controller
<pre>
package controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import entity.User;
@Controller
//類似Struts的Actionpublic class TestController {
@RequestMapping("test/login.do")
// 請求url地址映射放吩,類似Struts的action-mapping
public String testLogin(
@RequestParam(value="username") String username, String password, HttpServletRequest request) {
// @RequestParam是指請求url地址映射中必須含有的參數(shù)(除非屬性required=false)
// @RequestParam可簡寫為:@RequestParam("username")
if (!"admin".equals(username) || !"admin".equals(password)) {
return "loginError"; // 跳轉(zhuǎn)頁面路徑(默認(rèn)為轉(zhuǎn)發(fā)),該路徑不需要包含spring-servlet配置文件中配置的前綴和后綴 }
return "loginSuccess"; }

@RequestMapping("/test/login2.do")
public ModelAndView testLogin2(String username, String password, int age){
// request和response不必非要出現(xiàn)在方法中羽杰,如果用不上的話可以去掉
// 參數(shù)的名稱是與頁面控件的name相匹配渡紫,參數(shù)類型會自動被轉(zhuǎn)換
if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {
return new ModelAndView("loginError");
// 手動實(shí)例化ModelAndView完成跳轉(zhuǎn)頁面(轉(zhuǎn)發(fā)),效果等同于上面的方法返回字符串
}
return new ModelAndView(new RedirectView("../index.jsp"));
// 采用重定向方式跳轉(zhuǎn)頁面
// 重定向還有一種簡單寫法
// return new ModelAndView("redirect:../index.jsp");
}
@RequestMapping("/test/login3.do")
public ModelAndView testLogin3(User user) {
// 同樣支持參數(shù)為表單對象考赛,類似于Struts的ActionForm惕澎,
User不需要任何配置,直接寫即可 String username = user.getUsername();
String password = user.getPassword();
int age = user.getAge();
if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {
return new ModelAndView("loginError");
}
return new ModelAndView("loginSuccess");
} @Resource(name = "loginService")
// 獲取applicationContext.xml中bean的id為loginService的颜骤,并注入 private LoginService loginService; //等價于spring傳統(tǒng)注入方式寫get和set方法唧喉,這樣的好處是簡潔工整,省去了不必要得代碼 @RequestMapping("/test/login4.do")
public String testLogin4(User user) {
if (loginService.login(user) == false){
return "loginError";
}
return "loginSuccess";
}}
</pre>

以上4個方法示例忍抽,是一個Controller里含有不同的請求url八孝,也可以采用一個url訪問,通過url參數(shù)來區(qū)分訪問不同的方法鸠项,代碼如下:
<pre>
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller@RequestMapping("/test2/login.do")
// 指定唯一一個*.do請求關(guān)聯(lián)到該Controllerpublic
public class TestController2 {
@RequestMapping
public String testLogin(String username, String password, int age) {
// 如果不加任何參數(shù)干跛,則在請求/test2/login.do時,便默認(rèn)執(zhí)行該方法
if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {
return "loginError";
}
return "loginSuccess";
}
@RequestMapping(params = "method=1", method=RequestMethod.POST)
public String testLogin2(String username, String password) {
// 依據(jù)params的參數(shù)method的值來區(qū)分不同的調(diào)用方法
// 可以指定頁面請求方式的類型祟绊,默認(rèn)為get請求
if (!"admin".equals(username) || !"admin".equals(password)) {
return "loginError";
}
return "loginSuccess"; }
@RequestMapping(params = "method=2")
public String testLogin3(String username, String password, int age) {
if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {
return "loginError";
} return "loginSuccess";
}}
</pre>

其實(shí)RequestMapping在Class上楼入,可看做是父Request請求url哥捕,而RequestMapping在方法上的可看做是子Request請求url,父子請求url最終會拼起來與頁面請求url進(jìn)行匹配嘉熊,因此RequestMapping也可以這么寫:
<pre>
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller@RequestMapping("/test3/*")
// 父request請求url
public class TestController3 {
@RequestMapping("login.do")
// 子request請求url遥赚,拼接后等價于/test3/login.do
public String testLogin(String username, String password, int age) {
if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {
return "loginError";
}
return "loginSuccess"; }
}
</pre>

在SpringMVC中常用的注解還有@PathVariable,@RequestParam阐肤,@PathVariable標(biāo)記在方法的參數(shù)上鸽捻,利用它標(biāo)記的參數(shù)可以利用請求路徑傳值,看下面一個例子
<pre>
@RequestMapping(value="/comment/{blogId}", method=RequestMethod.POST)
public void comment(Comment comment,@PathVariable int blogId, HttpSession session, HttpServletResponse response)
throws IOException { }
</pre>

在該例子中泽腮,blogId是被@PathVariable標(biāo)記為請求路徑變量的,如果請求的是/blog/comment/1.do的時候就表示blogId的值為1. 同樣@RequestParam也是用來給參數(shù)傳值的衣赶,但是它是從頭request的參數(shù)里面取值诊赊,相當(dāng)于request.getParameter("參數(shù)名")方法。

在Controller的方法中府瞄,如果需要WEB元素HttpServletRequest碧磅,HttpServletResponse和HttpSession,只需要在給方法一個對應(yīng)的參數(shù)遵馆,那么在訪問的時候SpringMVC就會自動給其傳值鲸郊,但是需要注意的是在傳入Session的時候如果是第一次訪問系統(tǒng)的時候就調(diào)用session會報(bào)錯,因?yàn)檫@個時候session還沒有生成货邓。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秆撮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子换况,更是在濱河造成了極大的恐慌职辨,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戈二,死亡現(xiàn)場離奇詭異舒裤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)觉吭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進(jìn)店門腾供,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鲜滩,你說我怎么就攤上這事伴鳖。” “怎么了绒北?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵黎侈,是天一觀的道長。 經(jīng)常有香客問我闷游,道長峻汉,這世上最難降的妖魔是什么贴汪? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮休吠,結(jié)果婚禮上扳埂,老公的妹妹穿的比我還像新娘。我一直安慰自己瘤礁,他們只是感情好阳懂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柜思,像睡著了一般岩调。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赡盘,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天号枕,我揣著相機(jī)與錄音,去河邊找鬼陨享。 笑死葱淳,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抛姑。 我是一名探鬼主播赞厕,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼定硝!你這毒婦竟也來了皿桑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蔬啡,失蹤者是張志新(化名)和其女友劉穎唁毒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體星爪,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浆西,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了顽腾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片近零。...
    茶點(diǎn)故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抄肖,靈堂內(nèi)的尸體忽然破棺而出久信,到底是詐尸還是另有隱情,我是刑警寧澤漓摩,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布裙士,位于F島的核電站,受9級特大地震影響管毙,放射性物質(zhì)發(fā)生泄漏腿椎。R本人自食惡果不足惜桌硫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啃炸。 院中可真熱鬧铆隘,春花似錦、人聲如沸南用。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裹虫。三九已至肿嘲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筑公,已是汗流浹背睦刃。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留十酣,地道東北人。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓际长,卻偏偏與公主長得像耸采,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子工育,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評論 2 351

推薦閱讀更多精彩內(nèi)容