Spring MVC+Spring+Mybatis+MySQL(IDEA)入門框架搭建


Spring MVC+Spring+Mybatis+MySQL(IDEA)入門框架搭建

Spring Mybatis demo


0.項目准備

使用Intelli IDEA最終版(個人使用社區版時無法添加本地Tomcat)新建一個Maven項目:File -> new -> project... ->在左側欄選中Maven -> 設置SDK(即jdk版本)-> 選中“Create from archetype” -> 選中“org.apache.maven.archetypes:maven-archetype-webapp” -> next -> 填寫GroupId(類似包名)和ArtifactId(一般是項目名)-> 一路next,最后finish得到新建項目。
1)在新項目基礎上再手動添加一些目錄結構,最后項目結構應類似:

src-
    |main-
          |java- (右鍵“Mark Directory as”設置為源碼根目錄)
                |com-
                     |jay-
                          |controller(控制層)
                          |dao(數據訪問層)
                          |entities(數據實體POJO)
                          |service(服務層)
          |resources-(右鍵“Mark Directory as”設置為資源根目錄)
                     |mybatis-
                              |mapping-
                                       |接口映射文件
                              |mybatis.xml
                              |mysql.properties
                     |spring-
                             |spring-mybatis.xml
                             |spring-mvc.xml
                     |log4j.properties
          |test-(右鍵“Mark Directory As”設置為測試根目錄)
                |UserDaoTest.java
                
          |webapp-
                  |WEB-INF-
                           |views-
                                  |errorpage-
                                             |404.jsp等
                                  |page1.jsp
                           |web.xml
                  |index.jsp
    |pom.xml

2)修改pom.xml文件,引入本項目即將要用到的依賴

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.jay.spring</groupId>
  <artifactId>springmvc</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>springmvc Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <properties>
    <!-- spring版本號 -->
    <spring.version>4.0.5.RELEASE</spring.version>
    <!-- log4j日志文件管理包版本 -->
    <slf4j.version>1.6.6</slf4j.version>
    <log4j.version>1.2.12</log4j.version>
    <!-- junit版本號 -->
    <junit.version>4.10</junit.version>
    <!-- mybatis版本號 -->
    <mybatis.version>3.2.1</mybatis.version>
  </properties>

  <dependencies>
    <!-- 添加Spring依賴 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <!--單元測試依賴 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>

    <!-- 日志文件管理包 -->
    <!-- log start -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>${log4j.version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <!-- log end -->

    <!--spring單元測試依賴 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
      <scope>test</scope>
    </dependency>

    <!--mybatis依賴 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>

    <!-- mybatis/spring包 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.2.0</version>
    </dependency>

    <!-- mysql驅動包 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.29</version>
    </dependency>

    <!-- javaee-api包 注意和項目使用的JDK版本對應 -->
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>6.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-web-api</artifactId>
      <version>6.0</version>
      <scope>provided</scope>
    </dependency>

    <!--&lt;!&ndash;j2ee相關包&ndash;&gt;-->
    <!--<dependency>-->
      <!--<groupId>javax.servlet</groupId>-->
      <!--<artifactId>javax.servlet-api</artifactId>-->
      <!--<version>3.1.0</version>-->
    <!--</dependency>-->
    <!--<dependency>-->
      <!--<groupId>javax.servlet.jsp</groupId>-->
      <!--<artifactId>jsp-api</artifactId>-->
      <!--<version>2.2</version>-->
    <!--</dependency>-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

  </dependencies>


  <build>
    <finalName>springmvc</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

1.數據持久層Mybatis+MySQL

1.1 MySQL數據准備

安裝好mysql,登錄后新建數據庫,然后建立user表,這里建立了一個很簡單的表。

mysql> desc user;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | int(11)      | NO   | PRI | NULL    |       |
| name    | varchar(255) | NO   |     |         |       |
| address | varchar(255) | NO   |     | GX      |       |
+---------+--------------+------+-----+---------+-------+

然后隨便插入幾條測試數據:

mysql> select * from user;
+----+------+---------+
| id | name | address |
+----+------+---------+
|  1 | bing | BoBai   |
|  2 | Jay  | BoBai   |
|  3 | baba | YuLin   |
+----+------+---------+
3 rows in set (0.01 sec)

到這里,mysql里面的數據准備好了,接下來要通過Mybatis來獲取。

1.2 Mybatis配置和使用

配置文件在mybatis目錄下新建。

1.2.1 新建實體類和訪問接口

1)根據數據庫的user表,在entities目錄下新建一個與之一一對應的Java類User.java:

package com.jay.entities;

public class User {
    private Integer id;
    private String name;
    private String address;

    public User(){}

    public User(Integer id, String name, String address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

2)建立訪問底層數據的接口UserDao,這里為了方便,只定義了一個方法。

package com.jay.dao;

import com.jay.entities.User;
import java.util.List;

public interface UserDao {
    List<User> getAllUsers();
}

1.2.2 配置MySQL連接信息

在mybatis目錄下新建mysql.properties文件:

mybatis/mysql.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/數據庫名
username=root
password=root

1.2.3 配置Mybatis信息

1)配置與UserDao對應的Mapper.xml文件
新建文件mybatis/mapping/UserDaoMapper.xml

mybatis/mapping/UserDaoMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--命名空間是對應接口的包名+類名,指定要映射的接口 -->
<mapper namespace="com.jay.dao.UserDao">
    <!--id是接口中的方法名,結果類型如沒有在mybatis.xml文件中配置別名,則必須使用全名稱(包名+類名) -->
    <select id="getAllUsers" resultType="User">
        select id,`name`,address from user
    </select>

</mapper>

2)配置Mybatis與mysql的連接文件

mybatis/mybatis.xml

<?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">


<!--沒有集成spring時可以用,集成spring后這個文件主要內容都做spring配置文件中完成-->
<configuration>
    <!-- 指定數據庫連接信息的位置 -->
    <properties resource="mybatis/mysql.properties"></properties> 
    
    <!--設置類別名,默認引入該包下的所有類,這樣在寫Mapper文件的時候就可以只寫entity的類名,而不用寫全名那么麻煩 -->
    <typeAliases>
        <package name="com.jay.entities"/>
    </typeAliases>

    <!--配置mysql的鏈接信息,數據從配置文件里面讀取,注意名稱要對應-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>

    <!--引入映射文件 -->
    <mappers>
        <mapper resource="mybatis/mapping/UserDaoMapper.xml" />
    </mappers>

</configuration>

3)配置log4j
新建文件resources/log4j.properties

log4j.rootLogger=INFO,Console,Stdout

#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG 

log4j.appender.Stdout = org.apache.log4j.DailyRollingFileAppender  
log4j.appender.Stdout.File = E://logs/log.log  
log4j.appender.Stdout.Append = true  
log4j.appender.Stdout.Threshold = DEBUG   
log4j.appender.Stdout.layout = org.apache.log4j.PatternLayout  
log4j.appender.Stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n  

1.2.4 測試Mybatis訪問Mysql的數據

1)在test目錄下新建測試類UserDaoTest.java

import com.jay.dao.UserDao;
import com.jay.entities.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.InputStream;
import java.util.List;

public class UserDaoTest {
    private static Logger logger = Logger.getLogger(UserDaoTest.class);

    public static void main(String[] args) {
        testMybatis();
    }

    private static void testMybatis(){
        System.out.println("hi");
        // 獲得Mybatis配置文件流
        InputStream config = UserDaoTest.class.getClassLoader().getResourceAsStream("mybatis/mybatis.xml");
        // 創建sql會話工廠
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config);
        //獲得會話對象
        SqlSession session = factory.openSession(true);
        try {
            //通過MyBatis實現接口UserDAO,返回實例
            UserDao userDao = session.getMapper(UserDao.class);
            List<User> users = userDao.getAllUsers();
            logger.info(users);
            users.forEach(user-> logger.info(user.getId()+","+user.getName()+","+user.getAddress()));
        } finally {
            session.close();
        }
    }
}

2)運行結果

hi
[User{id=1, name='bing', address='BoBai'}, User{id=2, name='Jay', address='BoBai'}, User{id=3, name='baba', address='YuLin'}]
1,bing,BoBai
2,Jay,BoBai
3,baba,YuLin

Process finished with exit code 0

控制台打印出來的內容和mysql數據里面的信息一致,說明Mybatis已經可以正確獲取Mysql里的數據了,接下來在項目目前完成的基礎上集成Spring。

2.Spring+Mybatis

2.1 Spring配置

從上面的例子可以看到,如果要訪問數據,那么我們就必須先要讀取mybatis.xml配置文件,然后生成SqlSessionFactory對象,再獲取對應的session才可以訪問數據。現在要把這些工作都交給Spring來完成(配置即可),就不用手動讀取配置新建對象那么麻煩了。而且原來配置在mybatis.xml文件中的信息,都可以全部移到spring配置文件中來,原來的mybatis.xml文件存在價值不大了。
在spring目錄下新建spring-mybatis.xml文件:

spring/spring-mybatis.xml

<?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:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!-- 引入mysql jdbc配置文件 -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:mybatis/mysql.properties</value>
                <!--要是有多個配置文件,只需在這里繼續添加即可 -->
            </list>
        </property>
    </bean>

    <!-- 配置mysql數據源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <!-- 使用properties來配置 -->
        <property name="driverClassName">
            <value>${driver}</value>
        </property>
        <property name="url">
            <value>${url}</value>
        </property>
        <property name="username">
            <value>${username}</value>
        </property>
        <property name="password">
            <value>${password}</value>
        </property>
    </bean>

    <!-- 自動掃描了所有的XxxxMapper.xml對應的mapper接口文件,這樣就不用一個一個手動配置Mpper的映射了,只要Mapper接口類和Mapper映射文件對應起來就可以了。 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.jay.dao.*" />
    </bean>

    <!-- 配置Mybatis的文件 ,mapperLocations配置**Mapper.xml文件位置,configLocation配置mybatis-config文件位置-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:mybatis/mapping/*.xml"/>
        <property name="configLocation" value="classpath:mybatis/mybatis.xml" />
    </bean>

    <!-- 自動掃描注解的bean -->
    <context:component-scan base-package="com.jay.*" />

    <!-- 用eclipse的同學說不用配置該項(未驗證),我也認為Mapper文件已經和接口對應起來了也不用配置的,但是IDEA一直報錯無法注入UserDao,增加該配置后就ok了。每一個Mapper都需要注入sqlSessionFactory和指定映射接口 -->
    <bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
        <property name="mapperInterface" value="com.jay.dao.UserDao"></property>
    </bean>

</beans>

這個時候的mybatis.xml文件內容大都可以不要了,注釋掉

<?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">


<!--沒有集成spring時可以用,集成spring后這個文件主要內容都做spring配置文件中完成-->
<configuration>
    <!--&lt;!&ndash; 指定數據庫連接信息的位置 &ndash;&gt;-->
    <!--<properties resource="mybatis/mysql.properties"></properties>-->

    <!--設置類別名,默認引入該包下的所有類,這樣在寫Mapper文件的時候就可以只寫entity的類名,而不用寫全名那么麻煩 -->
    <typeAliases>
        <package name="com.jay.entities"/>
    </typeAliases>

    <!--&lt;!&ndash;配置mysql的鏈接信息,基本數據從配置文件里面讀取&ndash;&gt;-->
    <!--<environments default="development">-->
        <!--<environment id="development">-->
            <!--<transactionManager type="JDBC" />-->
            <!--<dataSource type="POOLED">-->
                <!--<property name="driver" value="${driver}" />-->
                <!--<property name="url" value="${url}" />-->
                <!--<property name="username" value="${username}" />-->
                <!--<property name="password" value="${password}" />-->
            <!--</dataSource>-->
        <!--</environment>-->
    <!--</environments>-->

    <!--&lt;!&ndash;引入映射文件 &ndash;&gt;-->
    <!--<mappers>-->
        <!--<mapper resource="mybatis/mapping/UserDaoMapper.xml" />-->
    <!--</mappers>-->

</configuration>

2.2 測試

在UserDaoTest.java類里添加測試方法testSpringMybatis()

import com.jay.dao.UserDao;
import com.jay.entities.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.InputStream;
import java.util.List;

public class UserDaoTest {
    private static Logger logger = Logger.getLogger(UserDaoTest.class);

    public static void main(String[] args) {
//        testMybatis();
        testSpringMybatis();
    }

    private static void testSpringMybatis(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring/spring-mybatis.xml");
        SqlSessionFactory factory = (SqlSessionFactory) context.getBean("sqlSessionFactory");
        //獲得會話對象
        SqlSession session = factory.openSession(true);
        try {
            //通過MyBatis實現接口UserDAO,返回實例
            UserDao userDao = session.getMapper(UserDao.class);
            List<User> users = userDao.getAllUsers();
            System.out.println(users);
            users.forEach(user-> logger.info(user.getId()+","+user.getName()+","+user.getAddress()));
        } finally {
            session.close();
        }

    }


    private static void testMybatis(){
        System.out.println("hi");
        // 獲得環境配置文件流
        InputStream config = UserDaoTest.class.getClassLoader().getResourceAsStream("mybatis/mybatis.xml");
        // 創建sql會話工廠
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config);
        //獲得會話對象
        SqlSession session = factory.openSession(true);
        try {
            //通過MyBatis實現接口UserDAO,返回實例
            UserDao userDao = session.getMapper(UserDao.class);
            List<User> users = userDao.getAllUsers();
            logger.info(users);
            users.forEach(user-> logger.info(user.getId()+","+user.getName()+","+user.getAddress()));
        } finally {
            session.close();
        }
    }
}

2.3 運行結果

[User{id=1, name='bing', address='BoBai'}, User{id=2, name='Jay', address='BoBai'}, User{id=3, name='baba', address='YuLin'}]
2017-09-02 12:02:55,259 [main] INFO  [UserDaoTest] - 1,bing,BoBai
2017-09-02 12:02:55,259 [main] INFO  [UserDaoTest] - 2,Jay,BoBai
2017-09-02 12:02:55,259 [main] INFO  [UserDaoTest] - 3,baba,YuLin

Process finished with exit code 0

集成Spring后,可以通過Spring配置正常獲取mysql的數據,說明到這都是暢通的。接下來加入Spring MVC模塊。

3.加入Spring MVC處理請求

3.1 配置spring-mvc.xml文件

在spring目錄下新建spring-mvc.xml文件

spring/spring-mvc.xml

<?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: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-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/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--啟用spring的注解annotation -->
    <context:annotation-config/>

    <!-- 自動掃描該包,使SpringMVC認為包下用了@controller注解的類是控制器 -->
    <context:component-scan base-package="com.jay.controller">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 配置注解驅動 可以將request參數與綁定到controller參數上 -->
    <mvc:annotation-driven/>

    <!-- 添加視圖解析器前后綴,這里默認使用.jsp文件-->
    <bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/views/"/><!--設置JSP文件的目錄位置-->
        <property name="suffix" value=".jsp"/>
    </bean>


</beans>

3.2 web.xml配置

web.xml不僅要處理轉發請求,還要加載Spring文件和Spring MVC的配置文件,添加上下文監聽器、編碼過濾等。非常重要的一個文件。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">


  <!--welcome pages-->
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <!-- 讀取spring配置文件 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/spring-mybatis.xml</param-value>
  </context-param>


  <!--解決亂碼問題-->
  <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>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <!-- 日志記錄 -->
  <context-param>
    <!-- 日志配置文件路徑 -->
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</param-value>
  </context-param>

  <!--spring上下文監聽器,如果沒有-->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!--配置springmvc DispatcherServlet,轉發前端或后台發來的請求-->
  <servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <!--resources目錄下需要新建一個spring文件夾-->
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring/spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>


  <!-- 錯誤跳轉頁面 -->
  <error-page>
    <!-- 404客戶端路徑不正確 -->
    <error-code>404</error-code>
    <location>/WEB-INF/views/errorpage/404.jsp</location>
  </error-page>
  <error-page>
    <!-- 客戶端沒有訪問權限,訪問被禁止 -->
    <error-code>405</error-code>
    <location>/WEB-INF/views/errorpage/405.jsp</location>
  </error-page>
  <error-page>
    <!-- 服務器內部錯誤 -->
    <error-code>500</error-code>
    <location>/WEB-INF/views/errorpage/500.jsp</location>
  </error-page>


</web-app>

3.3 MVC(視圖層、控制層、模塊服務層)

3.3.1 視圖層文件

1)修改webapp目錄下的index.jsp
項目啟動頁面,可以在以后的開發中設置為登錄驗證頁面。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<html>
<head>
</head>
<body>
<h1>登錄,首頁</h1>
</body>
</html>

2)在WEB-INF/views/目錄下添加文件
page1.jsp展示從數據庫獲取的user數據信息

WEB-INF/views/page1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<html>
<head>
</head>
<body>
<h1>Hello world!</h1>
${user.id}
${user.name}
</body>
</html>

errorpage目錄下的是錯誤跳轉頁面

WEB-INF/views/errorpage/404.jsp

<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>

<html>
<body>
<h2>404 err</h2>
</body>
</html>
-----------------------------------------
WEB-INF/views/errorpage/405.jsp

<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>

<html>
<body>
<h2>405 err</h2>
</body>
</html>
-----------------------------------------
WEB-INF/views/errorpage/500.jsp

<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>

<html>
<body>
<h2>500 err</h2>
</body>
</html>
-----------------------------------------

3.3.2 控制層

在com.jay.controller包下新建UserController.java。主要有兩個方法,getUser()返回user對象信息給page1.jsp處理,然后在前端頁面展示數據庫的數據信息。方法sayHi驗證前后數據傳輸是否正常。

package com.jay.controller;

import com.jay.entities.User;
import com.jay.service.UserService;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;


@Controller
public class UserController {
    private static final Logger logger = Logger.getLogger(UserController.class);

    @Resource
    private UserService service;

    /**
     *返回user對象信息給page1.jsp處理,然后在前端頁面展示
     */
    @RequestMapping("/page1")
    public ModelAndView getUser() {
        System.out.println("訪問page1的后台。。。");
        ModelAndView mav = new ModelAndView("page1");
        List<User> users = service.getAllUser();
        System.out.println(users);
        mav.addObject("user", users.get(0));
        return mav;
//        return "page1"; //跳轉到.jsp結尾的對應文件(page1.jsp),此時返回值是String
    }

  /**
     * 直接返回字符串給請求的頁面(這里在請求URL增加參數v是驗證前后台通信是否正常)
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value = "/say", produces = "text/html;charset=UTF-8")
    @ResponseBody
    public String sayHi(HttpServletRequest request, HttpServletResponse response) {
        String name = request.getParameter("v");
        List<User> users = service.getAllUser();
        logger.info("{name:jay,context:hi,你好}");
        return name+"-{name:jay,context:hi,你好}"+users;
    }


}

3.3.3 服務層

在com.jay.service下新建接口和實現類。
訪問接口,沒有任何注解。

package com.jay.service;

import com.jay.entities.User;

import java.util.List;

public interface UserService {
    List<User> getAllUser();
}

接口實現類,注解@Service並制定名稱,同時@Scope("prototype")設定每次訪問都創建一個新對象,通過@Resource自動注入userDao。通過userDao就可以尋找映射的mybatis文件,從而正常獲取數據庫的信息。

package com.jay.service.impl;

import com.jay.dao.UserDao;
import com.jay.entities.User;
import com.jay.service.UserService;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service("userServiceImpl")
@Scope("prototype")
public class UserServiceImpl implements UserService {

    @Resource
    private UserDao userDao;

    @Override
    public List<User> getAllUser() {
        return userDao.getAllUsers();
    }
}

4.測試

給IDEA添加本地Tomcat服務器,然后將本項目發布到Tomcat並啟動。
啟動后訪問項目:

1.訪問:http://localhost:8080/springmvc/
  頁面顯示:
           登錄,首頁
2.訪問:http://localhost:8080/springmvc/page1
  頁面顯示:
            Hello world!
            1 bing (數據庫獲取的信息,這里只提取一條來說明)
            
3.訪問:http://localhost:8080/springmvc/say?v=cainiao
頁面顯示:
cainiao-{name:jay,context:hi,你好}[User{id=1, name='bing', address='BoBai'}, User{id=2, name='Jay', address='BoBai'}, User{id=3, name='baba', address='YuLin'}]

至此,可以直接從前端URL請求,通過SpringMVC、Spring、Mybatis正常訪問MySQL的數據,流程走通。

5.總結

本例子只是一個最簡單的demo,只是用來說明框架搭建的過程。
每個環節都有十分豐富的內容需要學習和補充,比如Mybatis部分CURD、動態SQL、事務處理等,Spring部分有日志、事務、權限等AOP切面、並發處理、IO性能等,前端也有Struts等各種框架。

源碼地址:
git@github.com:FEFJay/spring_demo.git

參考鏈接:
http://blog.csdn.net/Evankaka/article/details/48785513
http://wiki.jikexueyuan.com/project/spring/mvc-framework/spring-mvc-hello-world-example.html
其他未列出的鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM