SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部份内容)。常做为数据源较简单的web项目的框架。javascript
1.SpringMVC:css
客户端发送请求到DispacherServlet(分发器)html
由DispacherServlet控制器查询HanderMapping,找处处理请求的Controllerjava
Controller调用业务逻辑处理后,返回ModelAndViewmysql
DispacherSerclet查询视图解析器,找到ModelAndView指定的视图jquery
视图负责将结果显示到客户端web
2.Spring:spring
Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器架构,IOC容器包含并管理应用对象的配置和生命周期,你能够配置你的每一个bean如何被建立,也能够配置每一个bean是只有一个实例,仍是每次须要时都生成一个新的实例,以及它们是如何相互关联的。sql
IOC思想最核心的地方在于,资源不禁使用资源的双方管理,而由不使用资源的第三方管理,这能够带来不少好处。第一,资源集中管理,实现资源的可配置和易管理。第二,下降了使用资源双方的依赖程度,也就是咱们说的耦合度。数据库
容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
3.MyBatis:
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎全部的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录。
MyBatis的操做都是围绕一个sqlSessionFactory实例展开的。MyBatis经过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每一个类对数据库所需进行的sql语句映射。在每次与数据库交互时,经过sqlSessionFactory拿到一个sqlSession,再执行sql命令。
4.Maven:
JavaEE项目开发中为了便于后期的维护,通常会进行分层开发,分层以后,各个层之间的职责会比较明确,后期维护起来也相对比较容易。
项目配置:
1.新建:New-->Other-->maven-->MavenProtect-->webapp-->SSM03
2.配置Tomcat:右击Properties-->Java Build Path-->Libraries-->Add Library-->Server Runtime-->Apache Tomcat v8.5,完成
3.新建web动态项目,名称随便起,点击next两次,在Generate web.xml deployment descriptor前打勾,完成
咱们须要的是web.xml,留下<web-app></web-app>标签,其他内容删除,复制到SSM03下的web.xml中,并完全删除新建的web动态项目
4.在Navigator中,找到SSM03项目,在包.settings下面找到org.eclipse.wst.common.project.facet.core.xml文件,修改<installed facet="jst.web" version="2.3"/>为3.1版本
5.右击SSM03,选择Maven-->Update Project-->ok
6.删除src-->main-->webapp-->index.jsp,从新创建index.jsp,在其中写一句话,运行SSM03
7.配置pom.xml,导入依赖jar包,spring-context、spring-tx、spring-jdbc、spring-webmvc、mybatis、mybatis-spring、dbcp、mysql
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.18.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.3.18.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.18.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.18.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency>
8.在Java Resources下的resources包中新建ssm.xml文件,该文件以spring为核心(spring配置文件),在https://docs.spring.io/spring/docs/4.3.23.RELEASE/spring-framework-reference/htmlsingle/中找到7.2.1,复制。
可复制的内容以下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
Spring最大的特色就是控制反转,而实现控制反转就是经过那一系列的配置文件。
(1)须要添加的内容:
A:添加mybatis的约束文件 xmlns:mybatis="http://mybatis.org/schema/mybatis-spring" B:添加约束文件的地址: http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd
定义了三个命名空间,代号为context,mvc,mybatis
其中,context的约束文件复制的是schemaLocation里面的,将beans更改成context,而后复制两行到下面,第二行加上spring-context.xsd
同理,mvc的约束文件复制的也是schemaLocation里面的,将beans更改成mvc,而后复制两行到下面,第二行加上spring-mvc.xsd
mybatis的约束文件须要单独添加。
(2)注意:使用<context:component-scan>元素会扫描指定的包及其全部的子包,并查找出可以自动注册为Spring Bean的类。
base-package属性标识了<context:component-scan>元素所扫描的包。同时,也会扫描包含@Service,@Component,@Repository,@Controller注解修饰的类。
(3)咱们经常会须要访问静态资源,如html,js,css,image等,默认访问的URL都会被DispatcherServlet所拦截,SpringMVC提供了更为便捷的方式处理静态资源,直接在servlet-context.xml中添加资源映射。在本案例中,就是向ssm.xml中添加静态资源映射。
<mvc:annotation-driven /><!-- 注解驱动 --> <mvc:default-servlet-handler /> <mvc:resources location="/resources/" mapping="/resources/**" /> <mvc:resources location="/images/" mapping="/images/**"></mvc:resources> <mvc:resources location="/js/" mapping="/js/**"></mvc:resources> <mvc:resources location="/css/" mapping="/css/**"></mvc:resources> <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" lazy-init="false" /> <!-- 另外最好还要加入DefaultAnnotationHandlerMapping,否则会被 XML或其它的映射覆盖! --> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
(4)配置数据源
<!-- 加载数据库配置文件 -->
<context:property-placeholder location="classpath:db.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
(5)经过IOC容器管理SqlSessionFactory对象
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 加载数据库链接池 --> <property name="dataSource" ref="dataSource"></property> <!-- 配置扫描全部的 mapper.xml 文件 --> <property name="mapperLocations" value="classpath:com/beicai/mapper/*Mapper.xml" /> </bean> <!-- DAO(Mapper)接口所在包名,Spring会自动查找其下的类 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.beicai.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean>
ssm.xml(属于整合SpringMVC)
(1)<?xml version="1.0" encoding="UTF-8"?>是指版本和编码信息。
(2)beans标签是整个配置文件的根节点,包含一个或者多个bean元素。
(3)命名空间:xmlns:XML NameSpace的缩写。Spring默认的命名空间就是http://www.springframework.org/schema/beans
。
Spring容器在解析xml文件时,会获取标签的命名空间来跟上述url比较,判断是否为默认命名空间。
(4)xmlns:xsi(xml schema instance)是指具体用到的schema资源文件里定义的元素所准守的规范。
即http://www.w3.org/2001/XMLSchema-instance
这个文件里定义的元素遵照什么标准 。
(5)xsi:schemaLocation 本文档里的xml元素所遵照的规范,这些规范都是由官方制定的,能够进你写的网址里面看版本的变更。
xsd的网址还能够帮助你判断使用的代码是否合法。
(6)spring从2.5版本开始支持注解注入,注解注入能够省去不少的xml配置工做。因为注解是写入java代码中的,因此注解注入会失去必定的灵活性,根据须要是否启用注解注入。
<context:component-scan base-package="xxxxxxxxx"/>启用了对类包进行扫描以实施注释驱动 Bean 定义的功能,同时还启用了注释驱动自动注入的功能。
base-package 属性指定了须要扫描的类包,类包及其递归子包中全部的类都会被处理。
<?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" xmlns:mybatis="http://mybatis.org/schema/mybatis-spring" xsi:schemaLocation="http://www.springframework.org/schema/beans https://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 http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd "> <!-- 扫描器 --> <context:component-scan base-package="com.ztt"></context:component-scan> <!-- 静态资源映射 --> <mvc:annotation-driven /><!-- 注解驱动 --> <mvc:default-servlet-handler /> <mvc:resources location="/resources/" mapping="/resources/**" /> <mvc:resources location="/images/" mapping="/images/**"></mvc:resources> <mvc:resources location="/js/" mapping="/js/**"></mvc:resources> <mvc:resources location="/css/" mapping="/css/**"></mvc:resources> <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" lazy-init="false" /> <!-- 另外最好还要加入DefaultAnnotationHandlerMapping,否则会被 XML或其它的映射覆盖! --> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> <!-- 数据源 --> <!-- 加载数据库配置文件 -->
<context:property-placeholder location="classpath:db.properties" /> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driver}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean>
<!--经过IOC容器管理SqlSessionFactory对象--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 加载数据库链接池 --> <property name="dataSource" ref="dataSource"></property> <!-- 配置扫描全部的 mapper.xml 文件 --> <property name="mapperLocations" value="classpath:com/ztt/mapper/*Mapper.xml" /> </bean>
<!-- DAO(Mapper)接口所在包名,Spring会自动查找其下的类 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.ztt.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean> </beans>
9.配置webapp中的web.xml
web.xml的做用?
web.xml文件是Java web项目中的一个配置文件,主要用于配置欢迎页、Filter、Listener、Servlet等,但并非必须的,一个java web项目没有web.xml文件照样能跑起来。Tomcat容器/conf
目录下也有做用于全局web应用web.xml文件,当一个web项目要启动时,Tomcat会首先加载项目中的web.xml文件,而后经过其中的配置来启动项目,只有配置的各项没有错误时,项目才能正常启动。
(1)对于<servlet>元素和<servlet-mapping>元素的理解(Servlet映射匹配问题)
因为客户端是经过URL地址访问web服务器中的资源,因此Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工做在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
<servlet>元素用于注册Servlet,它包含有两个主要的子元素:
<servlet-name>:Servlet的注册名称
名称为:dispatcherServlet。
<servlet-class>:Servlet的完整类名
在本案例中找的是Libraries下的Maven Dependencies下的spring-webmvc-4.3.18.RELEASE.jar,找到org.springframework.web.servlet,找到 DispatcherServlet.class,并复制。即org.springframework.web.servlet.DispatcherServlet。
<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:
<servlet-name>:指定Servlet的注册名称
名称为:dispatcherServlet。
<url-pattern>,Servlet的对外访问路径
当我使用<url-pattern>/*</url-pattern>时,咱们能够匹配全部的请求,即全部的请求都会通过该标签对应的Servlet
注:<url-pattern>/</url-pattern>和<url-pattern>/*</url-pattern>效果是同样的
<init-param>是放在一个servlet内的,因此这个参数是只针对某一个servlet而言的
(2)在web.xml中使用contextConfigLocation参数定义要装入的Spring配置文件。
在<param-value>标记要配置的文件。
(3)<filter>...</filter>: 定义一个过滤器。
<filter-mapping>...</ filter-mapping> :配置上面那个定义的过滤器。
<url-pattern>/*</url-pattern>表示适用的范围是全部的请求。
<filter-name>过滤器的名字,能够本身取。
<filter-class>引用的具体类文件名。通常引用官方包装好的,名字固定。
定义和配置即<filter>和<filter-mapping>是成对出现的。其中的<filter-name>相同则是一对。
这段代码的做用主要是为了实现hibernate的延迟加载功能
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:ssm.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 编码过滤器 --> <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> <welcome-file-list> <welcome-file>register.jsp</welcome-file> </welcome-file-list> </web-app>
10.在Java Resources下的resources包中新建db.properties文件
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mydb2 jdbc.username=root jdbc.password=123
11.将index.jsp修改成rigister.jsp
在webapp下新建js文件,将jquery-3.0.0.js粘贴进去
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="js/jquery-3.0.0.js"></script> </head> <body> <form action="register" method="post"> UserName:<input type="text" name="username" id="uname"><br/> PassWord:<input type="password" name="password" id="pword"><br/> <input type="button" value="Register" id="btn"> </form> <script type="text/javascript"> $("#btn").click(function(){ var uname = $("#uname").val(); var pword = $("#pword").val(); if (uname != null && pword != null && uname != "" && pword != "") { $("form").submit(); }else{ alert("用户名或密码不能为空"); } }); </script> </body> </html>
注意:在这里须要先创建com.ztt.mapper包,由于在ssm.xml中已经对mapper进行了扫描,对项目运行监测
12.(1)在src/main/java中建立com.ztt.controller包,并建立UserController.java类
package com.ztt.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.servlet.ModelAndView; import com.ztt.bean.User; import com.ztt.service.UserService; @Controller public class UserController { @Autowired UserService us ; @PostMapping("/register") public ModelAndView register(ModelAndView mv , User user) { boolean is = us.regsiter(user); if (is) { mv.setViewName("login.jsp"); mv.addObject("username", user.getUsername()); }else { mv.setViewName("register.jsp"); mv.addObject("errmsg","网络错误,注册失败,请重试"); } return mv; } @PostMapping("/login") public ModelAndView login(ModelAndView mv , User user) { User u = us.login(user); if (u != null && u.getUsername() != null && u.getUsername() != "") { mv.setViewName("homepage.jsp"); }else { mv.addObject("errmsg", "网络错误,请重试"); mv.setViewName("login.jsp"); } return mv; } }
(2)建立com.ztt.bean包,建立User.java,这须要与数据库中的数据保持一致
package com.ztt.bean; public class User { int uid; String username; String password; String imgUrl; public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getImgUrl() { return imgUrl; } public void setImgUrl(String imgUrl) { this.imgUrl = imgUrl; } @Override public String toString() { return "User [uid=" + uid + ", username=" + username + ", password=" + password + ", imgUrl=" + imgUrl + "]"; } }
(3)建立com.ztt.service包,建立UserService.java
package com.ztt.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ztt.bean.User; import com.ztt.mapper.UserMapper; @Service public class UserService { @Autowired UserMapper um; public boolean regsiter(User user) { return um.addUser(user)>0?true:false; } public User login(User user) { return um.login(user); } }
(4)创建UserMapper.java接口
package com.ztt.mapper; import org.springframework.stereotype.Repository; import com.ztt.bean.User; @Repository public interface UserMapper { int addUser(User user); User login(User user); }
(5)新建UserMapper.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.ztt.mapper.UserMapper"> <!-- 标签的ID必须和Mapper接口中的方法名保持一致 --> <insert id="addUser" parameterType="com.ztt.bean.User"> insert into user values(null , #{username} , #{password} , "") </insert> <select id="login" resultMap="loginRM"> select * from user where username = #{username} and password = #{password} </select>
<resultMap type="com.ztt.bean.User" id="loginRM"> </resultMap> </mapper>
13.建立login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="js/jquery-3.0.0.js"></script> </head> <body> <form action="login" method="post"> UserName:<input type="text" name="username" id="uname" value="${username }"><br/> PassWord:<input type="password" name="password" id="pword"><br/> <input type="button" value="Login" id="btn"> </form> <script type="text/javascript"> $("#btn").click(function(){ var uname = $("#uname").val(); var pword = $("#pword").val(); if (uname != null && pword != null && uname != "" && pword != "") { $("form").submit(); }else{ alert("用户名或密码不能为空"); } }); </script> </body> </html>
14.建立homepage.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> 欢迎光临 </body> </html>