SpringMVC入門學習案例筆記

1、數據庫環境用mysql,數據庫建表語句以下:html

  

/*
SQLyog v10.2 
MySQL - 5.1.72-community : Database - mybatis
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
/*Table structure for table `items` */


DROP DATABASE IF EXISTS `mybatis`;
CREATE DATABASE `mybatis` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

USE `mybatis`;

SET FOREIGN_KEY_CHECKS=0;

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;
insert  into `items`(`id`,`name`,`price`,`detail`,`pic`,`createtime`) values (1,'臺式機',3000.0,'該電腦質量很是好!!!!',NULL,'2015-02-03 13:22:53'),(2,'筆記本',6000.0,'筆記本性能好,質量好!!!!!',NULL,'2015-02-09 13:22:57'),(3,'揹包',200.0,'名牌揹包,容量大質量好!!!!',NULL,'2015-02-06 13:23:02');


/*Table structure for table `orderdetail` */

DROP TABLE IF EXISTS `orderdetail`;
CREATE TABLE `orderdetail` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `orders_id` int(11) NOT NULL COMMENT '訂單id',
  `items_id` int(11) NOT NULL COMMENT '商品id',
  `items_num` int(11) DEFAULT NULL COMMENT '商品購買數量',
  PRIMARY KEY (`id`),
  KEY `FK_orderdetail_1` (`orders_id`),
  KEY `FK_orderdetail_2` (`items_id`),
  CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
insert  into `orderdetail`(`id`,`orders_id`,`items_id`,`items_num`) values (1,3,1,1),(2,3,2,3),(3,4,3,4),(4,4,2,3);

  
/*Table structure for table `orders` */

DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '下單用戶id',
  `number` varchar(32) NOT NULL COMMENT '訂單號',
  `createtime` datetime NOT NULL COMMENT '建立訂單時間',
  `note` varchar(100) DEFAULT NULL COMMENT '備註',
  PRIMARY KEY (`id`),
  KEY `FK_orders_1` (`user_id`),
  CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
insert  into `orders`(`id`,`user_id`,`number`,`createtime`,`note`) values (3,1,'1000010','2015-02-04 13:22:35',NULL),(4,1,'1000011','2015-02-03 13:22:41',NULL),(5,10,'1000012','2015-02-12 16:13:23',NULL);
/*Table structure for table `user` */

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT '用戶名稱',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `sex` char(1) DEFAULT NULL COMMENT '性別',
  `address` varchar(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'王五',NULL,'2',NULL),(10,'張三','2014-07-10','1','北京市'),(16,'張小明',NULL,'1','河南鄭州'),(22,'陳小明',NULL,'1','河南鄭州'),(24,'張三丰',NULL,'1','河南鄭州'),(25,'陳小明',NULL,'1','河南鄭州'),(26,'王五',NULL,NULL,NULL);
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

建表成功以後數據庫如圖所示:前端

java的環境是jdk1.7,eclipse使用mars2,spring使用3.2的版本。spring3.2所須要的jar包如圖所示:java

至此,所須要的軟件和環境都準備完畢。mysql

----------------------------------------------------------------我是華麗的分割線-----------------------------web

開始正式開發第一個springmvc的程序。在eclipse搭建項目以下所示:spring

配置前端控制器,前端控制器的本質是一個servlet,因此前端控制器的配置要在web.xml文件裏面。sql

<!-- 配置SpringMVC前端控制器 -->
  <servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!-- 在這裏contextConfiguration配置springmvc的配置文件  (配置處理器適配器、映射器、視圖解析器等) 
      若是不配置contextConfiguration默認加載WEB-INF/servlet名稱-servlet.xml
      即springmvc-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-partern有三種方式    
          1. *.action   保證全部以.action結尾的請求都有DispatcherServlet進行解析
          2. /   全部的請求都由DispatcherServlet進行解析   可是要經過Restful風格的配置  讓DispatcherServlet不解析html等靜態文件
          3. /*  這種配置方式不對  會報錯
          目前先採用第一種方式
       -->
      <url-pattern>*.action</url-pattern>
  </servlet-mapping>

咱們把關於springmvc的配置所有集中在springmvc.xml文件中,這樣便於統一管理springmvc的東西。數據庫

配置非註解的處理器適配器:apache

 非註解的處理器適配器本質上就是一個bean。只要在springmvc.xml中添加下面的配置語句:json

<!-- 處理器適配器       這個適配器能夠執行全部實現Controller接口的handler -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

經過查看這個類的源代碼能夠發現,這個適配器能夠執行全部實現了Controller接口的類。

配置非註解的處理器映射器:

<!-- 處理器映射器     會把bean的name做爲url進行查找      所以在配置Handler的時候須要指定name屬性 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

配置視圖解析器:

<!-- 視圖解析器 
    解析jsp,默認使用jstl的標籤和語法,所以必需要有jstl的包
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
</bean>

 配置完成以後來開發第一個controller,這controller實現了Controller接口。這種非註解的方式在實際的開發過程當中使用的不多,由於一個類只能處理一件事情,這樣會有不少個類,不適合作大型的開發。

package com.whw.ssm.controller;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import com.whw.ssm.po.Items;

/**
 * 編寫第一個Controller
 * 這個Controller實現了Controller接口
 * @author Emitofo
 *
 */
public class ItemsController1 implements Controller{

    @Override
    public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
        // TODO Auto-generated method stub
        
        List<Items> itemsList = new ArrayList<Items>();
        //向list中填充靜態數據
        
        Items items_1 = new Items();
        items_1.setName("聯想筆記本");
        items_1.setPrice(6000f);
        items_1.setDetail("ThinkPad T430 聯想筆記本電腦!");
        
        Items items_2 = new Items();
        items_2.setName("蘋果手機");
        items_2.setPrice(5000f);
        items_2.setDetail("iphone6蘋果手機!");
        
        itemsList.add(items_1);
        itemsList.add(items_2);
        
        ModelAndView modelAndView = new ModelAndView();
        // 這個方法底層調用的是request.setAttribute();
        modelAndView.addObject("itemsList", itemsList);
        modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
        return modelAndView;
    }

}

 在springmvc.xml中配置url和這個controller的映射關係。這麼配置之後,只要用queryItem.action這個url來訪問,就能夠執行咱們寫的這個controller了。

<bean id="itemsController1" name="/queryItems.action" class="com.whw.ssm.controller.ItemsController1"/>

接着,咱們繼承HttpRequestHandler這個接口來開發一個新的Controller。

package com.whw.ssm.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.catalina.connector.Request;
import org.springframework.web.HttpRequestHandler;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import com.whw.ssm.po.Items;

/**
 * 編寫第二個Controller
 * 這個Controller實現了HttpRequestHandler接口
 * 這種方式和原生的servlet方式很類似,能夠直接操做request和response對象
 * 最多見的一種應用就是設置reponse的類型,而後給用戶返回一個json格式的數據
 * @author Emitofo
 *
 */
public class ItemsController2 implements HttpRequestHandler{

    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        
        List<Items> itemsList = new ArrayList<Items>();
        //向list中填充靜態數據
        
        Items items_1 = new Items();
        items_1.setName("聯想筆記本");
        items_1.setPrice(6000f);
        items_1.setDetail("ThinkPad T430 聯想筆記本電腦!這是高端系列的筆記本");
        
        Items items_2 = new Items();
        items_2.setName("蘋果手機");
        items_2.setPrice(5000f);
        items_2.setDetail("iphone6蘋果手機!裝逼專用的手機");
        
        itemsList.add(items_1);
        itemsList.add(items_2);
        
        request.setAttribute("itemsList", itemsList);
        request.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(request, response);
    }

}

同時咱們再springmv.xml中引入新的非註解映射器和非註解適配器,非註解映射器和非註解適配器能夠交叉使用。

第二種形式的非註解處理器映射器

<!-- 處理器映射器     會把bean的name做爲url進行查找      所以在配置Handler的時候須要指定name屬性 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<!--簡單url映射    這也是一個映射器    多個映射器能夠並存-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <!-- 對itemsController1進行url映射,url是/queryItems1.action 
                itemsController1是某個controller的id
            -->
            <prop key="/queryItems1.action">itemsController1</prop>
            <prop key="/queryItems2.action">itemsController1</prop>
        </props>
    </property>
</bean>

第二種形式的非註解處理器適配器

<!-- 另外一個非註解的適配器      適配器也能夠配置多個     每個適配器都實現了HandlerMapping這個接口-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

使用queryItems1.action或者是queryItems2.action均可以訪問頁面。

 開發使用註解形式的controller,注意,這是在實際開發過程當中使用最多的方式,由於註解簡單方便,易於使用,因此須要重點掌握。在使用註解的方式開發以前,必須先對springmvc.xml文件進行配置。注意,使用註解的方式進行開發,必須配置註解映射器和註解適配器,注意註解映射器只能和註解適配器搭配使用。

<!-- 註解映射器和註解適配器必須一塊兒使用     要麼都不用   要麼都得用 -->
<!--註解映射器 -->
<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> -->

使用註解的形式來開發controller。

package com.whw.ssm.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.catalina.connector.Request;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.whw.ssm.po.Items;

/**
 * 編寫第三個Controller
 * 使用註解的方式來實現Controller
 * @author Emitofo
 *
 */
@Controller
public class ItemsController3 {
    
    @RequestMapping("/queryItems4.action")
    public ModelAndView queryItems() throws Exception
    {
        List<Items> itemsList = new ArrayList<Items>();
        //向list中填充靜態數據
        
        Items items_1 = new Items();
        items_1.setName("聯想筆記本");
        items_1.setPrice(6000f);
        items_1.setDetail("ThinkPad T430 聯想筆記本電腦!這是高端系列的筆記本");
        
        Items items_2 = new Items();
        items_2.setName("蘋果手機");
        items_2.setPrice(5000f);
        items_2.setDetail("iphone6蘋果手機!裝逼專用的手機");
        
        itemsList.add(items_1);
        itemsList.add(items_2);
        
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("itemsList", itemsList);
        modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
        return modelAndView;
    }
    
}

對於註解形式開發的controller能夠在springmvc.xml中進行單個配置,也可使用spring的組件掃描,建議使用組件掃描,這樣就直接掃描那個package下面的全部類。

在springmvc.xml中單獨進行配置。

<bean class="com.whw.ssm.controller.ItemsController3"/>

或者是用spring的組件進行掃描。

<!-- 對於註解的Handler能夠單個配置
    實際開發中建議使用組件掃描
 -->
<!-- <bean class="cn.itcast.ssm.controller.ItemsController3" /> -->
<!-- 能夠掃描controller、service、...
這裏讓掃描controller,指定controller的包
 -->
<context:component-scan base-package="com.whw.ssm.controller"></context:component-scan>

 

使用queryItems4.action就能訪問這個controller。

 到如今爲止,springmvc.xml的內容以下:

 

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.2.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
        

<!-- 下面的是Handler -->
<bean id="itemsController1" name="/queryItems.action" class="com.whw.ssm.controller.ItemsController1"/>
<bean id="itemsController2" name="/queryItems3.action" class="com.whw.ssm.controller.ItemsController2"/>

<!-- <bean class="com.whw.ssm.controller.ItemsController3"/> -->

<!-- 處理器映射器     處理器適配器     視圖解析器等其實能夠不用在這個配置文件裏面配置    
由於 DispatcherServlet.properties裏面已經配置了這三個東西的默認值
-->
<!-- 處理器映射器     會把bean的name做爲url進行查找      所以在配置Handler的時候須要指定name屬性 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<!--簡單url映射    這也是一個映射器    多個映射器能夠並存-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <!-- 對itemsController1進行url映射,url是/queryItems1.action 
                itemsController1是某個controller的id
            -->
            <prop key="/queryItems1.action">itemsController1</prop>
            <prop key="/queryItems2.action">itemsController1</prop>
        </props>
    </property>
</bean>


<!-- 對於註解的Handler能夠單個配置
    實際開發中建議使用組件掃描
 -->
<!-- <bean class="cn.itcast.ssm.controller.ItemsController3" /> -->
<!-- 能夠掃描controller、service、...
這裏讓掃描controller,指定controller的包
 -->
<context:component-scan base-package="com.whw.ssm.controller"></context:component-scan>

<!-- 處理器適配器       這個適配器能夠執行全部實現Controller接口的handler -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<!-- 另外一個非註解的適配器      適配器也能夠配置多個     每個適配器都實現了HandlerMapping這個接口-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

<!-- 視圖解析器 
    解析jsp,默認使用jstl的標籤和語法,所以必需要有jstl的包
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
</bean>


<!-- 註解映射器和註解適配器必須一塊兒使用     要麼都不用   要麼都得用 -->
<!--註解映射器 -->
<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> -->

</beans>
相關文章
相關標籤/搜索