最近在学习Java的过程中接触到了SSM框架。这是学习Java过程中第一次接触到了那么多的XML文件。

刚开始学习的时候感到很迷茫,网上到处充满了各种如何配置的教程,按照教程的确能运行起来,不过心里总有一句“卧槽,这TM怎么运行起来的?”

我仍未明白这是干什么用的、看不懂、为什么要这么写、这么麻烦为什么不直接使用Servlet等各种问题。仿佛我刚开始学编程是碰到了“类”的概念一样,完全不明白。

 

经过一段时间的学习,有所“了解”,我将它写出来,给和我遇到一样情况的朋友。

 

 

注:

  1、我刚刚接触SSM,我基于我目前的理解写下这篇文章。

 

一、SSM框架是什么?

  SSM框架由三部分组成,分别是 Spring、Spring MVC 、 MyBatis。取各自的首字母组成。

  必须要使用这三个吗?是的,这是因为使用了这三个所以才叫SSM。

 

  Spring :

    Spring是一个开源框架。是一个轻量级的控制反转(IoC Inversionof Control)+ 面向切面(AOP)的容器框架。

    控制反转(IoC):

      解释:https://zh.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC

      打个比方:我是一家公司老板,现在需要找个人(对象)来擦窗,我必须一个人一个人的问“你会不会擦窗?”、“你怕不怕高?”等等问题,很是麻烦。  于是我请了一个秘书(Spring),我只需要告诉它“找个能擦窗的过来”就行了,她会在员工名单内进行查找(容器),让这个人过来擦窗,我不知道这个人是从哪里来的(对象的创建),也不知道干完了之后他会去哪里(对象的销毁)。如果找不到合适的人,秘书就会告诉我没有人能来干(抛出异常)。

    面向切面(AOP):

      解释:https://zh.wikipedia.org/wiki/%E9%9D%A2%E5%90%91%E4%BE%A7%E9%9D%A2%E7%9A%84%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1

      打个比方:每个方法是一个山楂,然后我可以使用任意顺序把它串起来,依次执行。那为啥不直接写在代码里?因为在运行时,AOP可以动态的将指定方法插入到目标方法的前、后、中(运行中)运行。

     总结:

      由它的功能可以看出,Spring在SSM框架中的主要作用使用来管理对象的,各种乱七八糟的对象都可以由Spring进行管理,我们需要什么是直接伸手要就行了。

 

  Spring MVC:

     Spring MVC提供了Web应用程序的MVC模块,将控制器、视图、模型分离(低耦合)

    MVC:

      解释:https://zh.wikipedia.org/wiki/MVC

      简单来说,M是模型(Model),V是视图(View),C是控制器(Controller)

    模型:

      模型是用来封装数据、处理数据。

    视图:

      显示模型中的数据给用户看。

    控制器:

      就像它的名字一样,获取用户请求、调用相应模型处理数据,传递数据给视图显示。

    总结:

      它是用来处理用户请求并给予响应。

  MyBatis:

    它是一个持久层框架,使用它可比JDBC方便多了。

 

 

二、Spring MVC处理流程

  有上面可以看到,Spring MVC是用来处理用户请求的,它是如果处理的有必要了解一下。

  

  1.当用户发起一个请求时,首先会到达DispatcherServlet,它和普通Servlet一样,一旦url匹配成功,请求就会进入该Servlet。

  2.进入DispatcherServlet之后,他会将请求发送给相应的控制器,但首先它要知道给哪一个控制器,所以它首先会在处理器映射中查询相应的控制器。

  3.现在,DispatcherServlet知道了它的目标,它将用户请求发送给控制器,控制器开始处理用户数据(如提交的表单等等),一般控制器不处理数据,它会将数据委托给服务对象(自己写的类)进行处理。

  4.控制器处理完成之后,一般会产生一些信息(用户查询的结果、用户是否注册成功),将这些信息封装起来就是模型(Model),仅仅有模型是不够的,用户一般需要一个视图(View)来显示这些信息,所以控制器会指定一个视图去显示信息,一般使用JSP,Freemarker。控制器会将数据信息以及视图名称进行打包,返回给DisoatcherServlet。

  5.DispathcerServlet拿到控制器返回的信息后,会将逻辑视图名称交给视图解析器,视图解析器将会使用这个名称查找真正的视图。

  6.既然已经知道了具体的视图,DispathcerServlet将会把模型交给视图,视图根据模型完成渲染,并将结果响应给用户,这样,用户就能就看到了。

 

三、编码

  结尾处有完整源码。

  打开Eclipse,创建一个Maven项目,如图。

  

  

  选择位置

  

 

  选择webapp

  

 

  填写信息

  Group Id 一般反过来写自己的域名

  Artifact id 一般填的项目名

  

 

  完成之后应该是这样的

  

   目前项目有错误,HttpServlet这个类没有找到,把Tomcat添加进来即可解决。

  

  点击菜单栏Window --> Preferences,打开Runtime Encironments,点击Add

  

  

  选择您的Tomcat版本,我选择的9.0

  

 

  选择Tomcat路径,Finish --》 Apply and close

  

 

  在项目名上右键 选择Build Path --> Configure Build Path,选择Librarie选项卡,点击右侧的Add Library

  

   

  选择图中这个

   

  

  选择刚刚添加的Tomcat,Finish

  

  完成后错误消失。

  

  

  修改pom.xml的<dependencies>

  

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.14.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>
    </dependencies>

  最后pom是这样的

    

    这样就添加完了SSM框架所需要的各种jar包。


    现在有了基本的环境,可以进行开发了。

    我们按照Spring MVC流程图进行开发。

    第一步,我们需要将DispatcherSerlver添加到servlet之中。打开web.xml

    添加以下代码

  <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.xml</param-value>
      </init-param>
  </servlet>
  
  <servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      <url-pattern>/</url-pattern>
  </servlet-mapping>

  如图

  

  init-param中配置了一个参数,这样该Servlet在初始化时候会读取 类路径下的一个叫spring.xml的配置文件,有了配置文件,它才能知道要做什么。

  

  配置spring.xml

  首先在创建一个Source Folder用来存放配置文件,我的Source Folder叫config,如图

  

  在里面新建一个文件,叫做spring.xml,此文件名称要和sevlet中的相同。

  填写以下内容

<?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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
        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-4.3.xsd">
    <!-- 开启注解 -->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!-- 组件扫描 -->
    <context:component-scan base-package="cn.abble.m2b2c.controller"></context:component-scan>
    
    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/" />
        <property name="suffix" value=".jsp" />
    </bean>
    
</beans>

  解释一下

   <mvc:annotation-driven>的作用是开启“注解类型的处理器映射”,这样可以使用注解来指定相应的控制器。

   

   <context:component-scan base-package="cn.abble.m2b2c.controller"></context:component-scan>  是让Spring去自动扫描该包下的组建,并创建出对象,放入spring的容器中。  

     

  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/" />
    <property name="suffix" value=".jsp" />
  </bean>

  这是配置了视图解析器,根据SpringMVC的流程,控制器将会返回视图的逻辑名称,通过视图解析器可以找到相应的视图。如控制器返回“hello”,那么视图就是/WEB-INF/hello.jsp    Spring将会自动创建出一个视图解析器的对象并放入容器中。

 

  

 

  spring.xml完成之后,开始写控制器。

  根据上面spring.xml的配置,我需要新建一个包叫cn.abble.m2b2c.controller。

  在此包中创建一个类,名称随意,这里叫做Hello

  代码如下:

  

package cn.abble.m2b2c.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class Hello {
    @GetMapping(value = {"/","/index"})
    public String index() {
        return "index";
    }
}

  解释:

    @Controller 表明该类是一个控制器类,由于该类在cn.abble.m2b2c.controller包中,根据spring.xml的配置,Spring将自动创建出该类的对象。

    通过使用@GetMapping(value = {"/","/index"}) 来映射请求,当请求为get,请求路径为/ 或者 /index时,调用该方法进处理。

    同理还有@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping

    返回值“index”表示返回一个逻辑视图名称为index的视图,根据spring.xml的配置,视图为/WEB-INF/index.jsp

 

  

  所以现在需要在/WEB-INF下创建一个index.jsp。内容随意。

  最后文件结构如图

  

 

  

  OK,就像普通jsp网站一样,运行即可。

  

 

 

  这就是一个基本的SSM框架的Web。当然目前还没有使用到MyBatis,因为并没有需要连接数据库的需求。


   

  使用MyBatis

  实现一个页面,用户输入相应的id,返回对应id的name

  创建一个数据库和表

  一个非常简单的表,表名为man,表结构及内容如下

  

  创建一个实体类,叫做Man,放在cn.abble.m2b2c.entity下

  代码如下

package cn.abble.m2b2c.entity;

public class Man {
    private int id;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
}

  

  创建一个jsp页面,放在/WEB-INF/下,叫做query.jsp

  代码如下:

  

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="utf-8" isELIgnored="false"%>
<!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>Insert title here</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/query" method="post">
        id:<input name="id"/>
        <input type="submit"/>
    </form>
    
    query user name is : ${name}
</body>
</html>

 

   修改pom.xml,添加mysql驱动和spring jdbc,用来连接数据库

  完整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>cn.abble</groupId>
    <artifactId>m2b2c</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>m2b2c Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.14.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.14.RELEASE</version>
        </dependency>


    </dependencies>
    <build>
        <finalName>m2b2c</finalName>
    </build>
</project>

  

  修改spring.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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
        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-4.3.xsd">
    <!-- 开启注解 -->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!-- 组件扫描 -->
    <context:component-scan base-package="cn.abble.m2b2c.controller"></context:component-scan>

    <!-- 配置视图解析器 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/wx?serverTimezone=UTC&amp;characterEncoding=utf-8" />
        <property name="username" value="root" />
        <property name="password" value="root" />
    </bean>
    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
          <property name="dataSource" ref="dataSource" />
    </bean>
    
    <!-- mapper扫描器 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="cn.abble.m2b2c.mapper"/>
    </bean>
</beans>

  需要你自行修改jdbc连接信息。

 

  新建包 cn.abble.m2b2c.mapper 创建一个类叫ManMapper(名称随意)

  代码如下:

  

package cn.abble.m2b2c.mapper;

import org.apache.ibatis.annotations.Select;

import cn.abble.m2b2c.entity.Man;

public interface ManMapper {
    @Select("select * from man where id=#{id}")
    Man query(int id);
}

  解释:

    在spring.xml中增加了一条mapper扫描器,会自动扫描指定包中的mapper,具体可以查看中文文档:http://www.mybatis.org/mybatis-3/zh/index.html

    每个mapper是一个接口,MyBatis会自动创建该接口的对象并放入Spring 容器中。

    @Select 时根据id去查找用户,并自动返回成一个Man对象,可以参考 http://www.mybatis.org/mybatis-3/zh/statement-builders.html

 

  创建一个控制器Query,放在cn.abble.m2b2c.controller

  代码如下:

    

package cn.abble.m2b2c.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import cn.abble.m2b2c.entity.Man;
import cn.abble.m2b2c.mapper.ManMapper;

@Controller
public class Query {
    @Autowired
    ManMapper mapper;
    
    @GetMapping("/query")
    public String q() {
        return "query";
    }
    
    @PostMapping("/query")
    public String quert(int id,Model model) {
        System.out.println(id);
        Man m = mapper.query(id);
        model.addAttribute("name", m.getName());
        return "query";
    }
}

  解释:

    @AutoWired  向Spring要一个ManMaper的实现类的对象,这个实现类有MyBatis自动产生并创建,比不需要用户关系,只要向Spring要就行了。

    query(int id,Model model)  id由Spring mvc自动传入,搜索“参数绑定”可以获取更多信息。Model是由Spring MVC传入的模型。

    Man m = mapper.query(id) 调用mapper对象根据ManMapper代码中@Select中的sql进行查询,并返回封装好的对象

    mode.addAttribute("name",m.getName()) 将用户名字放入模型中,在视图中可以使用name将用户名字取出 

    

  

  以上就是MyBatis的简单使用。

  全部代码 链接: https://pan.baidu.com/s/1drKpRo 密码: vg15

  


  以上就是SSM框架的简单使用。上面如果不懂的名词可以查一些百度,有很多博客有详细的解释。

  XML文件占了大部分,如果不喜欢XML,可以去学习Spring Boot!无需配置即可运行。

posted on 2018-02-27 01:13  Ant2288  阅读(420)  评论(0编辑  收藏  举报