SpringMvc基礎知識(二) springmvc和mybatis整合
1 springmvc和mybatis整合
1.1 需求
使用springmvc和mybatis完成商品列表查詢。
1.2 整合思路
springmvc+mybaits的系統架構:
第一步:整合dao層
mybatis和spring整合,通過spring管理mapper接口。
使用mapper的掃描器自動掃描mapper接口在spring中進行註冊。
第二步:整合service層
通過spring管理 service接口。
使用配置方式將service接口配置在spring配置文件中。
實現事務控制。
第三步:整合springmvc
由於springmvc是spring
1.3 準備環境
數據庫環境:mysql5.1
ava環境:
jdk1.7.0_72
eclipse indigo
springmvc版本:spring3.2
所需要的jar包:
數據庫驅動包:mysql5.1
mybatis的jar包
mybatis和spring整合包
log4j包
dbcp數據庫連接池包
spring3.2所有jar包
jstl包
工程結構:
1.4 整合dao
mybatis和spring進行整合。
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容器
將mapper、service、controller加載到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,將model和view分別進行設置。
2 返回string
如果controller方法返回string,
a、表示返回邏輯視圖名。
真正視圖(jsp路徑)=前綴+邏輯視圖名+後綴
b、redirect重定向
商品修改提交後,重定向到商品查詢列表。
redirect重定向特點:瀏覽器地址欄中的url會變化。修改提交的request數據無法傳到重定向的地址。因為重定向後重新進行request(request無法共享)
c、forward頁面轉發
通過forward進行頁面轉發,瀏覽器地址欄url不變,request可以共享。
3 返回void
在controller方法形參上可以定義request和response,使用request或response指定響應結果:
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綁定
頁面中input的name和controller的pojo形參中的屬性名稱一致,將頁面中數據綁定到pojo。
頁面定義:
controller的pojo形參的定義:
5.5 自定義參數綁定實現日期類型綁定
對於controller形參中pojo對象,如果屬性中有日期類型,需要自定義參數綁定。
將請求日期數據串傳成 日期類型,要轉換的日期類型和pojo中日期屬性的類型保持一致。
所以自定義參數綁定將日期串轉成java.util.Date類型。
需要向處理器適配器中註入自定義的參數綁定組件。
5.5.1 自定義日期類型綁定
5.5.2 配置方式
6 springmvc和struts2的區別
1、springmvc基於方法開發的,struts2基於類開發的。
springmvc將url和controller方法映射。映射成功後springmvc生成一個Handler對象,對象中只包括了一個method。
方法執行結束,形參數據銷毀。
springmvc的controller開發類似service開發。
2、springmvc可以進行單例開發,並且建議使用單例開發,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-1是tomcat默認編碼,需要將tomcat編碼後的內容按utf-8編碼
SpringMvc基礎知識(二) springmvc和mybatis整合