• 第一个SSM完整项目开发心得


    博主因为打算要考研,所以为了给自己留一手后路。学习了SSM框架。这学期就做了一个完整的SSM项目。(如果考研失败就去外包做一波CRUD boy)

    所以边考研边利用业余时间做了一学期,接着期末一周的Web课设时间终于把这个项目1.0搞定了。

    下面就来谈一下开发完我开发完这个项目的心得:

    自己以前做项目就是方法,类什么的都放得比较乱,经过这次完整项目开发。了解了不仅前后端要分离,后端也要分类别类的存放,这样有利于后期的修改以及

    让人看起来神清气爽,至少这样做确实如果后期要修改之前的代码会方便很多。

    在后端:

     主要目录就是这几个

    首先谈谈Controller层:Controller是前后端对接的地方。接收前端请求,接收前端数据,

    转换格式后

    调用Service进行处理后,以Map<String,Object>格式返回

    dto层:我理解的是存放Service的返回类型,来存储Service从Mapper层中查询的内容

    这里可能会有点模糊的是,为什么不直接返回pojo的实体类

    原因是:拿添加来举例,如果添加则必定会有添加成功或者失败的情况。如果失败,那么会有一个失败原因

    所以必须把失败原因返回给Controller来处理,所以就创建一个dto类来放有关Service的返回类

    例如:

    package com.how2java.dto;
    
    import com.how2java.enums.OrderStateEnum;
    import com.how2java.pojo.Order;
    
    import java.util.List;
    
    public class OrderExecution {
        //结果状态
        private int state=0;
        //状态标识
        private String stateInfo;
        //订单数量
        private int count;
        //操作的Order-增查
        private List<Order> orderList;
        //添加时的Order
        private Order order;
    
        public Order getOrder() {
            return order;
        }
    
        public void setOrder(Order order) {
            this.order = order;
        }
    
        public int getState() {
            return state;
        }
    
        public void setState(int state) {
            this.state = state;
        }
    
        public String getStateInfo() {
            return stateInfo;
        }
    
        public void setStateInfo(String stateInfo) {
            this.stateInfo = stateInfo;
        }
    
        public int getCount() {
            return count;
        }
    
        public void setCount(int count) {
            this.count = count;
        }
    
        public List<Order> getOrderList() {
            return orderList;
        }
    
        public void setOrderList(List<Order> orderList) {
            this.orderList = orderList;
        }
    
        public OrderExecution() {
    
        }
    
        //店铺操作失败时候使用的构造器
        public OrderExecution(OrderStateEnum stateEnum) {
            this.state = stateEnum.getState();
            this.stateInfo = stateEnum.getStateInfo();
    
        }
    
        //店铺操作成功时候使用成功的构造器
        public OrderExecution(OrderStateEnum stateEnum, Order order) {
            this.state = stateEnum.getState();
            this.stateInfo = stateEnum.getStateInfo();
            this.order = order;
    
        }
    
        //店铺操作成功时候使用成功的构造器
        public OrderExecution(OrderStateEnum stateEnum, List<Order> orderList) {
            this.state = stateEnum.getState();
            this.stateInfo = stateEnum.getStateInfo();
            this.orderList = orderList;
        }
    
    }
    View Code

    还可以存放Controller的返回类  如若Controller只返回一种类型的数据  我们可以在dto中编写一个

    Result类同时存储返回状态值和返回数据

    还可以存放Controller里面图片处理类 用来专门封装名称和数据流  直接返回给Service处理

    其实后两种我认为归于后面的util工具类可能会更合理

    enums层:主要存储操作数据库最后的状态成功与否,和失败原因  来与dto的Excution层进行比对判断失败与否 获取失败原因

    package com.how2java.enums;
    
    public enum OrderStateEnum {
        SUCCESS(1, "操作成功"),
        INNER_ERROR(-1001, "操作失败"), EMPTY_LIST(-1002, "订单列表为空"),NULL_ORDER(-1003,"Order信息为空");
        private int state;
        private String stateInfo;
    
        public int getState() {
            return state;
        }
    
        public String getStateInfo() {
            return stateInfo;
        }
    
        private OrderStateEnum(int state, String stateInfo) {
            this.state = state;
            this.stateInfo = stateInfo;
        }
    
        /**
         * 依据传入的state返回相应的enum值;
         */
        public static OrderStateEnum stateOf(int state) {
            for (OrderStateEnum stateEnum :values()) {
                if (stateEnum.getState() == state) {
                    return stateEnum;
                }
            }
            return null;
        }
    }
    View Code

    exceptions层:

    主要是Service的超时错误  它的本质就是一个RuntimeException,用于操作超时抛出

    这么做的好处是如果超时,又涉及多个Service操作时,可以轻松找到是哪个地方超时

    package com.how2java.exceptions;
    
    public class OrderOperationException extends RuntimeException{
        public OrderOperationException(String msg){
            super(msg);
        }
    }
    View Code

    mapper层:

    则是SSM与数据库直接进行交互的地方  用Sql语句来操作数据库

    pojo层:

    项目要操作的实体类,里面存放各种实例类(属性以及set,get方法)

    service层:

    服务层由两部分构成一部分是服务接口,一部分则是服务的具体实现

    服务实现:则是将前台获取的信息就行具体处理:如文件存储和数据库存储

    则可以调用事物来进行处理

    并在调用mapper前进行简单的逻辑判断:检查是否有必要调用maaper层,如若存取数据非法,在Service

    即可直接进行处理并返回处理结果给Controller,如若数据合法,完成与数据库无关的操作后就可以调用mapper层来存储数据库了

    设计多步骤,我们要在Service的方法中添加@Transactional

    如若一步出错则执行回滚

    test层:

    此层为测试层,用来对写好的 mapper ,service,方法做单元测试

    package com.how2java;
    
    import org.junit.runner.RunWith;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class BaseTest {
    }
    然后直接继承BaseTest就可以了 不用再写junit配置


    最后就是util层
    这个主要是存放工具类
    工具类为各层反复调用的方法,则可以把它抽象出来 单独建类
    如:验证码校验,图片处理,前端提取Requset 传来的Json,根据其键值 获取值等



    SSM后端部分结构根据我的理解,就大概是这样。因为这个学期需要考研。还要准备毕业设计。

    这个学期新做的O2O商城项目可能没时间发布到服务器了(因为Linux的路径和Windows不同,项目路径还需要重新调试)可能没时间发布了

    在此也建议大家可以利用大一大二时间好好学习。泳有一定的开发经验。

    如果想走Java后端方向:

    可以按这个学习

    现学 Servelet  再刚SSM,做个SSM项目,后续可以看看深入理解Jvm,和高性能Mysql,netty等等

       

  • 相关阅读:
    Bamboo CI 使用的一些记录
    fork 与 branch、clone 的区别
    使用--ignore-scripts解决npm/yarn安装依赖失败问题
    gyp ERR! find VS gyp ERR! find VS msvs_version not set from command line or npm config gyp ERR! find
    sdk manager 打不开解决方法
    appium
    北京幼升小
    MySQL中limit的问题
    初始社保费管理客户端的单位编号
    flutter BackdropFilter的毛玻璃效果使用
  • 原文地址:https://www.cnblogs.com/Mr-BING/p/11134859.html
Copyright © 2020-2023  润新知