1. 程式人生 > >SpringMvc基礎知識(二) springmvc和mybatis整合

SpringMvc基礎知識(二) springmvc和mybatis整合

internal 前端控制器 客戶 報錯 tca json轉換 註入 配置 iso

1 springmvcmybatis整合

1.1 需求

使用springmvcmybatis完成商品列表查詢。

1.2 整合思路

springmvc+mybaits的系統架構:

技術分享

第一步:整合dao

mybatisspring整合,通過spring管理mapper接口。

使用mapper的掃描器自動掃描mapper接口在spring中進行註冊。

第二步:整合service

通過spring管理 service接口。

使用配置方式將service接口配置在spring配置文件中。

實現事務控制。

第三步:整合springmvc

由於springmvcspring

的模塊,不需要整合。

1.3 準備環境

數據庫環境:mysql5.1

ava環境:

jdk1.7.0_72

eclipse indigo

springmvc版本:spring3.2

所需要的jar包:

數據庫驅動包:mysql5.1

mybatisjar

mybatisspring整合包

log4j

dbcp數據庫連接池包

spring3.2所有jar

jstl

工程結構:

技術分享

1.4 整合dao

mybatisspring進行整合。

1.4.1 sqlMapConfig.xml

mybatis自己的配置文件。

技術分享

1.4.2 applicationContext-dao.xml

配置:

數據源

SqlSessionFactory

mapper掃描器

技術分享

1.4.3 逆向工程生成po類及mapper(單表增刪改查)

技術分享

將生成的文件拷貝至工程 中。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <context id="testTables" targetRuntime="MyBatis3">
        <commentGenerator>
            <!-- 是否去除自動生成的註釋 true
:是 : false:否 --> <property name="suppressAllComments" value="true" /> </commentGenerator> <!--數據庫連接的信息:驅動類、連接地址、用戶名、密碼 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root" password="root"> </jdbcConnection> <!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver" connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg" userId="yycg" password="yycg"> </jdbcConnection> --> <!-- 默認false,把JDBC DECIMAL 和 NUMERIC 類型解析為 Integer,為 true時把JDBC DECIMAL 和 NUMERIC 類型解析為java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- targetProject:生成PO類的位置 --> <javaModelGenerator targetPackage="cn.itcast.ssm.po" targetProject=".\src"> <!-- enableSubPackages:是否讓schema作為包的後綴 --> <property name="enableSubPackages" value="false" /> <!-- 從數據庫返回的值被清理前後的空格 --> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- targetProject:mapper映射文件生成的位置 --> <sqlMapGenerator targetPackage="cn.itcast.ssm.mapper" targetProject=".\src"> <!-- enableSubPackages:是否讓schema作為包的後綴 --> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- targetPackage:mapper接口生成的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="cn.itcast.ssm.mapper" targetProject=".\src"> <!-- enableSubPackages:是否讓schema作為包的後綴 --> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!-- 指定數據庫表 --> <table tableName="items"></table> <table tableName="orders"></table> <table tableName="orderdetail"></table> <table tableName="user"></table> </context> </generatorConfiguration>

1.4.4 手動定義商品查詢mapper

針對綜合查詢mapper,一般情況會有關聯查詢,建議自定義mapper

1.4.4.1 ItemsMapperCustom.xml

sql語句:

SELECT * FROM items WHERE items.name LIKE ‘%筆記本%‘

技術分享

1.4.4.2 ItemsMapperCustom.java

技術分享

1.5 整合service

spring管理service接口。

1.5.1 定義service接口

技術分享

技術分享

1.5.2 spring容器配置service(applicationContext-service.xml)

創建applicationContext-service.xml,文件中配置service

技術分享

1.5.3 事務控制(applicationContext-transaction.xml)

applicationContext-transaction.xml中使用spring聲明式事務控制方法。

技術分享

1.6 整合springmvc

1.6.1 springmvc.xml

創建springmvc.xml文件,配置處理器映射器、適配器、視圖解析器。

<!-- 可以掃描controller、service、...
    這裏讓掃描controller,指定controller的包
     -->
    <context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>
    
        
    <!--註解映射器 -->
    <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> -->
    <!--註解適配器 -->
    <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> -->
    
    <!-- 使用 mvc:annotation-driven代替上邊註解映射器和註解適配器配置
    mvc:annotation-driven默認加載很多的參數綁定方法,
    比如json轉換解析器就默認加載了,如果使用mvc:annotation-driven不用配置上邊的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
    實際開發時使用mvc:annotation-driven
     -->
    <mvc:annotation-driven></mvc:annotation-driven>
    

    <!-- 視圖解析器
    解析jsp解析,默認使用jstl標簽,classpath下的得有jstl的包
     -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 配置jsp路徑的前綴 -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!-- 配置jsp路徑的後綴 -->
        <property name="suffix" value=".jsp"/>
    </bean>

1.6.2 配置前端控制器

在web.xml中配置前端控制器。

技術分享

1.6.3 編寫Controller(就是Handler)

技術分享

1.6.4 編寫jsp

技術分享

1.7 加載spring容器

mapperservicecontroller加載到spring容器中。

技術分享

建議使用通配符加載上邊的配置文件。

web.xml中,添加spring容器監聽器,加載spring容器。

技術分享

2 商品修改功能開發

2.1 需求

操作流程:

1、進入商品查詢列表頁面

2、點擊修改,進入商品修改頁面,頁面中顯示了要修改的商品(從數據庫查詢)

要修改的商品從數據庫查詢,根據商品id(主鍵)查詢商品信息

3、在商品修改頁面,修改商品信息,修改後,點擊提交

2.2 開發mapper

mapper

根據id查詢商品信息

根據id更新Items表的數據

不用開發了,使用逆向工程生成的代碼。

2.3 開發service

接口功能:

根據id查詢商品信息

修改商品信息

技術分享

2.4 開發controller

方法:

商品信息修改頁面顯示

商品信息修改提交

3 @RequestMapping

1 url映射

定義controller方法對應的url,進行處理器映射使用。

2 窄化請求映射

技術分享

3限制http請求方法

出於安全性考慮,對http的鏈接進行方法限制。

如果限制請求為post方法,進行get請求,報錯:

技術分享

技術分享

4 controller方法的返回值

1返回ModelAndView

需要方法結束時,定義ModelAndView,將modelview分別進行設置。

2 返回string

如果controller方法返回string

a、表示返回邏輯視圖名。

真正視圖(jsp路徑)=前綴+邏輯視圖名+後綴

技術分享

bredirect重定向

商品修改提交後,重定向到商品查詢列表。

redirect重定向特點:瀏覽器地址欄中的url會變化。修改提交的request數據無法傳到重定向的地址。因為重定向後重新進行requestrequest無法共享)

技術分享

cforward頁面轉發

通過forward進行頁面轉發,瀏覽器地址欄url不變,request可以共享。

技術分享

3 返回void

controller方法形參上可以定義requestresponse,使用requestresponse指定響應結果:

a、使用request轉向頁面,如下:

request.getRequestDispatcher("頁面路徑").forward(request, response);

b、也可以通過response頁面重定向:

response.sendRedirect("url")

c、也可以通過response指定響應結果,例如響應json數據如下:

response.setCharacterEncoding("utf-8");

response.setContentType("application/json;charset=utf-8");

response.getWriter().write("json串");

5 參數綁定

5.1 spring參數綁定過程

從客戶端請求key/value數據,經過參數綁定,將key/value數據綁定到controller方法的形參上。

springmvc中,接收頁面提交的數據是通過方法形參來接收。而不是在controller類定義成員變更接收!!!!

技術分享

5.2 默認支持的類型

直接在controller方法形參上定義下邊類型的對象,就可以使用這些對象。在參數綁定過程中,如果遇到下邊類型直接進行綁定。

1.2.1.1 HttpServletRequest

通過request對象獲取請求信息

1.2.1.2 HttpServletResponse

通過response處理響應信息

1.2.1.3 HttpSession

通過session對象得到session中存放的對象

1.2.1.4 Model/ModelMap

model是一個接口,modelMap是一個接口實現 。

作用:將model數據填充到request域。

5.3 簡單類型

整型 單精度雙精度 布爾型 字符串

通過@RequestParam對簡單類型的參數進行綁定。

如果不使用@RequestParam,要求request傳入參數名稱和controller方法的形參名稱一致,方可綁定成功。

如果使用@RequestParam,不用限制request傳入參數名稱和controller方法的形參名稱一致。

通過required屬性指定參數是否必須要傳入,如果設置為true,沒有傳入參數,報下邊錯誤:

技術分享

技術分享

5.4 pojo綁定

頁面中inputnamecontrollerpojo形參中的屬性名稱一致,將頁面中數據綁定到pojo

頁面定義:

技術分享

controllerpojo形參的定義:

技術分享

5.5 自定義參數綁定實現日期類型綁定

對於controller形參中pojo對象,如果屬性中有日期類型,需要自定義參數綁定。

將請求日期數據串傳成 日期類型,要轉換的日期類型和pojo中日期屬性的類型保持一致。

技術分享

所以自定義參數綁定將日期串轉成java.util.Date類型。

需要向處理器適配器中註入自定義的參數綁定組件。

5.5.1 自定義日期類型綁定

技術分享

5.5.2 配置方式

技術分享

技術分享

6 springmvcstruts2的區別

1springmvc基於方法開發的,struts2基於類開發的。

springmvcurlcontroller方法映射。映射成功後springmvc生成一個Handler對象,對象中只包括了一個method

方法執行結束,形參數據銷毀。

springmvccontroller開發類似service開發。

2springmvc可以進行單例開發,並且建議使用單例開發,struts2通過類的成員變量接收參數,無法使用單例,只能使用多例。

3、經過實際測試,struts2速度慢,在於使用struts標簽,如果使用struts建議使用jstl

7 問題

7.1 post亂碼

web.xml添加post亂碼filter

web.xml中加入:

<filter>
<filter-name>CharacterEncodingFilter</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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

以上可以解決post請求亂碼問題。

對於get請求中文參數出現亂碼解決方法有兩個:

修改tomcat配置文件添加編碼與工程編碼一致,如下:

<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

另外一種方法對參數進行重新編碼:

String userName new

String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

ISO8859-1tomcat默認編碼,需要將tomcat編碼後的內容按utf-8編碼

SpringMvc基礎知識(二) springmvc和mybatis整合