辭職待業青年就是有不少時間來寫博客,之前在傳統行業技術強度相對不大,不處理大數據,也不弄高併發的,因此學不到什麼高端編程技術和架構方法,那麼我本身就琢磨搞一個SSH架構的東西出來,但願能夠幫助到一些朋友,也但願大拿給出相應的指導意見。前端
先從用了什麼東西提及吧 SSHM=SpringMVC+Spring+Hibernate+Mybatis,至於爲何要這麼搞,我先簡要的說下。java
SpringMVC 我最初的想法就是,它比struts2小,屬於輕量級的MVC框架,並且和spring能夠完美結合在一塊兒。jquery
Spring 額 不須要我廢話了。程序員
hibernate 主要用來請求數據庫事物方面的應用,主要執行DML語句,不過用的比較挫,不太會,但願多指點。web
Mybatis 主要用來查詢,由於查詢這個東西 我仍是喜歡用SQL來查詢。ajax
spring版本3.1.2,hibernate3,mybatis3.1.1 版本仍是比較新的。其餘的一些技術也包含進去了好比說poi,jdom,jackson等,就不一一介紹了。spring
這裏插一段,在spring選擇版本初期,我是用的3.0.5這個版本,jackson 用的是一個比較低的版本,這兩個東西怎樣都不兼容,頭疼!在實驗了多個版本後,發現了jackson 這玩意向下不兼容,我去,有意思,最後肯定了spring3.1.2往上與jackson2.1左右的版本才兼容,好吧,就當學習了。數據庫
先看下基礎web.xml配置吧express
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- spring 過濾器統一設置編碼 --> <filter> <filter-name>Spring character encoding filter</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> <filter-mapping> <filter-name>Spring character encoding filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 指定Spring Bean的配置文件所在目錄。默認配置在WEB-INF目錄下 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/applicationContext*.xml</param-value> </context-param> <!-- Web 項目 Spring 加載 Log4j 的監聽 --> <listener> <listener-class> org.springframework.web.util.Log4jConfigListener </listener-class> </listener> <!-- spring 應用上下文監聽器 主要初始化注入 --> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <!-- Servlet模塊同時會加載{servletname}-servlet.xml文件 SpringMVC前值控制模式基礎selvlet --> <servlet> <servlet-name>newframe</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>newframe</servlet-name> <url-pattern>*.do</url-pattern><!-- 是攔截以.do結尾的請求,可自定義 --> </servlet-mapping> <!-- 若是不定義webAppRootKey參數,那麼webAppRootKey就是缺省的"webapp.root"。 但最好設置,以避免項目之間的名稱衝突。 定義之後,在Web Container啓動時將把ROOT的絕對路徑寫到系統變量裏。 而後log4j的配置文件裏就能夠用${ myapp.root }來表示Web目錄的絕對路徑,把log文件存放於webapp中。 此參數用於後面的「Log4jConfigListener」 --> <context-param> <param-name>webAppRootKey</param-name> <param-value>myapp.root</param-value> </context-param> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:log4j.properties</param-value> </context-param> <session-config> <session-timeout>15</session-timeout> </session-config> </web-app>
每一個標籤是否是都寫明白了呢?apache
那麼咱們從springMVC先開始介紹吧,我這裏只講我怎樣搭建這個MVC的過程 至於SpringMVC的原理,我不想作過多的介紹,由於這不是本文的重點,而且也不是一句兩句話能說明白的,我看到有些文章 幾百字+幾張圖片就說這事springMVC的基本原理,我曾經略讀過一些springMVC的源碼,裏面的複雜程度也不是簡單的幾句話能描述的清楚的,因此不作介紹,等小弟我真吃透了,在寫出來吧,有關資料能夠參考spring官網對springMVC的介紹,不是很詳細,可是也能明白個大概。
不閒扯了,先看springMVC配置文件,位置:WEN-INF文件夾下,命名方式:以web.xml文件中DispatcherServlet的serlvletname-servlet.xml爲公式命名,也可自定義文件名,在DispatcherServlet節點下加以下配置:
<init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/applicationContext-mvc.xml</param-value> </init-param>
MVC配置文件的內容以下:
<?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:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 對web包中的全部類進行掃描,以完成Bean建立和自動依賴注入的功能 --> <mvc:annotation-driven></mvc:annotation-driven>
<!-- 先掃描controller 後service --> <context:component-scan base-package="com.tansun.newframe.*"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan> <!-- 使註解生效 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter" /> <bean class = "org.springframework.http.converter.StringHttpMessageConverter"> <property name = "supportedMediaTypes"> <list> <bean class="org.springframework.http.MediaType"> <constructor-arg index="0" value="text"/> <constructor-arg index="1" value="plain"/> <constructor-arg index="2" value="UTF-8"/> </bean> <bean class="org.springframework.http.MediaType"> <constructor-arg index="0" value="*"/> <constructor-arg index="1" value="*"/> <constructor-arg index="2" value="UTF-8"/> </bean> </list> </property> </bean> </list> </property> </bean> <!-- springmvc的配置文件,它的命名規則:web.xml裏springmvc模塊的名稱+「-servlet.xml」 對模型視圖名稱的解析,即在模型視圖名稱添加先後綴 例如:Controller裏返回一個名爲test的邏輯視圖名稱,根據配置文件, 它最終找到的文件是/panges/test.jsp,即把先後綴拼裝爲一個路徑。 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"></property> <property name="suffix" value=".jsp"></property> </bean> <!-- jaskson 用於先後臺以json形式的數據交換,設置編碼集爲utf-8編碼--> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> </list> </property> </bean> <!-- SpringMVC 異常處理機制 --> <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="java.lang.Exception">common/error</prop> <prop key="java.lang.Throwable">common/error</prop> </props> </property> <property name="statusCodes"> <props> <prop key="errors/500">500</prop> <prop key="errors/404">404</prop> </props> </property> <!-- 設置日誌輸出級別,不定義則默認不輸出警告等錯誤日誌信息 --> <property name="warnLogCategory" value="WARN"></property> <!-- 默認錯誤頁面,當找不到上面mappings中指定的異常對應視圖時,使用本默認配置 --> <property name="defaultErrorView" value="../error"></property> <!-- 默認HTTP狀態碼 --> <property name="defaultStatusCode" value="500"></property> </bean> </beans>
基於以上配置,springMVC的基礎配置應該算是完成了,簡單寫一個控制器。
@Controller 註解爲此類爲controller
@RequestMapping 註解類前,能夠理解爲請求URL的一個前置命名,在方法前能夠理解爲請求的後置命名,一下代碼的請求就是/newframe/test/getAllDemo.do
@Resource就不須要過多說明了吧,用過spring的人都知道是幹啥的。
@Controller @RequestMapping(value="/test") public class DemoControl { @Resource(name="demoService") public DemoService cDemoService; @RequestMapping(value="/getAllDemo.do",method=RequestMethod.GET) public ModelAndView getAllDemo(){ ModelAndView tReturn = new ModelAndView("test/test_list"); List<Demo> mDemos =cDemoService.getAllDemo(); tReturn.addObject("demos", mDemos); return tReturn; } }
注意,返回值爲一個ModelAndView對象,構造方法中傳入的「test/test_list」是一個JSP的路徑,在MVC的配置文件中已經簡單介紹過InternalResourceViewResolver這個就是他的應用,他表示執行完畢這個方法後轉發(注意是轉發)到/newframe/test/test_list.jsp,其中addObject方法設置一對鍵值,將這對鍵值設置到HttpRequest中(注意是request中)。若是直接返回"test/test_list"則InternalResourceViewResolver將字符串解析爲jsp路徑也返回 到/newframe/test/test_list.jsp中。那麼怎樣在這個方法中拿到request或者是response?其實我我的是不建議這麼作的,由於若是使用request或者是response就又變成了J2EE編程了,失去了使用開源框架的意義,可是也有辦法
public ModelAndView getAllDemo(HttpRequest request,HttpResponse resopnse)
這樣就能夠操做response,request了!
那麼spring是如何與jackson相互配合使用的呢?
jackson是一個開源的 能夠將JAVA實體對象轉換爲JSON形式的數據格式的各類技術,他不須要你寫任何代碼(固然你也能夠寫,可是比較麻煩,若是是想要本身用編程的方式來解決我建議能夠用apache 的JSONArray,或者是Google的Gson兩種技術),只須要你配置到你的springMVC配置文件中,他能夠將springMVC與前臺的Javascript完美結合在一塊兒,前臺能夠用jquery 來解析返回的json數據格式。具體配置方法上面已經給出,下面來介紹下controller中是如何應用的。
@RequestMapping(value = "/getUsers.do", method = RequestMethod.POST) @ResponseBody public Map<String, Object> getUsers(UserInfo userInfo, @RequestParam String page, @RequestParam String rows) throws Exception { // 得到總條數 int totalNum = cUserInfoService.getUserCount(); // 得到查詢到的用戶 List<UserInfoVo> userList = cUserInfoService.getUsers(userInfo, page, rows); Map<String, Object> mMap = new HashMap<String, Object>(); mMap.put("rows", userList); mMap.put("total", totalNum); return mMap; }
這裏介紹一個註解@ResponseBody 他的做用是返回值JAVA對象(Obejct)將以響應體返回到前臺頁面中,這裏其實沒有response什麼大事別理解錯了。
方法很簡單 將查詢到的用戶的List對象,和總條數返回到頁面中,將其封裝在一個map中了,哎,就這麼簡單,這個Map在前臺就以Json格式解析了。具體怎樣解析,那都是前端程序員的事情了,固然了,沒前端你就本身解析吧,很簡單的。
有些人就問了,你這個真是太麻煩了 若是我就返回兩個信息,難道也要封裝到Object中嗎?例如我返回給前臺就{["result","1"],["msg","失敗!"]},難道我還須要封裝到一個對象中?其實編程是很靈活的,Spring的大牛們固然也考慮的這個問題。請參考一下方法!
/** * 用戶刪除方法 * * @param id * @return * @throws Exception */ @RequestMapping(value = "/userDelete.do", method = RequestMethod.POST) @ResponseBody public String userDelete(String ids) throws Exception { String mReturn = null; String mMsg = null; try { cUserInfoService.userInfoDelete(ids); mMsg = CodeTransferUtil.transferCode(DataConst.Del_Success); mReturn = JsonUtil.getJsonString(true, mMsg); } catch (SysContlException sException) { // 記錄日誌 LogUtil.info(sException); // 編碼轉換 mMsg = CodeTransferUtil.transferCode(sException.getMessage()); // 處理 mReturn = JsonUtil.getJsonString(false, mMsg); } catch (DaoException dException) { // 記錄日誌 LogUtil.info(dException); // 編碼轉換 mMsg = CodeTransferUtil.transferCode(dException.getMessage()); // 處理 mReturn = JsonUtil.getJsonString(false, mMsg); } catch (Exception e) { LogUtil.error(e); throw e; } return mReturn; }
這段代碼就返回了一個Json格式的字符串,那麼@ResponseBody註解就將其返回一個字符串,具體spring內部是用StringHttpMessageConverter而非Jackson的
MappingJacksonHttpMessageConverter了,這樣字符串就會轉換爲Json格式的數據返回給前臺了。簡單的String,複雜的Object都有了明確的解決辦法,這樣就不會有問題了,這樣的應用基本上都是應用在與前臺ajax技術相結合上。
這樣MVC部分就介紹完畢了,若是有任何問題歡迎留言,互相學習互相進步纔是寫博客的關鍵,但願踊躍噴我~