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>
<!--<!–j2ee相關包–>-->
<!--<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>
<!--<!– 指定數據庫連接信息的位置 –>-->
<!--<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>
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
其他未列出的鏈接