欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

第一个SSM项目

程序员文章站 2022-03-26 16:03:20
第一个SSM项目一、创建基于Maven的Web工程1.使用IDEA工具创建Maven工程2.创建好之后项目工程的显示二、修改项目的pom.xml文件1.增加打包方式,web工程的打包方式为war。2.统一版本号,在项目中需要用到很多依赖,需要同一版本号。3.添加依赖4.添加tomcat插件三、创建实体类,pojo包四、创建持久化层,mapper包1.java代码五、创建业务层,service包1.service接口2.Service接口的实现类六、Controller包生成一个适合你的列表创建一个表格设定内...

一、创建基于Maven的Web工程

1.使用IDEA工具创建Maven工程

第一个SSM项目
第一个SSM项目
第一个SSM项目

2.项目工程目录

创建好之后有java和resource文件夹,webapp目录在第三步创建。
第一个SSM项目

3.建立webapp文件夹

web项目需要webapp文件夹,文件夹上有蓝色的点点,如果没有可能是打包方式没有写。
第一个SSM项目
web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
</web-app>

二、修改项目的pom.xml文件

1.增加打包方式,web工程的打包方式为war。

<packaging>war</packaging>

2.统一版本号

在项目中需要用到很多依赖,需要同一版本号。

<!--统一版本号-->
    <properties>
        <spring.version>5.0.5.RELEASE</spring.version>
        <servlet.version>3.0.1</servlet.version>
        <jstl.version>1.2</jstl.version>
        <jackson.version>2.9.7</jackson.version>
        <mysql.version>5.1.48</mysql.version>
        <mybatis.version>3.4.1</mybatis.version>
        <druid.version>1.1.16</druid.version>
        <mybatis-spring.version>1.3.1</mybatis-spring.version>
        <pagehelper.version>5.1.6</pagehelper.version>
        <junit.version>4.12</junit.version>
        <slf4j-log4j.version>1.7.25</slf4j-log4j.version>
    </properties>

3.添加依赖

<dependencies>
        <!-- 1. web层的依赖 -->
        <!-- Spring webmvc依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--  Servlet依赖 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${servlet.version}</version>
            <scope>provided</scope>
        </dependency>
        <!-- jstl标签库 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>${jstl.version}</version>
        </dependency>
        <!-- 引入jackson依赖 -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>

        <!-- 2. 持久层的依赖 -->
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
            <scope>runtime</scope>
        </dependency>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <!-- Druid连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!-- myBatis整合Spring的依赖 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>${mybatis-spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- PageHelper分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>${pagehelper.version}</version>
        </dependency>
        <!-- 3. 测试依赖 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
            <scope>test</scope>
        </dependency>
        <!-- 4. 日志依赖 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j-log4j.version}</version>
        </dependency>
    </dependencies>

4.添加tomcat插件

<build>
        <plugins>
            <!-- tomcat7的maven插件 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <!-- 项目访问路径 -->
                    <path>/ssm</path>
                    <port>8081</port>
                </configuration>
            </plugin>
        </plugins>
    </build>

三、创建实体类,pojo包

类的包名举例为cn.igeek.pojo,创建的实体类为Student。
第一个SSM项目

数据库表如下:
第一个SSM项目
对应的实体类代码,声明类型用包装类型:

public class Student {
    private Integer id;
    private String sname;
    private String nickname;
    private String sex;
    private Double score;

    public Student() {
    }

    public Student(String sname, String nickname, String sex, Double score) {
        this.sname = sname;
        this.nickname = nickname;
        this.sex = sex;
        this.score = score;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Double getScore() {
        return score;
    }

    public void setScore(Double score) {
        this.score = score;
    }
}

四、创建持久化层,mapper包

这个层实现与数据库交互,从数据库中获取数据

1.applicationContext.xml和db.properties

在resources文件夹下建立,和数据库建立连接。
第一个SSM项目

代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">
    <!-- 加载db.properties文件 -->
    <context:property-placeholder location="classpath:db.properties"/>
    <!--  配置阿里的Druid数据源 -->
    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
</beans>

db.properties代码

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/igeek
jdbc.username=root
jdbc.password=123456

2.java代码

第一个SSM项目

StudentMapper.java代码,注意是接口类型!!
这里先只展示全查询代码,后面还有增删改代码,先把流程过一遍。

public interface StudentMapper {
    //全查询
    List<Student> selectAll();
}

3.创建映射文件

在resources建立mapper文件夹,在mapper文件夹下创建StudentMapper.xml文件
第一个SSM项目
代码如下:

<?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="cn.igeek.mapper.StudentMapper">
    <select id="selectAll" resultType="cn.igeek.pojo.Student">
      select * from student
    </select>
</mapper>

4.配置文件

①在resources下创建mybatis-config.xml文件,代码如下:

<?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:定义多个类型别名 -->
    <typeAliases>
        <!-- 用typeAlias为某个类型设置别名,type:该类型的全限定类名 alias:别名 -->
        <!--  <typeAlias type="cn.igeek.mybatis.pojo.Employee" alias="emp"></typeAlias>-->
        <!-- package:为某个包下所有类设置别名, 默认别名就是类名(不区分大小写)-->
        <package name="cn.igeek.pojo"/>
    </typeAliases>
</configuration>

②在第一步创建的application.xml下配置

<bean class="org.mybatis.spring.SqlSessionFactoryBean">
    <!--  注入数据源 -->
    <property name="dataSource" ref="druidDataSource"/>
    <!-- 指定myBatis主配置文件的位置 -->
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <!-- 指定Mapper.xml的位置 -->
    <property name="mapperLocations">
        <array>
           <value>classpath:mapper/StudentMapper.xml</value>
        </array>
    </property>
</bean>
<!--  配置Mapper接口扫描器,用来扫描指定包下所有的Mapper接口,产生接口对应的实现类代理对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
     <property name="basePackage" value="cn.igeek.mapper" />
</bean>

五、创建业务层,service包

第一个SSM项目

1.service接口

StudentService.java 接口类型
全查询使用PageHelper插件。

public interface StudentService {
    //查询所有学生
    PageInfo<Student> queryByPage(int pageNum,int pageSize);
}

2.Service接口的实现类

StudentServiceImp.java

@Service
public class StudentServiceImpl implements StudentService {
    //日志记录器
    private Logger logger = LoggerFactory.getLogger(StudentServiceImpl.class);
    @Autowired
    private StudentMapper studentMapper;
    @Override
    public PageInfo<Student> queryByPage(int pageNum, int pageSize) {
        //开启分页插件
        PageHelper.startPage(pageNum,pageSize);
        //调用全查询方法
        List<Student> students = studentMapper.selectAll();
        PageInfo<Student> pageInfo = new PageInfo<>(students);
        return pageInfo;
    }
}

3.配置文件

在application.xml配置组件扫描

<!--  开启组件扫描,base-package属性是告诉spring扫描的基本包,spring会扫描此包及其子包下的所有类-->
<context:component-scan base-package="cn.igeek.service"></context:component-scan>

六、Web层,Controller包

第一个SSM项目

1.配置视图解析器

<!-- 视图解析器,视图完整url: prefix+逻辑名称viewName+suffix  -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <!-- url的前缀 -->
    <property name="prefix" value="/WEB-INF/pages/" />
    <!-- url的后缀 -->
    <property name="suffix" value=".jsp" />
</bean>

2.java代码

处理jsp页面向客户端发送的请求

@Controller
public class StudentController {
    @Autowired
    private StudentService studentService;

    @GetMapping("/stu/list")
    public String list(@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
                       @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize, Model model){
        PageInfo<Student> pageInfo = studentService.queryByPage(pageNum, pageSize);
        //存储数据
        model.addAttribute("pb", pageInfo);
        return "list";
    }
}

3.配置文件springmvc-servlet.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/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">
    <!--  组件扫描,扫描后端控制器 -->
    <context:component-scan base-package="cn.igeek.controller"/>
    <!--  注解驱动 -->
    <mvc:annotation-driven />
</beans>

七、配置统一异常处理器

第一个SSM项目

jsp页面出错误时,会跳转到的页面。

@ControllerAdvice
public class GlobalExceptionHandler {
    /**
     * @return
     * @ExceptionHandler: 标注在方法上, 当后端控制器的方法执行时产生了异常, 就会调用被它标注的方法
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Map<String, Object> error(Exception ex) {
        Map<String, Object> map = new HashMap<>();
        map.put("code", 5000);
        map.put("msg", ex.getMessage());
        return map;
    }
}

八、监听器配置

主要用来存放项目根路径,减少jsp页面代码
第一个SSM项目

@WebListener
public class AppListener  implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
          //存储工程根路径
        ServletContext servletContext = sce.getServletContext();
        servletContext.setAttribute("ctx", servletContext.getContextPath());
    }
    
    @Override
    public void contextDestroyed(ServletContextEvent sce) {

    }
}

九、编写jsp页面

index.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
  <script>
      window.location.href="${ctx}/stu/list.do";
  </script>
</body>
</html>

list.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
    <link href="${ctx}/css/bootstrap.min.css" type="text/css" rel="stylesheet"/>
    <script src="${ctx}/js/jquery.min.js"></script>
    <style>
        ul {
            list-style-type: none;
        }

        li {
            float: left;
            margin-right: 10px;
            padding: 8px;
        }

        /* 选中的元素的样式*/
        .selected {
            background-color: red;
            color: #ffffff;
            padding: 8px;
        }
    </style>
</head>
<body>
<!-- 跳转到添加页面 -->
<a href="${ctx}/stu/toAdd.do">添加新员工</a>
<div style="width: 80%;">
    <table class="table table-hover">
        <thead>
        <tr>
            <th>学号</th>
            <th>姓名</th>
            <th>昵称</th>
            <th>性别</th>
            <th>成绩</th>
        </tr>
        </thead>

        <tbody>
        <c:forEach var="s" items="${pb.list}">
            <tr id="${s.id}">
                <td>${s.id}</td>
                <td>${s.sname}</td>
                <td>${s.nickname}</td>
                <td>${s.sex}</td>
                <td>${s.score}</td>
            </tr>
        </c:forEach>
        </tbody>
    </table>
</div>
<ul>
    <c:forEach var="num" items="${pb.navigatepageNums}">
        <c:choose>
            <c:when test="${pb.pageNum eq num}">
                <li class="selected">${num}</li>
            </c:when>
            <c:otherwise>
                <li><a href="${ctx}/stu/list.do?pageNum=${num}">${num}</a></li>
            </c:otherwise>
        </c:choose>

    </c:forEach>
</ul>
-----共${pb.pages}页,每页${pb.pageSize}条

<script>
    //给超链接添加单击事件
    $('.alert-danger').click(
        function () {
            let path = "${ctx}/stu/" + this.title + ".do";
            //要删除的行
            let tr = $("tr#" + this.title);
            console.log(tr);
            $.ajax({
                type: 'DELETE',
                url: path,
                dataType: "text", //返回普通字符串
                success: function (result) {
                    //alert("success");
                    //删除指定的行
                    tr.remove();
                    //删除后判断当前数据行的数量,如果数量是0,跳转到上一页
                    if ($("tbody>tr").size() == 0) {
                        window.location.href = "${ctx}/stu/list.do?pageNum=${pb.pageNum-1}";
                    }
                }
            })
        }
    );
</script>
</body>
</html>

本文地址:https://blog.csdn.net/qq_44249433/article/details/112201583

相关标签: ssm