9.SpringMVC

SpringMVC好幾年前就出來了,不過火起來是從2015年開始宾娜,當(dāng)時正好趕上struts2沒落带膜,沒落的原因主要是struts2漏洞吩谦,比較多,而且影響較大膝藕,這就導(dǎo)致了很多互聯(lián)網(wǎng)企業(yè)不敢采用struts2式廷,進(jìn)而繼續(xù)進(jìn)行控制層的技術(shù)選型。剛好SpringMVC出來了芭挽,而且先天基于Spring滑废,基因較好,而且在設(shè)計時彌補(bǔ)了struts2的好多不足袜爪,因?yàn)榫突鹌饋砹恕?/p>

時至今日蠕趁,基于java的web開發(fā)在控制層進(jìn)行技術(shù)選型時,首選項(xiàng)就是SpringMVC辛馆。

當(dāng)然技術(shù)的更替是不可避免的俺陋,哪項(xiàng)技術(shù)都有如日中天的時候,哪項(xiàng)技術(shù)也都有日薄西山的時刻怀各,也許再過幾年倔韭,更好的控制層框架出來,SpringMVC也會逐漸沒落瓢对。

SpringMVC相較于Struts2,優(yōu)點(diǎn)主要有以下幾點(diǎn):

  • 目前漏洞較少胰苏,安全還是第一位的
  • 基于方法的url映射硕蛹,相較于struts2基于class的,更靈活硕并,不過也更容易亂寫法焰,一定要提前約束好
  • 和spring的整合很簡單,當(dāng)然性能比struts2要好一些
  • spring提供ajax接口更加簡單
  • springMVC整合其他表現(xiàn)層框架也更簡單倔毙,比如freemarker等
  • 注解更加靈活埃仪,更容易提供基于REST接口的API

下面簡單介紹一下SpringMVC的配置。

pom.xml配置

 <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.18</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.25</version>
        </dependency>
    </dependencies>

依賴?yán)锩婕恿藄pring-web和spring-webmvc這兩個陕赃,spring-web主要是http請求的處理卵蛉,spring-webmvc主要是view部分的封裝颁股。

web.xml新增spring-mvc啟動配置

<servlet> 
        <servlet-name>springMVC</servlet-name>  
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        <init-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>classpath*:/servlet-context.xml</param-value>  
        </init-param>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>  
        <url-pattern>*.htm</url-pattern>  
    </servlet-mapping>

org.springframework.web.servlet.DispatcherServlet這個類是Springmvc的啟動類,隨著web容器一起啟動傻丝,啟動時加載 servlet-context.xml這個配置文件甘有。

所有請求都以.htm作為后綴,這個和普通的servlet是一樣的葡缰。

servlet-context.xml配置

這個是SpringMVC的配置文件亏掀,這里只介紹最基礎(chǔ)的一些。

 <context:component-scan base-package="com.critc"/>

    <!-- 默認(rèn)的注解映射的支持泛释,自動注冊DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
    <mvc:annotation-driven/>

    <!-- 視圖解釋類 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    </bean>

    <!-- 對靜態(tài)資源文件的訪問-->
    <mvc:resources mapping="/assets/**" location="/assets"/>

<context:component-scan base-package="com.critc"/>這句話和spring配置里面一樣滤愕,按路徑掃秒包。

  • bean:表示指定的視圖解析器
  • viewClass: 表示要解析的視圖類型
  • prefix/suffix: 表示路徑前綴/后綴怜校,假設(shè) ViewName 為 index.jsp该互,則完整路徑為/WEB-INF/views/index.jsp

這里說明一下,為什么view的文件夾都放在WEB-INF下面韭畸,這個文件夾下面的文件都不能直接被url訪問宇智,開發(fā)時一般的view類型都是jsp,為了防止別人直接訪問jsp胰丁,就簡單一些随橘,直接放在WEB-INF下了。

<mvc:resources mapping="/assets/**" location="/assets"/>這里定義靜態(tài)文件锦庸,這個文件夾下面的文件在springmvc啟動后机蔗,都會加載在緩存,也起到緩存處理的作用甘萧。

StaffController.java

@Controller
@RequestMapping("/staff")
public class StaffController {
    @RequestMapping("/index")
    public ModelAndView index() {
        ModelAndView mv = new ModelAndView();
        StaffDao staffDao = new StaffDao();
        List<Staff> list = staffDao.list();
        mv.addObject("list", list);
        mv.setViewName("staff");
        return mv;
    }
}

@Controller在類上加上這個注解萝嘁,就說明這個類是控制層處理的類。

@RequestMapping這個注解指url映射的路徑扬卷,可以在類上加牙言,也可以在方法上加,兩個如果都加的話怪得,逐級遞增咱枉,比如類上加@RequestMapping("/staff"),方法上加@RequestMapping("/index")徒恋,則整個url訪問路徑為/staff/index.htm蚕断,確實(shí)非常方便。

staff.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    員工列表
    <br />
    <table border="1">
        <tr>
            <td>編號</td>
            <td>姓名</td>
        </tr>
        <c:forEach var="staff" items="${list }" varStatus="st">
            <tr>
                <td>${staff.id }</td>
                <td>${staff.name}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

jsp文件還是很簡單的入挣,采用JSTL作為標(biāo)簽處理亿乳。這里沒有用springMVC自帶的標(biāo)簽,主要原因是JSTL都熟悉径筏,而且比較簡單葛假。

其余的dao和model就不在寫了光稼,和以前一樣慎式,沒什么區(qū)別。

**
SpringMVC因?yàn)樘`活,所以在項(xiàng)目開發(fā)前還是要做一些約定欠肾,注解的前提就是約定大于配置蚓峦。**

主要約定就是RequestMapping的限制滴劲,如下:

  • 方法級的映射一定要和方法名一致底扳,比如@RequestMapping("/index"),方法名一定是index()遏暴,避免引起歧義或混亂
  • 類名級的映射在項(xiàng)目開發(fā)前一定要約定好侄刽,一般以大模塊名作為一級映射,比如 sys朋凉,系統(tǒng)管理的所有controller都以這個開頭州丹。

源碼下載

本工程詳細(xì)源碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市杂彭,隨后出現(xiàn)的幾起案子墓毒,更是在濱河造成了極大的恐慌,老刑警劉巖亲怠,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件所计,死亡現(xiàn)場離奇詭異,居然都是意外死亡团秽,警方通過查閱死者的電腦和手機(jī)主胧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來习勤,“玉大人踪栋,你說我怎么就攤上這事⊥急希” “怎么了夷都?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吴旋。 經(jīng)常有香客問我损肛,道長,這世上最難降的妖魔是什么荣瑟? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮摩泪,結(jié)果婚禮上笆焰,老公的妹妹穿的比我還像新娘。我一直安慰自己见坑,他們只是感情好嚷掠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布捏检。 她就那樣靜靜地躺著,像睡著了一般不皆。 火紅的嫁衣襯著肌膚如雪贯城。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天霹娄,我揣著相機(jī)與錄音能犯,去河邊找鬼。 笑死犬耻,一個胖子當(dāng)著我的面吹牛踩晶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枕磁,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渡蜻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了计济?” 一聲冷哼從身側(cè)響起茸苇,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沦寂,沒想到半個月后学密,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凑队,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年则果,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漩氨。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡西壮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叫惊,到底是詐尸還是另有隱情款青,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布霍狰,位于F島的核電站抡草,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蔗坯。R本人自食惡果不足惜康震,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宾濒。 院中可真熱鬧腿短,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钝诚,卻和暖如春颖御,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凝颇。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工潘拱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祈噪。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓泽铛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辑鲤。 傳聞我的和親對象是個殘疾皇子盔腔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

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