ssm框架入门(简单原理+demo)

文章说明

文章源码只截取部分,完整源码(ssm-demo)请访问:
GitHub:https://github.com/superkarx/ssm-demo
在本人的csdn账号资源中也有上传ssm-demo.zip
此文章的图片来源于网络

知识储备(仅此项目用到)

  • 三层架构:
    在这里插入图片描述
  • ssm:springmvc(表示层) + spring(业务层) + mybatis(持久层)
  • springmvc:(mvc思想:模型、视图、控制器)
    在这里插入图片描述
  • spring:控制反转(这里用到bean管理,自动注入等)
    在这里插入图片描述
  • mybatis:预编译sql语句的接口映射(mapper)

项目结构

  • 整体结构
    在这里插入图片描述
  • 类目录
    在这里插入图片描述

配置文件(给出部分代码)

  • pom.xml:maven管理
    ①springframework的各种依赖(包含web和web-mvc)
    ②servlet-api:拥有此包可以用servlet
    ③mybatis
    ④mybatis-spring:sm整合所用
    …略
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <org.springframework.version>4.3.19.RELEASE</org.springframework.version>
    <commons-logging.version>1.2</commons-logging.version>
    <junit.version>4.12</junit.version>
</properties>

<dependencies>
    <!-- Spring核心依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <!-- Spring beans包-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <!-- Spring 容器包 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <!-- Spring容器依赖包,将第三方库整合进Spring应用上下文,提供支持 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <!-- Spring aop依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <!-- Spring aspects依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <!-- aspectj依赖 -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.9.4</version>
    </dependency>
    <!-- commons-logging依赖 -->
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>${commons-logging.version}</version>
    </dependency>
    <!-- Spring jdbc依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <!--Spring事物依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <!-- Spring web依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <!--Spring webmvc依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <!-- Spring test依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.24</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.5</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.21</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
  • web.xml:(web项目的总配置文件)
    ①串联spring-config.xml
    ②创建DispatcherServlet类(springmvc的核心)到请求路径,并用springmvc-servlet.xml配置此类。
    ③初始界面
<web-app>
    <display-name>Archetype Created Web Application</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-config.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <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:springmvc-servlet.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
        <!--只要请求,不要/index.jsp这种-->
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>
  • spring-config.xml:(以下交给spring管理)
    ①进行bean管理(自动注入等)
    ②用数据库配置文件jdbc.properties配置数据源
    ③用mybatis-config.xml和②中的数据源配置一个mybatis会话对象,并且指定映射接口(mapper或者dao等)
<!--在所设置的包下将所有的接口生成动态代理实现类,并由spring容器管理-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.xin.dao"/>
</bean>

<!--扫描组件-->
<context:component-scan base-package="com.xin">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>


<!--引入资源文件-->
<context:property-placeholder location="classpath:jdbc-config.properties"/>
<!--数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>


<!--声明事务管理器-->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
<!--开启事务注解驱动-->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>


<!--管理mybatis操作数据库的会话对象-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
    <!--核心配置文件路径-->
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <!--映射文件路径-->
    <property name="mapperLocations" value="classpath*:com/xin/dao/*Dao.java"/>
    <!--数据源-->
    <property name="dataSource" ref="dataSource"/>
</bean>
  • springmvc-servlet.xml:(springmvc的配置文件)
    ①扫描Controller控制器(mvc中c的作用,相当于servlet的作用)
    ②配置视图解析器(将控制器返回的视图解析为跳转的界面路径)
    ③映射器和适配器(一行代码封装)
<!--扫描controller组件,pojo作为控制层类(单例)-->
<context:component-scan base-package="com.xin.controller"  use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--
    配置视图解析器:前缀+视图名(return的String)+后缀 = 要跳转的页面
-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--前缀和后缀-->
    <property name="prefix" value="/WEB-INF/view/"/>
    <property name="suffix" value=".jsp"/>
</bean>

<!--映射器和适配器-->
<mvc:annotation-driven/>
  • mybatis-config.xml
    ①设置驼峰命名下划线命名的互转支持
    ②不能为null
<configuration>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <setting name="jdbcTypeForNull" value="NULL"/>
    </settings>
</configuration>
  • jdbc.properties(数据库配置)

注意:此配置运用druid的属性命名规范,请根据自身情况配置!

jdbc.driver = com.mysql.jdbc.Driver
jdbc.username = root
jdbc.password = root
jdbc.url = jdbc:mysql://localhost:3306/*?serverTimezone=UTC

类讲解

  • UserDao(接口)
    @Mapper有两个作用:
定位具体作用
映射类被spring-config.xml配置文件指定为sql语句映射类,将预编译sql语句映射为接口中的方法
bean类自动被扫描为bean对象交给Ioc容器管理(方便自动注入)
@Mapper
public interface UserDao {

    @Select("select * from user where id = #{id} and password = #{password}")
    User getUserByIdAndPassword(@Param("id") int id, @Param("password") String password);

}
  • UserServiceUserServiceImpl
    业务层的类,根据业务需要对dao层的sql映射进行一层封装。
    @Service注解会被spring扫描成Ioc中的bean
    @Autowired注解根据类型,在Ioc容器中找到UserDao这个类型的bean对象进行自动装配。
public interface UserService {
    User login(int id, String password);
}
@Service
public class UserServiceImpl implements UserService {


    private final UserDao userDao;

    @Autowired
    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }


    @Override
    public User login(int id, String password) {
        return userDao.getUserByIdAndPassword(id,password);
    }
}
  • UserController
    @Controller的两层含义
功能定位具体功能
mvc的控制层c处理请求,解析为视图,交给视图解析器解析为页面
service的上层对service层进行进一步的封装

注意:扫描bean的时候,springmvc配置文件和spring配置文件根据自身的需要都会扫描@Controller,所以可以在spring配置文件中加上过滤器,不扫描它。

@RequestMapping
注册接受请求的方法,相当于在web.xml中配置servlet和servlet-mapping标签,会接受处理相应名称的请求

登录验证逻辑:把session域中的key为id和password的属性拿到后调用service层的login方法去取数据库中相应的用户数据,return的结果(字符串)即“视图”,会自动交给视图解析器去解析为页面(前缀+return+后缀)。

@Controller
public class UserController {

    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @RequestMapping(value = "login",params = {"id","password"})
    public String login(HttpServletResponse response, HttpServletRequest request){
        User user = userService.login(Integer.parseInt(request.getParameter("id")),request.getParameter("password"));
        if(user!=null){
            request.getSession().setAttribute("user",user);//存User
            return "success";
        }else {
            return "";//回到首页
        }
    }
}

页面

  • index.jsp
    登录界面,提交form表单后会发送/login请求,参数为id和password,交给controller层的类去处理。
<%@page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<form  method="post" action="/login">
    <p>  账号:<input name="id" type="text">  </p>
    <p>  密码:<input name="password" type="password">  </p>
    <p>
        <input type="submit" name="Button" value="提交"/>
        <input type="reset" name="Reset" value="重填">
    </p>
</form>
</body>
</html>
  • success.jsp
    简单输出登录后取到后放在session域中的用户数据。
<html>
<head>
    <title>success</title>
</head>
<body>
    <h1>User-Inf</h1>
    <p>
        <%=session.getAttribute("user").toString()%>
    </p>
</body>
</html>

数据库

  • 可视化设计
    在这里插入图片描述
  • 数据库脚本
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `id` int NOT NULL AUTO_INCREMENT,
  `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10001 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('admin', 10000, '15815179079@163.com', '10000');

SET FOREIGN_KEY_CHECKS = 1;

  • pojo(模型)
public class User {
    private Integer id;
    private String name;
    private String email;

    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 getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                '}';
    }

    public User(Integer id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    public User() {
    }
}

环境配置

  • jdk:1.8以上
  • Tomcat:7.0(版本不宜过高,不然会产生servlet-api的jar包冲突)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值