Spring MVC
Spring MVC簡介
Spring web mvc和Struts2都屬於表現層的框架,它是Spring框架的一部分。Spring Web MVC是一種基於Java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架,即使用了MVC架構模式的思想,將web層進行職責解耦,基於請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發,Spring MVC大大簡化了我們日常Web開發。
Struts2和SpringMVC對比
1、springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過濾器。
2、springmvc是基於方法開發(一個url對應一個方法),請求參數傳遞到方法的形參,可以設計爲單例或多例(建議單例),struts2是基於類開發,傳遞參數是通過類的屬性,只能設計爲多例。
3、Struts採用值棧存儲請求和響應的數據,通過OGNL存取數據, springmvc通過參數解析器是將request請求內容解析,並給方法形參賦值,將數據和視圖封裝成ModelAndView對象,最後又將ModelAndView中的模型數據通過request域傳輸到頁面。Jsp視圖解析器默認使用jstl。
優點
√讓我們能非常簡單的設計出乾淨的Web層和薄薄的Web層;
√進行更簡潔的Web層的開發;
√天生與Spring框架集成(如IoC容器、AOP等);
√提供強大的約定大於配置的契約式編程支持;
√能簡單的進行Web層的單元測試;
√支持靈活的URL到頁面控制器的映射;
√非常容易與其他視圖技術集成,如Velocity、FreeMarker等等,因爲模型數據不放在特定的API裏,而是放在一個Model裏(Map數據結構實現,因此很容易被其他框架使用);
√非常靈活的數據驗證、格式化和數據綁定機制,能使用任何對象進行數據綁定,不必實現特定框架的API;
√提供一套強大的JSP標籤庫,簡化JSP開發;
√支持靈活的本地化、主題等解析;
√更加簡單的異常處理;
√對靜態資源的支持;
√支持Restful風格。
Spring MVC架構
1、 用戶發送請求至前端控制器DispatcherServlet,前端控制器收到請求後自己不進行處理,而是調用處理器映射器。
2、 DispatcherServlet收到請求後調用HandlerMapping處理器映射器。HandlerMapping將會把請求映射爲HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器)對象。
3、 處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。
4、 DispatcherServlet通過HandlerAdapter處理器適配器調用處理器
5、 執行處理器(Controller,也叫後端控制器)。返回執行結果,封裝在ModelAndView中
6、 DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器, ViewResolver將把邏輯視圖名解析爲具體的View,通過這種策略模式,很容易更換其他視圖技術;
7、 ViewReslover解析後返回具體View
8、 DispatcherServlet對View進行渲染視圖(即將對象模型的數據填充至視圖中)。此處的Model實際是一個Map數據結構,因此很容易支持其他視圖技術;
9、 DispatcherServlet將結果響應給用戶
Spring MVC入門
通過前面的流程分析,我們可以看出具體的核心開發步驟,具體的開發就圍繞以下幾點:
1、 DispatcherServlet在web.xml中的部署描述,從而攔截請求到Spring Web MVC
2、 HandlerMapping的配置,從而將請求映射到處理器
3、 HandlerAdapter的配置,從而支持多種類型的處理器
4、 ViewResolver的配置,從而將邏輯視圖名解析爲具體視圖技術
5、 處理器(頁面控制器)的配置,從而進行功能處理
1.創建Web項目,導入Spring核心包和Spring-web-mvc.jar,還有依賴包commons-logging.jar
2.在web.xml中配置前端控制器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>SringMVCDemo</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!--配置前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--指定配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--攔截所有action請求-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
自此請求已交給Spring Web MVC框架處理,因此我們需要配置Spring的配置文件,默認DispatcherServlet會加載WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml配置文件。但也可以直接通過<init-param>來指定配置文件
3.配置springmvc配置文件
<?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:p="http://www.springframework.org/schema/p"
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-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 配置映射器,表示將請求的URL和Bean名字映射,如URL爲 “/hello”,則Spring配置文件必須有一個名字爲“/hello”的Bean -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 配置適配器,表示所有實現了org.springframework.web.servlet.mvc.Controller接口的Bean可以作爲Spring Web MVC中的處理器。如果需要其他類型的處理器可以通過實現HadlerAdapter來解決 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--配置視圖解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--prefix和suffix:查找視圖頁面的前綴和後綴,比如傳進來的邏輯視圖名爲hello,則該該jsp視圖頁面應該存放在“WEB-INF/hello.jsp”-->
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
4.實現控制器
//處理器必須實現Controller接口
public class UserController implements Controller {
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
ModelAndView mv = new ModelAndView();
//添加模型數據 可以是任意的POJO對象
mv.addObject("message", "Hello World!");
//設置邏輯視圖名,視圖解析器會根據該名字解析到具體的視圖頁面
mv.setViewName("user");
return mv;
}
}
5.將處理器添加到springmvc配置文件中
<bean name="/user" class="com.cad.controller.UserController"></bean>
6.編寫user.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--${message}:表示顯示由HelloWorldController處理器傳過來的模型數據。-->
${message}
</body>
</html>
7.進行訪問 http://localhost:8080/SringMVCDemo/user
入門案例做完了,對SpringMVC的流程有了瞭解,現在來詳細介紹。
DispatcherServlet詳解
DispatcherServlet是前端控制器設計模式的實現,提供Spring Web MVC的集中訪問點,主要負責職責的分派。
配置
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--指定配置文件的位置,默認“/WEB-INF/[servlet名字]-servlet.xml”。-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
DispatcherServlet的默認配置在DispatcherServlet.properties(和DispatcherServlet類在一個包下)中,而且是當Spring配置文件中沒有指定配置時使用的默認策略。
DispatcherServlet在啓動時會自動註冊這些默認的Bean,無需我們註冊,如果我們註冊了,默認的將不會註冊。因此我們入門案例中的BeanNameUrlHandlerMapping、SimpleControllerHandlerAdapter是不需要我們手動註冊的,DispatcherServlet默認會註冊這兩個Bean。裏面還有一些其他的默認Bean,我們可以自行去了解。
接下來我們瞭解一下Spring MVC需要的那些組件。
Controller
Controller控制器,其實現在大多數公司已經不推薦使用實現Controller接口的方法來實現Controller,基本都使用註解。但難免還會有一些比較老的系統使用,所以我們大概瞭解一下。
//控制器接口
public interface Controller {
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
控制器接口,只有一個方法handleRequest,用於進行請求的功能處理,處理完請求後返回ModelAndView。Spring 提供了很多Controller接口的實現
這些類接口的詳解,可以參考開濤講解的SpringMVC,講的非常詳細。這裏附上鍊接,就不再細講。
http://jinnianshilongnian.iteye.com/blog/1752171
SpringMVC註解式開發
Spring2.5之前,我們都是通過實現Controller接口或其實現來定義我們的處理器類。Spring2.5引入註解式處理器支持,通過@Controller 和 @RequestMapping註解定義我們的處理器類。並且提供了一組強大的註解。
Spring2.5需要通過處理器映射DefaultAnnotationHandlerMapping和處理器適配器AnnotationMethodHandlerAdapter來開啓支持@Controller 和@RequestMapping註解的處理器。一般不用指定,因爲默認的有。
@Controller:用於標識是處理器類;
@RequestMapping:請求到處理器功能方法的映射規則;
@RequestParam:請求參數到處理器功能處理方法的方法參數上的綁定;
@ModelAttribute:請求參數到命令對象的綁定;
@SessionAttributes:用於聲明session級別存儲的屬性,放置在處理器類上,通常列出
模型屬性(如@ModelAttribute)對應的名稱,則這些屬性會透明的保存到session中;
@InitBinder:自定義數據綁定註冊支持,用於將請求參數轉換到命令對象屬性的對應類型;
Spring3.1引入新的@Contoller和@RequestMapping註解支持類:處理器映射RequestMappingHandlerMapping和處理器適配器RequestMappingHandlerAdapter組合來代替Spring2.5開始的處理器映射DefaultAnnotationHandlerMapping和處理器適配器AnnotationMethodHandlerAdapter。Spring3.0支持RESTful風格,且又引入了更多註解支持
@CookieValue:cookie數據到處理器功能處理方法的方法參數上的綁定;
@RequestHeader:請求頭(header)數據到處理器功能處理方法的方法參數上的綁定;
@RequestBody:請求的body體的綁定(通過HttpMessageConverter進行類型轉換);
@ResponseBody:處理器功能處理方法的返回值作爲響應體(通過HttpMessageConverter進行類型轉換);
@ResponseStatus:定義處理器功能處理方法/異常處理器返回的狀態碼和原因;
@ExceptionHandler:註解式聲明異常處理器;
@PathVariable:請求URI中的模板變量部分到處理器功能處理方法的方法參數上的綁定,
從而支持RESTful架構風格的URI;
SpringMVC註解式開發入門案例
1.配置springmvc配置文件
<?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:p="http://www.springframework.org/schema/p"
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-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!--Spring3.1開始的註解 ,映射器和適配器 直接配置處理器映射器和處理器適配器比較麻煩,可以使用註解驅動來加載。SpringMVC使用<mvc:annotation-driven>自動加載RequestMappingHandlerMappingRequestMappingHandlerAdapter-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
<!--視圖解析器的配置-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--只需要將處理器實現類註冊到spring配置文件即可,RequestMappingHandlerMapping會自動發現帶註解的該類-->
<bean class="com.cad.controller.UserController"></bean>
</beans>
2.編寫處理類
@Controller
public class UserController {
//RequestMapping("hello") 代理該方法的路徑
@RequestMapping("/hello")
public ModelAndView hello() {
ModelAndView mv = new ModelAndView();
//添加模型數據 可以是任意的POJO對象
mv.addObject("message", "Hello World!");
//設置邏輯視圖名,視圖解析器會根據該名字解析到具體的視圖頁面
mv.setViewName("user");
return mv;
}
}
SpringMVC註解式開發詳解
請求映射
我們的http請求信息一般包含六部分信息:
①請求方法,如GET或POST,表示提交的方式;
②URL,請求的地址信息;
③協議及版本;
④請求頭信息(包括Cookie信息);
⑤回車換行(CRLF),頭信息和請求體之間有空行;
⑥請求內容區(即請求的內容或數據),如表單提交時的參數數據、URL請求參數(?abc=123 ?後邊的)等。
我們可以看到有①、②、④、⑥一般是可變的,因此可以根據這四個可變的來映射到指定的方法
URL路徑映射:使用URL映射請求到處理器的功能處理方法;
請求方法映射限定:如限定功能處理方法只處理GET請求;
請求參數映射限定:如限定只處理包含“abc”請求參數的請求;
請求頭映射限定:如限定只處理“Accept=application/json”的請求
URL映射
@RequestMapping(value={“/test1”, “/user/create”}):多個URL路徑可以映射到同一個處理器的功能處理方法。
@RequestMapping(value=”/users/**”):可以匹配“/users/abc/abc”
@RequestMapping(value=”/product?”):可匹配“/product1”或“/producta”
@RequestMapping(value=”/product*”):可匹配“/productabc”或“/product”
SpringMVC還提供了正則表達式風格,模板風格的URL映射,功能非常強大。
請求方法映射限定
@RequestMapping(value=”/hello”,method=RequestMethod.POST):指定此方法只能被post請求訪問。
請求參數數據映射限定
@RequestMapping(params=”create”, method=RequestMethod.GET) :表示請求中有“create”的參數名且請求方法爲“GET”即可匹配,如可匹配的請求URL“http://×××/parameter1?create”;
@RequestMapping(params=”!create”, method=RequestMethod.GET):表示請求中沒有“create”參數名且請求方法爲“GET”即可匹配,如可匹配的請求URL“http://×××/parameter1?abc”
@RequestMapping(params=”submitFlag=create”, method=RequestMethod.GET):表示請求中有“submitFlag=create”請求參數且請求方法爲“GET”即可匹配,如請求URL爲http://×××/parameter2?submitFlag=create;
請求頭數據映射限定
@RequestMapping(value=”/header/test1”, headers = “Accept”):表示請求的URL必須爲“/header/test1”,且 請求頭中必須有Accept參數才能匹配。
@RequestMapping(value=”/header/test3”, headers = “Content-Type=application/json”):表示請求的URL必須爲“/header/test3” 且 請求頭中必須有“Content-Type=application/json”參數即可匹配。;
SpringMVC強大的參數綁定
SpringMVC爲我們提供了很多默認支持的參數類型,只要我們在處理器方法的形參中添加這些參數類型,Spring MVC會自動爲這些參數賦值,我們來看一下都有哪些。
ServletRequest/HttpServletRequest 和 ServletResponse/HttpServletResponse
InputStream/OutputStream 和 Reader/Writer :requestBodyIn:獲取請求的內容區字節流,等價於request.getInputStream();responseBodyOut:獲取相應的內容區字節流,等價於response.getOutputStream()。
WebRequest/NativeWebRequest:WebRequest是Spring Web MVC提供的統一請求訪問接口,不僅僅可以訪問請求相關數據(如參數區數據、請求頭數據,但訪問不到Cookie區數據),還可以訪問會話和上下文中的數據;NativeWebRequest繼承了WebRequest,並提供訪問本地Servlet API的方法。
HttpSession
Model、Map、ModelMap:Spring Web MVC 提供Model、Map或ModelMap讓我們能去暴露渲染視圖需要的模型數據。除了ModelAndView以外,還可以使用Model來向頁面傳遞數據,Model是一個接口,在參數裏直接聲明model即可。如果使用Model則可以不使用ModelAndView對象,Model對象可以向頁面傳遞數據,View對象則可以使用String返回值替代。
Model
@RequestMapping("/itemEdit")
public String queryItemById(HttpServletRequest request, Model model) {
// 從request中獲取請求參數
String strId = request.getParameter("id");
Integer id = Integer.valueOf(strId);
// 根據id查詢商品數據
Item item = this.itemService.queryItemById(id);
// 把結果傳遞給頁面
// ModelAndView modelAndView = new ModelAndView();
// 把商品數據放在模型中
// modelAndView.addObject("item", item);
// 設置邏輯視圖
// modelAndView.setViewName("itemEdit");
// 把商品數據放在模型中
model.addAttribute("item", item);
return "itemEdit";
}
ModelMap
ModelMap是Model接口的實現類,也可以通過ModelMap向頁面傳遞數據。
使用Model和ModelMap的效果一樣,如果直接使用Model,springmvc會實例化ModelMap
@RequestMapping("/itemEdit")
public String queryItemById(HttpServletRequest request, ModelMap model) {
// 從request中獲取請求參數
String strId = request.getParameter("id");
Integer id = Integer.valueOf(strId);
// 根據id查詢商品數據
Item item = this.itemService.queryItemById(id);
// 把結果傳遞給頁面
// ModelAndView modelAndView = new ModelAndView();
// 把商品數據放在模型中
// modelAndView.addObject("item", item);
// 設置邏輯視圖
// modelAndView.setViewName("itemEdit");
// 把商品數據放在模型中
model.addAttribute("item", item);
return "itemEdit";
}
- Errors/BindingResult:錯誤對象。數據驗證時使用。
綁定簡單類型參數
1.不使用註解情況下,如果參數名稱和jsp頁面中的表單項的name一樣,那麼可以直接接收參數。
例如:前端有一參數name爲id,直接就可以獲取到
@Controller
public class UserController {
@RequestMapping(value="/hello")
public ModelAndView hello(int id) {
System.out.println(id);
ModelAndView mv = new ModelAndView();
//設置邏輯視圖名,視圖解析器會根據該名字解析到具體的視圖頁面
mv.setViewName("user");
return mv;
}
}
2.@RequestParam用來綁定單個請求參數值,可以指定一些屬性。
value:參數名字,即入參的請求參數名字,這也可以解決表單name和我們的形參名字不一樣的情況;
required:是否必須,默認是true,表示請求中一定要有相應的參數,否則將報404錯誤碼;
defaultValue:默認值,表示如果請求中沒有同名參數時的默認值。
例如:@RequestParam(value ="itemId", required = true, defaultValue = "1") int id:將表單項itemId的值賦給id。
3.不使用註解情況下,使用對象接收表單數據,請求的參數名稱和pojo的屬性名稱一致,會自動將請求參數賦值給pojo的屬性。
4.@ModelAttribute綁定請求參數到對象
public String test1(@ModelAttribute("user") UserModel user)
它的作用是將該綁定的命令對象以“user”爲名稱添加到模型對象中供視圖頁面展示使用。我們此時可以在視圖頁面使用${user.username}來獲取綁定的命令對象的屬性。
5.@CookieValue用於將請求的Cookie數據映射到功能處理方法的參數上。
public String test(@CookieValue(value="JSESSIONID", defaultValue="") String sessionId)
如上配置將自動將JSESSIONID值入參到sessionId參數上,defaultValue表示Cookie中沒有JSESSIONID時默認爲空。
6.@RequestHeader用於將請求的頭信息區數據映射到功能處理方法的參數上
@RequestMapping(value="/header")
public String test(
@RequestHeader("User-Agent") String userAgent,
@RequestHeader(value="Accept") String[] accepts)
如上配置將自動將請求頭“User-Agent”值入參到userAgent參數上,並將“Accept”請求頭值入參到accepts參數上。
SpringMVC+Mybatis+Spring案例
需求:頁面顯示所有商品信息並且提供修改功能。
1.搭建數據庫環境
CREATE DATABASE springmvc;
DROP TABLE IF EXISTS `items`;
CREATE TABLE `items` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL COMMENT '商品名稱',
`price` FLOAT(10,1) NOT NULL COMMENT '商品定價',
`detail` TEXT COMMENT '商品描述',
`pic` VARCHAR(64) DEFAULT NULL COMMENT '商品圖片',
`createtime` DATETIME NOT NULL COMMENT '生產日期',
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of items
-- ----------------------------
INSERT INTO `items` VALUES ('1', '臺式機', '3000.0', '該電腦質量非常好!!!!', NULL, '2016-02-03 13:22:53');
INSERT INTO `items` VALUES ('2', '筆記本', '6000.0', '筆記本性能好,質量好!!!!!', NULL, '2015-02-09 13:22:57');
INSERT INTO `items` VALUES ('3', '揹包', '200.0', '名牌揹包,容量大質量好!!!!', NULL, '2015-02-06 13:23:02');
2.創建Web工程,導入SpringMVC,Mybatis,Spring,Mysql驅動等jar包
3.通過Mybatis逆向工程生成POJO對象和Mapper接口
4.配置Spring配置文件,applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 配置數據庫連接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/springmvc"></property>
<property name="user" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<!-- 配置sqlSession工廠 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置核心配置文件 -->
<property name="configLocation" value="classpath:SqlMapConfig.xml"></property>
<!-- 配置數據源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置Mapper掃描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.cad.dao"/>
</bean>
<!-- 配置註解掃描 -->
<context:component-scan base-package="cn.cad" />
</beans>
5.配置spring-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:p="http://www.springframework.org/schema/p"
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-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!--配置映射器和適配器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
<!--配置視圖解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--配置Controller掃描-->
<context:component-scan base-package="cn.cad.controller" />
</beans>
6.配置Mybatis核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--什麼都不用配置,因爲掃描Mapper接口已經在Spring配置文件中配置過-->
</configuration>
7.配置Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>SpringMvcMybatisDemo</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 配置spring配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 使用監聽器加載Spring配置文件 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置springmvc前端控制器 -->
<servlet>
<servlet-name>springmvc-web</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc-web</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
7.創建Service層 ItemService
@Service
public class ItemService {
@Autowired
private ItemsMapper itemsMapper;
public List<Items> queryItems(){
//查詢所有Items
return itemsMapper.selectByExampleWithBLOBs(null);
}
}
8.創建Controller
@Controller
public class ItemController {
@Autowired
private ItemService itemService;
@RequestMapping("/itemlist")
public ModelAndView queryItemList() {
List<Items> list=itemService.queryItems();
for(Items i:list) {
System.out.println(i.getDetail());
}
ModelAndView modelAndView=new ModelAndView();
// 把商品數據放到模型中
modelAndView.addObject("itemList", list);
// 設置邏輯視圖
modelAndView.setViewName("itemList");
return modelAndView;
}
}
9.編寫JSP頁面
商品列表:
<table width="100%" border=1>
<tr>
<td>商品名稱</td>
<td>商品價格</td>
<td>生產日期</td>
<td>商品描述</td>
<td>操作</td>
</tr>
<c:forEach items="${itemList }" var="item">
<tr>
<td>${item.name }</td>
<td>${item.price }</td>
<td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
<td>${item.detail }</td>
<td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>
</table>
10.測試一下 http://localhost:8080/SpringMvcMybatisDemo/itemlist
修改商品信息
1.我們點擊修改按鈕,跳轉到修改頁面,然後將商品內容回顯,先創建service層
//根據id查詢Items
public Items selectItemById(int id) {
return itemsMapper.selectByPrimaryKey(id);
}
//根據id更新Items
public void updateItemById(Items item) {
itemsMapper.updateByPrimaryKeySelective(item);
}
2.編寫Controller
//根據提交的Items更新Items
@RequestMapping("/editItem")
public ModelAndView updateItem(Items item) {
itemService.updateItemById(item);
ModelAndView modelAndView=new ModelAndView();
modelAndView.setViewName("success");
return modelAndView;
}
//根據id查詢Items,並交由頁面回顯
@RequestMapping("/itemEdit")
public ModelAndView selectItem(int id) {
Items item=itemService.selectItemById(id);
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("item",item);
modelAndView.setViewName("editItem");
return modelAndView;
}
我們發現上面的數據提交到數據庫後,出現亂碼情況。
解決亂碼問題
SpringMVC框架提供了org.springframework.web.filter.CharacterEncodingFilter用於解決POST方式造成的中文亂碼問題。
在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>