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

博主由于打算要考研,因此为了给本身留一手后路。学习了SSM框架。这学期就作了一个完整的SSM项目。(若是考研失败就去外包作一波CRUD boy)前端

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

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

本身之前作项目就是方法,类什么的都放得比较乱,通过此次完整项目开发。了解了不只先后端要分离,后端也要分类别类的存放,这样有利于后期的修改以及sql

让人看起来神清气爽,至少这样作确实若是后期要修改以前的代码会方便不少。数据库

 

在后端:后端

 主要目录就是这几个服务器

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

转换格式后框架

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

 

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等等

相关文章
相关标签/搜索