一、Spring、Spring MVC、MyBatis简介
二、SSM配置相关流程
项目结构图:
一、操作流程
从前台到后台配置相关的文件(相关依赖包已经处理完成[SpringMVC 、 Spring 、Spring-Mybatis 、Mybatis、MySqlJdbcDriver])
1.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.cy</groupId>
<artifactId>first</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>first Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<!--spring版本号 -->
<spring.version>4.2.5.RELEASE</spring.version>
<!--mybatis版本号 -->
<mybatis.version>3.4.1</mybatis.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 导入Servlet jar包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope><!-- 配置为私有作用域,保证执行时不会将该jar包放置到项目的依赖包中去 -->
</dependency>
<!-- spring核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</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>
<!-- 配置Spring MVC的框架 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 配置Spring MVC的框架 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- MyBatis/Spring包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- jdbc连接 (Mysql) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- DBCP数据源 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--上传组件包 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
</dependencies>
<build>
<finalName>first</finalName>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<groupId>org.apache.maven.plugins</groupId>
<version>2.6</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
2. web.xml
a. Spring 配置文件路径
<context-parm> : 参数名称, contextConfigLocation , 以及spring- mybatis.xml 路径 : classpath:spring-mybatis.xml
b. Spring 全局监听器
监听器(listenr) : ContextLoaderListener
c. SpringMVC的编码处理
通过过滤器实现(Filter):CharacterEncodingFilter 过滤对于web项目通常使用 utf-8 。
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
d. SpringMVC配置
通过DispatcherServlet 来实现请求的处理。
1) 参数传递spring-mvc 的配置文件路径。 其名称和spring 名称一致。
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
配置ServletMapping 注意映射的url-pattener 的时候不要加*
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
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_2_5.xsd">
<display-name>springMvc</display-name>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
<!-- 加载spring的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mybatis.xml</param-value>
</context-param>
<!-- 拦截器 -->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- SpringMvc 配置 -->
<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:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
3. spring-mvc.xml 的配置
a. 请求映射
RequestmappingHanderMapping
b. 视图解析
InternalResourceViewResover
prefix 前缀
suffix 后缀
b-1. 配置文件解析
CommonsMultipartResolver , 可以配置接收文件的大小。 id的名称必须是 multipartResolver,否则文件处理会失败。
b-2. JSON格式数据处理
jackson MappingJackson2HttpMessageConverter
c. 控制器扫描
context:compoment-scanner base-pakcage 属性扫描控制器
d. 注解驱动
mvc:annotation-driven
<?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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置SpringMVC -->
<!-- 1.开启SpringMVC注解模式 -->
<!-- 简化配置:
(1)自动注册DefaultAnootationHandlerMapping,AnotationMethodHandlerAdapter
(2)提供一些列:数据绑定,数字和日期的format @NumberFormat, @DateTimeFormat, xml,json默认读写支持
-->
<mvc:annotation-driven/>
<!-- 使用的静态的外部文件 -->
<mvc:resources mapping="/statics/**" location="/statics/" />
<!-- 视图解析器 -->
<!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
<bean id="viewresover" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 控制器扫描器 扫描控制层的注解类 -->
<context:component-scan base-package="com.cy.first.controller"/>
</beans>
4. spring-mybatis.xml
a. 数据源
BasicDataSource 进行配置 (dirverClassName,url,username,password)
b. 工厂(会话工厂)
SqlSessionFactoryBean 注意注入数据源
c. 事务
DataSourceTransactionManager , 注意注入数据源
<选择通过注解或者xml 注入。推荐使用注解注入>
d. mybatis 映射处理
使用 MapperScannerConfigurer , 填写basepackage 即可
e. 服务层注入处理
context:compoment-scanner 扫描服务层基包即可
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 引入配置文件
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties"></property>
</bean>
-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</bean>
<!-- 会话工厂 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 引用数据源组件 -->
<property name="dataSource" ref="dataSource" />
<!-- 配置bean的别名 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:com/cy/first/mapping/*.xml"/>
</bean>
<!-- 映射处理 配置Dao -->
<bean id="scannerconfiger" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.cy.first.dao"/>
</bean>
<!-- 扫描基类 -->
<!-- <context:component-scan base-package="com.cy.first"/> -->
<!-- 服务层扫描注解 -->
<context:component-scan base-package="com.cy.first.service"/>
<!-- 定义事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置基于注解的声明式事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
<?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>
<typeAliases>
<typeAlias type="com.cy.first.beans.User" alias="User"/>
</typeAliases>
</configuration>
1.User.java
package com.cy.first.beans;
public class User {
private int user_id;
private String user_name;
private String user_pass;
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getUser_pass() {
return user_pass;
}
public void setUser_pass(String user_pass) {
this.user_pass = user_pass;
}
}
2.UserDao.java
package com.cy.first.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.cy.first.beans.User;
public interface UserDao {
User userLogin(@Param("user_name")String user_name,@Param("user_pass")String user_pass);
List<User> queryAllUser();
}
3.UserDao.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.cy.first.dao.UserDao">
<!-- <resultMap type="User" id="usermap">
<result property="user_id" column="user_id"/>
<result property="user_name" column="user_name"/>
<result property="user_pass" column="user_pass"/>
</resultMap> -->
<!-- 用户数据查询 -->
<select id="userLogin" resultType="User">
select * from tb_user where user_name = #{user_name} and user_pass = #{user_pass}
</select>
<select id="queryAllUser" resultType="User">
select * from tb_user
</select>
</mapper>
4.UserService.java
package com.cy.first.service;
import java.util.List;
import com.cy.first.beans.User;
public interface UserService {
boolean userLogin(String uname,String upass);
List<User> queryAllUser();
}
package com.cy.first.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.cy.first.beans.User;
import com.cy.first.dao.UserDao;
import com.cy.first.service.UserService;
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public boolean userLogin(String uname, String upass) {
boolean flag = false;
if(userDao.userLogin(uname, upass)!=null) {
flag = true;
}
return flag;
}
@Override
public List<User> queryAllUser() {
return userDao.queryAllUser();
}
}
6.UserController.java
package com.cy.first.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.cy.first.service.UserService;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/userLogin")
public String userLogin(Model model, String uname, String upass) {
if(userService.userLogin(uname, upass)) {
model.addAttribute("uname",uname);
return "index";
}else
return "login";
}
@RequestMapping("/tologin")
public String toLogin() {
return "login";
}
}
7.UserTest.java
package com.cy.first.test;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.cy.first.beans.User;
import com.cy.first.service.UserService;
@RunWith(SpringJUnit4ClassRunner.class)//表示继承了SpringJUnit4ClassRunner类
@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})
public class UserTest {
@Aurowired
private UserService userService;
@Test
public void test() {
List<User> userList = userService.queryAllUser();
for(User user : userList) {
System.out.println(user.getUser_name());
}
// System.out.println(userService.userLogin("a", "a"));
}
}
8.login.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>登录</title>
</head>
<body>
<div>
<form action="userLogin" method="post">
登录名:<input type="text" name="uname"/><br/>
密码:<input type="password" name="upass"/><br/>
<input type="submit" value="登录"/><br/>
</form>
</div>
</body>
</html>
<%@ 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>登录</title>
</head>
<body>
${uname}欢迎登录!
</body>
</html>
三、数据处理流程
1. 从前端到后端
a. 数据在表单中 form 标签中通过 action 访问服务器的某一个地址。 通过表单内部的 标签上的name 属性和后台的服务器产生交互。
(浏览器会以文本格式将数据提交给服务器)
b. 服务器通过客户端即浏览器请求的地址来判断如何处理数据。服务器通过DispatchServlet 来分发各种不同的请求。通过映射器(Mapping)将请求分发到某个控制器方法上。 控制器的某个方法处理数据(页面跳转、调用服务层进行其他数据处理、或者是返回数据) 、处理结束之后会返回模型视图对象(ModelAndView)
c. DispatcherServlet 会根据模型找到相应的视图处理 即视图解析器、将数据组织到具体的页面中。
d. 最终将组织好的页面相应到客户端去。