SSM框架集

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>
相关文章
相关标签/搜索