SpringMVC,Spring,Hibernate,Mybatis架構開發搭建之SpringMVC部分

辭職待業青年就是有不少時間來寫博客,之前在傳統行業技術強度相對不大,不處理大數據,也不弄高併發的,因此學不到什麼高端編程技術和架構方法,那麼我本身就琢磨搞一個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部分就介紹完畢了,若是有任何問題歡迎留言,互相學習互相進步纔是寫博客的關鍵,但願踊躍噴我~

相關文章
相關標籤/搜索