java元婴期(29)----java进阶(springmvc(3)---springmvc和mybatis整合参数绑定(上))
springmvc和mybatis整合
需求
使用springmvc和mybatis完成商品列表查詢。
整合思路
springmvc+mybaits的系統架構:
第一步:整合dao層
???????? mybatis和spring整合,通過spring管理mapper接口。
???????? 使用mapper的掃描器自動掃描mapper接口在spring中進行注冊。
第二步:整合service層
???????? 通過spring管理 service接口。
???????? 使用配置方式將service接口配置在spring配置文件中。
???????? 實現事務控制。
第三步:整合springmvc
???????? 由于springmvc是spring的模塊,不需要整合
準備環境
數據庫環境:mysql5.1
java環境:
jdk1.7.0_72
eclipse indigo
springmvc版本:spring3.2
所需要的jar包:
- 數據庫驅動包:mysql5.1
- mybatis的jar包
- mybatis和spring整合包
- log4j包
- dbcp數據庫連接池包
- spring3.2所有jar包
- jstl包
參考:
工程結構:
整合dao
mybatis和spring進行整合。
sqlMapConfig.xml
mybatis自己的配置文件。???????
applicationContext-dao.xml
配置:
數據源
SqlSessionFactory
mapper掃描器
?
?
逆向工程生成po類及mapper(單表增刪改查)
將生成的文件拷貝至工程中。
手動定義商品查詢mapper
針對綜合查詢mapper,一般情況會有關聯查詢,建議自定義mapper
ItemsMapperCustom.xml
sql語句:
???????? SELECT * FROM items? WHERE items.name LIKE '%筆記本%'
ItemsMapperCustom.java
整合service
在spring容器配置service(applicationContext-service.xml)
創建applicationContext-service.xml,文件中配置service???????
事務控制(applicationContext-transaction.xml)
在applicationContext-transaction.xml中使用spring聲明式事務控制方法。???????
整合springmvc
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的包--><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 配置jsp路徑的前綴 --><property name="prefix" value="/WEB-INF/jsp/"/><!-- 配置jsp路徑的后綴 --><property name="suffix" value=".jsp"/></bean>?
?
配置前端控制器
參考上一節入門程序中web.xml的配置。
編寫Controller???????
編寫jsp
加載spring容器
將mapper、service、controller加載到spring容器中。???????
建議使用通配符加載上邊的配置文件。
在web.xml中,添加spring容器監聽器,加載spring容器。
?
?
?
@RequestMapping(重點)
- url映射
定義controller方法對應的url,進行處理器映射使用。
- 窄化請求映射
- 限制http請求方法
出于安全性考慮,對http的鏈接進行方法限制。
如果限制請求為post方法,進行get請求,報錯:
controller方法的返回值(重點)
- 返回ModelAndView
需要方法結束時,定義ModelAndView,將model和view分別進行設置。
- 返回string
如果controller方法返回string,表示返回邏輯視圖名。
真正視圖(jsp路徑)=前綴+邏輯視圖名+后綴
redirect重定向
商品修改提交后,重定向到商品查詢列表。
redirect重定向特點:瀏覽器地址欄中的url會變化。修改提交的request數據無法傳到重定向的地址。因為重定向后重新進行request(request無法共享)
forward頁面轉發
通過forward進行頁面轉發,瀏覽器地址欄url不變,request可以共享。
- 返回void
在controller方法形參上可以定義request和response,使用request或response指定響應結果:
1、使用request轉向頁面,如下:
request.getRequestDispatcher("頁面路徑").forward(request, response);
2、也可以通過response頁面重定向:
response.sendRedirect("url")
3、也可以通過response指定響應結果,例如響應json數據如下:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");
?
?
參數綁定
spring參數綁定過程
從客戶端請求key/value數據,經過參數綁定,將key/value數據綁定到controller方法的形參上。
springmvc中,接收頁面提交的數據是通過方法形參來接收。而不是在controller類定義成員變更接收!!!!
默認支持的類型
直接在controller方法形參上定義下邊類型的對象,就可以使用這些對象。在參數綁定過程中,如果遇到下邊類型直接進行綁定。
- ???????HttpServletRequest
通過request對象獲取請求信息
- HttpServletResponse
通過response處理響應信息
- HttpSession
通過session對象得到session中存放的對象
- Model/ModelMap
model是一個接口,modelMap是一個接口實現 。
作用:將model數據填充到request域。
簡單類型
通過@RequestParam對簡單類型的參數進行綁定。
如果不使用@RequestParam,要求request傳入參數名稱和controller方法的形參名稱一致,方可綁定成功。
如果使用@RequestParam,不用限制request傳入參數名稱和controller方法的形參名稱一致。
通過required屬性指定參數是否必須要傳入,如果設置為true,沒有傳入參數,報下邊錯誤:
pojo綁定
頁面中input的name和controller的pojo形參中的屬性名稱一致,將頁面中數據綁定到pojo對應的屬性。???????
頁面定義:???????
?
controller的pojo形參的定義:
需要說明的是:簡單類型的參數綁定和pojo參數綁定互不影響。???????
自定義參數綁定實現日期類型綁定
對于controller形參中pojo對象,如果屬性中有日期類型,需要自定義參數綁定。
將請求日期數據串傳成 日期類型,要轉換的日期類型和pojo中日期屬性的類型保持一致。
配置方式
?
springmvc和struts2的區別(補充內容)
1、springmvc基于方法開發的,struts2基于類開發的。
springmvc將url和controller方法映射。映射成功后springmvc生成一個Handler對象,對象中只包括了一個method。
方法執行結束,形參數據銷毀。springmvc的controller開發類似service開發。
?
2、springmvc可以進行單例開發,并且建議使用單例開發,struts2通過類的成員變量接收參數,無法使用單例,只能使用多例。(原因就是第一句)
?
3、經過實際測試,struts2速度慢,在于使用struts標簽,如果使用struts建議使用jstl。
?
post亂碼
在web.xml添加post亂碼filter(servlet篇的知識)
在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編碼???????
總結
以上是生活随笔為你收集整理的java元婴期(29)----java进阶(springmvc(3)---springmvc和mybatis整合参数绑定(上))的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java元婴期(28)----java进
- 下一篇: java元婴期(30)----java进