SpringMVC從入門到精通(一)

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> 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章