『框架整合』SpringMVC+Spring+Hibernate+Maven整合常見(jiàn)問(wèn)題

整理下自己在搭建SpringMVC+Spring+Hibernate+Maven框架時(shí)遇到的問(wèn)題肺孤。

1. classpath路徑解析

  • 在搭建框架時(shí)筐咧,我們經(jīng)常要用到classpath這個(gè)單詞,比如設(shè)置spring配置文件
<display-name>my app</display-name>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spirng-hbm.xml,classpath:spring-dispatcher.xml</param-value>
    </context-param>

classpath路徑脆贵,指的就是classes目錄医清,當(dāng)web項(xiàng)目發(fā)布后,java編譯后的class文件以及用到的配置文件都會(huì)被保存到這個(gè)目錄,此目錄在WEB-INF文件夾下卖氨,可以從Tomcat的wtpwebapps目錄下觀察到会烙。

  • 在開(kāi)發(fā)過(guò)程中负懦,可以理解這個(gè)路徑為項(xiàng)目源文件路徑
    不使用maven管理項(xiàng)目的話,就是src目錄下柏腻,如果使用maven纸厉,就是src/main/resourcesrc/main/java目錄。
  • classpath*相比classpath多了個(gè)*號(hào)五嫂,它是指除了直接查找指定目錄颗品,還要查找lib目錄下jar包內(nèi)的配置文件。

2. JSP文件charset和pageEncoding區(qū)別

下面是每個(gè)JSP文件頭都會(huì)標(biāo)注的代碼:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

那么charsetpageEncoding區(qū)別是什么贫导?
我們知道JSP其實(shí)就是一個(gè)Servlet抛猫,也就是說(shuō)它是可以被編譯的。

  • pageEncoding是指當(dāng)前這個(gè).jsp文件的編碼格式孩灯,是通過(guò)什么編碼來(lái)進(jìn)行保存的闺金。
    當(dāng)這個(gè)JSP被解析編譯成.java文件時(shí),就是通過(guò)此屬性來(lái)讀取JSP文件峰档,這一步如果設(shè)置錯(cuò)誤败匹,就會(huì)在后臺(tái)出現(xiàn)亂碼。
  • charset是后臺(tái)操作完成讥巡,發(fā)送給瀏覽器(前端)所使用編碼掀亩,瀏覽器通過(guò)此編碼解析響應(yīng)信息,這個(gè)屬性等同于response.setCharacterEncoding()欢顷。
  • 如果沒(méi)有指定pageEncoding那么將以charset設(shè)定值保存JSP頁(yè)面槽棍。

3. 在web.xml通過(guò)過(guò)濾器配置編碼

我們可以在web.xml文件中進(jìn)行編碼配置,這樣就可以不用重復(fù)的寫(xiě)request/response.setCharacterEncoding().抬驴。
配置如下:

<filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>       
    </filter>

其中encoding參數(shù)作用是設(shè)置ServletRequest.setCharacterEncoding().
forceEncoding則是使ServletResponse的編碼設(shè)置和ServletRequest一致炼七。

4. EL表達(dá)式被當(dāng)做字符串處理

  • 有時(shí)我們會(huì)發(fā)現(xiàn)在JSP中使用EL表達(dá)式時(shí),會(huì)原封不動(dòng)的輸出${xxxx.xxx}布持,而不是運(yùn)算后的結(jié)果豌拙。
    這是因?yàn)閟ervlet除了2.4以外版本,都默認(rèn)忽視EL表達(dá)式题暖,將其當(dāng)做字符串處理按傅。
    在JSP文件中加入<%@ page isELIgnored="false" %>就可以激活EL表達(dá)式。
  • 上面的做法要在每個(gè)JSP文件都進(jìn)行配置胧卤,會(huì)很麻煩唯绍,也可以直接更改web.xml中的版本號(hào),進(jìn)行全局設(shè)置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    version="2.4"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

5. HQL語(yǔ)句操作的是實(shí)體類

當(dāng)我們使用HQL語(yǔ)句時(shí)枝誊,比如:session.createQuery("from Article").list();推捐,查詢的對(duì)象Article是項(xiàng)目中的實(shí)體類,而不是數(shù)據(jù)庫(kù)中article這個(gè)表名侧啼。

6. Hibernate連接數(shù)據(jù)庫(kù)的信息最好單獨(dú)使用文件

在spring中配置連接數(shù)據(jù)庫(kù)所需要的user.name``user.password,url等信息時(shí)牛柒,最好將其寫(xiě)成一個(gè).properties 文件,這樣我們?cè)谛薷臅r(shí)就不用動(dòng)配置文件了痊乾。
database.properties

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=

如果url寫(xiě)入xml文件中皮壁,要用&amp代替&,以免歧義解析錯(cuò)誤哪审。
springContext.xml

<bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:database.properties</value>
            </list>
        </property>
</bean>
<bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
</bean>

7. 絕對(duì)路徑與相對(duì)路徑

在項(xiàng)目中我們經(jīng)常要引用url地址蛾魄,比如/app/welcome.png或者./app/welcome.png。那么/前面那個(gè).有或者沒(méi)有是什么區(qū)別湿滓?
我們假設(shè)有個(gè)appweb項(xiàng)目

  • 如果前面有.滴须,那么這個(gè)是當(dāng)前位置的相對(duì)路徑,從當(dāng)前文件作為基準(zhǔn)叽奥,開(kāi)始計(jì)算路徑扔水。
  • 如果前面沒(méi)有.,那么這個(gè)路徑是根目錄的路徑朝氓,這里有個(gè)坑魔市,這個(gè)根目錄不一定是項(xiàng)目根目錄,也有可能是站點(diǎn)的根目錄赵哲。

這是很容易犯的錯(cuò)誤待德,找不到正確路徑,自然就會(huì)造成404枫夺。
所以建議大家在寫(xiě)路徑相關(guān)代碼時(shí)将宪,使用絕對(duì)路徑!

8. 配置視圖解析器

在使用SpringMVC時(shí)橡庞,我們經(jīng)常會(huì)在其配置文件中做如下配置:

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

其中InternalResourceViewResolver是一個(gè)視圖解析器较坛,通過(guò)配置它的屬性"prefix"和"suffix"來(lái)為Java代碼Controller中返回的ModelAndView加上前綴后綴,這樣就會(huì)去指定的路徑下(prefix)自動(dòng)解析視圖毙死,不用我們每次在ModelAndView中添加前綴后綴了燎潮,只需要寫(xiě)視圖名稱(jsp文件名稱)。

9.訪問(wèn)項(xiàng)目靜態(tài)資源

我在寫(xiě)項(xiàng)目試扼倘,無(wú)論怎樣也無(wú)法訪問(wèn)到圖片确封。
代碼片段:![](./image/welcomebgp.png),返回404錯(cuò)誤再菊。
經(jīng)過(guò)排查爪喘,原因是我在web.xml配置SpringMVC的Dispatcher是采用的下面代碼:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-dispatcher.xml</param-value>
        </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern> <!--注意這里-->
    </servlet-mapping>

其中<url-pattern>/</url-pattern>是指定Dispatcher的作用范圍,/代表接受所有的url請(qǐng)求纠拔。
因此./image/welcomebgp.png會(huì)被分發(fā)到Controller中秉剑,自然沒(méi)有對(duì)應(yīng)RequestMapping對(duì)應(yīng),返回404錯(cuò)誤稠诲。

解決方法通常有兩種:

  • <url-pattern>/</url-pattern>改成<url-pattern>*.do</url-pattern>這樣Dispatcher就只會(huì)攔截.do結(jié)尾的url請(qǐng)求侦鹏,正常的資源請(qǐng)求會(huì)直接到項(xiàng)目中尋找诡曙。
    這樣修改的話,我們的url都要以.do結(jié)尾略水,才能進(jìn)到Controller中价卤。
  • 在dispatcher的配置文件中,加入<mvc:resources>聲明渊涝。
<mvc:resources location="/css/" mapping="/css/**" />
<mvc:resources location="/js/" mapping="/js/**" />
<mvc:resources location="/image/" mapping="/image/**" />

此聲明可以使url能夠訪問(wèn)項(xiàng)目下的靜態(tài)資源慎璧,而不被dispatcher影響。
其中location="/image/"指定了資源所在位置跨释,在image文件夾下胸私。mapping="/image/**"指明了映射路徑,我們?cè)L問(wèn)資源時(shí)鳖谈,就要使用mapping路徑岁疼。
比如我要訪問(wèn)項(xiàng)目根目錄image/welcome.png資源,那么url我就要寫(xiě)url:./image/welcome.png蚯姆。

10.GET請(qǐng)求傳入后臺(tái)亂碼問(wèn)題

在項(xiàng)目中五续,我發(fā)現(xiàn)即使在web.xml中配置了編碼過(guò)濾器,在使用GET方式向后臺(tái)傳值時(shí)龄恋,還是會(huì)出現(xiàn)中文亂碼疙驾。
這是因?yàn)椋幋a過(guò)濾器是針對(duì)POST請(qǐng)求起作用的郭毕,而tomcat是對(duì)GETPOST請(qǐng)求處理方式是不同的它碎。其對(duì)GET默認(rèn)解碼方式是iso-8859-1,因此使用其他編碼显押,自然會(huì)出現(xiàn)亂碼問(wèn)題扳肛。

解決方法:更改tomcat對(duì)GET默認(rèn)解碼方式。
tomcat/conf/server.xml中找到<Connector>標(biāo)簽乘碑,加上URIEncoding="UTF-8"即可挖息。
注意:可能你會(huì)發(fā)現(xiàn)這么修改還是不可以,這是因?yàn)?code>eclipse會(huì)使用自己的server.xml配置文件兽肤,這個(gè)文件在eclipse項(xiàng)目導(dǎo)航套腹,servers項(xiàng)目中,打開(kāi)項(xiàng)目资铡,找到配置文件电禀,修改后應(yīng)該就可以了。
<br /><br />


文章內(nèi)容為個(gè)人理解笤休,如有錯(cuò)誤歡迎指出尖飞。

郵箱:CodingDjz@126.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子政基,更是在濱河造成了極大的恐慌贞铣,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沮明,死亡現(xiàn)場(chǎng)離奇詭異咕娄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)珊擂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)费变,“玉大人摧扇,你說(shuō)我怎么就攤上這事≈科纾” “怎么了扛稽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)滑负。 經(jīng)常有香客問(wèn)我在张,道長(zhǎng),這世上最難降的妖魔是什么矮慕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任帮匾,我火速辦了婚禮,結(jié)果婚禮上痴鳄,老公的妹妹穿的比我還像新娘瘟斜。我一直安慰自己,他們只是感情好痪寻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布螺句。 她就那樣靜靜地躺著,像睡著了一般橡类。 火紅的嫁衣襯著肌膚如雪蛇尚。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天顾画,我揣著相機(jī)與錄音取劫,去河邊找鬼。 笑死亲雪,一個(gè)胖子當(dāng)著我的面吹牛勇凭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播义辕,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼虾标,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起璧函,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤傀蚌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蘸吓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體善炫,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年库继,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了箩艺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宪萄,死狀恐怖艺谆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拜英,我是刑警寧澤静汤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站居凶,受9級(jí)特大地震影響虫给,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侠碧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一抹估、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舆床,春花似錦棋蚌、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至盛垦,卻和暖如春湿弦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腾夯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工颊埃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝶俱。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓班利,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親榨呆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子罗标,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器闯割,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評(píng)論 6 342
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,737評(píng)論 25 707
  • 雪兒少年 一幽在情思涌上了心頭 告訴我 為你吟一首安靜在詩(shī) 圓桌旁笑吟吟的飯食碎語(yǔ) ...
    雪兒少年閱讀 241評(píng)論 0 2
  • 在青春年華堅(jiān)守一個(gè)夢(mèng)想彻消,回首會(huì)被現(xiàn)今不顧一切的自己感動(dòng)得熱淚盈眶,這將是人生中最美好的一段回憶宙拉,每每想到這兩個(gè)字都...
    元寶未醒閱讀 148評(píng)論 0 0