天天看点

ssm框架整合_Idea整合Restful风格的SSM框架(二)

点击上方 "程序员小乐" ,关注公众号

8点20分,第一时间与你相约

每日英文 

Everyone can be better and better if he has a dream and tries his best to realize the dream. 

每一个人都会越来越好,只要他拥有一个梦想并为此不断地努力。

小乐有话说 

永远不要怪别人不帮你,也永远别怪他人不关心你。活在世上,我们都是独立的个体,痛苦难受都得自己承受。

来自:你想要怎样的未来,链接:jianshu.com/p/a8079da022a0

ssm框架整合_Idea整合Restful风格的SSM框架(二)

封面来自网络

 01 前言 

在这里的就不多啰嗦什么了,先来大概介绍一下项目的体系结构等。还是上张图

ssm框架整合_Idea整合Restful风格的SSM框架(二)

项目结构.png

整体架构是ssm的前面已经说过了,下面来说一下代码的架构。因为目前项目的规划还比较小,所以在com.bgy.ssm包下面就直接建了controller、service等。如果项目情况较复杂的话,在此包应该根据功能模块来进行分包,然后再建立相应的三层,这样的话结构更清晰。

在这里有个争论:关于到底要不要repo层的问题

  • 有人赞成的是直接controller中接收用户请求,调用service处理业务逻辑,然后所有的组装数据也是在service中完成,最后service直接调用dao接口。
  • 另外有人赞成的是service中只处理业务逻辑;对于数据的组装,如操作多表时要调用dao层的多个接口时,应该在repo层中完成,这样不会使service层显得太过臃肿,并且能提高可复用性和符合设计原则中  “针对接口编程,不针对实现编程”的理念。
  • 在这里我个人的话更倾向于后者,service层更注重的应该是处理业务逻辑,不能因为实现某个功能而在service中一个方法写一堆组装数据的代码。当然这是我个人的愚见,若有高见,欢迎指正。

在这里这个项目较小,也是从新手角度出发,所以我违心的使用了controller、service、dao的三层架构。这样思路较简单和清晰。

另外说明一点,下面的代码中都有相关引用,使用时自行引入相关引用

02 数据库 

这里为了演示功能和架构,我就只使用一张表来实现操作。在这里,我建议在项目下建立sql文件夹,里面放置建表的语句,方便以后查阅和修改。

ssm框架整合_Idea整合Restful风格的SSM框架(二)

ql.png

上面是建表语句文件、下面是有些表需要进行初始化的初始化语句文件。

db_ddl.sql

这里没有写备注和null这些的规范,需要的可自行添加。

(后续添加:在这里的表名和字段名在下一篇文章中进行了修改,原因可翻看下一篇文章)

03 实体类 

在这里为了简便、我就建表完成后直接建立实体类User。

User.java

这个地方没什么特别的,对于id是直接用genarateID()方法通过uuid生成的,若需要自己设计主键生成策略的可忽略这个。

04 Controller 

先上代码

controller这里首先用@Controller标记这个类成为一个SpringMVC Controller对象。

因为是使用的是restful风格,所以在类前面就通过@RequestMapping("/user")注解指定此类的所有请求方法的父路径为/user,类中第一个方法是添加用户,所以路径为空,由restful风格指定的HTTP请求方式选择进入不同方法;然后直接以json字符串来交互。另外一个通过用户名获取用户的方法,把用户名带在参数上,所以value中写了value = "{userName}",然后用@PathVariable String userName接收参数。这个只是一个测试方法,暂时无用。第三个方法是登录,也是以json字符串来交互。

另外就是使用@Autowired把service注入进来了

在这里所有的方法统一用字符串返回。

(另外,这里前后端以JSON字符串交互的方式有待商榷,以前认知是用JSON字符串便于统一风格;不过最近一年以来的学习和工作,现在会直接使用实体类进行接收对象,免去JSON转对象的步骤。)

05 Service 

service层主要处理业务逻辑,首先使用@Service标注这个类是业务层组件,然后也是用@Autowired注解注入Dao

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    private JSONObject json = new JSONObject();

    @Transactional
    public String addUser(String userJson) throws Exception {
        ResponseResult result = new ResponseResult();
        User user = json.parseObject(userJson, User.class);
        if (userDao.countCommon(user) > 0) {
            result.setCode("400");
            result.setMsg("用户已存在");
            return json.toJSONString(result);
        }
        user.genarateID();//设置UUID
        int num = userDao.addUser(user);
        int numScore = userDao.addDefaultIntegral(user.getId());//注册用户送默认积分
        if (num > 0 && numScore >0) {
            result.setCode("200");
            result.setMsg("添加成功");
            result.setData(user);
        } else {
            result.setCode("400");
            result.setMsg("添加失败");
        }
        return json.toJSONString(result);
    }

    public String getUserByName(String userName) throws Exception {
        ResponseResult result = new ResponseResult();
        List list = userDao.getUserList(userName);
        result.setCode("200");
        result.setMsg("Ok");
        result.setData(list);return json.toJSONString(result);
    }
    public String login(String userJson) throws Exception {
        ResponseResult result = new ResponseResult();
        User user = json.parseObject(userJson, User.class);if ("".equals(user.getUserName()) || "".equals(user.getPassword())) {
            result.setCode("400");
            result.setMsg("用户名或密码不能为空");return json.toJSONString(result);
        }List list = userDao.getUserList(user.getUserName());if (list.size() == 0) {
            result.setCode("400");
            result.setMsg("用户不存在");
        } else {if (!user.getPassword().equals(list.get(0).getPassword())) {
                result.setCode("400");
                result.setMsg("密码错误");
            }else {
                result.setCode("200");
                result.setMsg("登录成功");
            }
        }return json.toJSONString(result);
    }
}
           

在这里自己定义了一个ResponseResult类来作为所有的返回请求的格式。

这样以统一的code,msg和data作为返回格式,前端也方便处理。根据逻辑设定好这个类后直接转成json字符串返回即可。

06 Dao 

dao这里实现非常简单,就是一个接口,没有另外去写接口的实现,很多系统是另外写了实现类的,可以对数据库查询的数据再次进行处理后返回。

这里我是通过自定义的MybatisSqlMapping注解,让有这个注解的interface被Mybatis扫描并生成Mapper对象,然后与sql-mapping文件夹下面的*.xml对应。

首先还是使用@Repository标注这个类为数据访问组件。

然后添加了自定义的@MybatisSqlMapping注解,使这个类能被扫描。

07 *.xml 

user.xml

这是mybatis中sql的映射文件。命名空间namespace即为UserDao接口。

然后下面sql的id即为UserDao接口中的方法名,这样即可实现mybatis的sql映射。

08 上面提到的MybatisSqlMapping注解 

09 上面提到的ControllerAspect类的切面,用于实现捕获异常等 

这里面用到了@Aspect注解,@Around环绕通知,proceed()执行方法等,有兴趣的可自行去了解AOP的相关知识。

整个框架的基础代码已经写完,并且实现了添加用户,根据用户名获取用户、和用户登录的三个简单功能的接口。当然里面的很多逻辑和细节没有处理,这里只是作为一个演示。

跑一下看看。

添加用户

ssm框架整合_Idea整合Restful风格的SSM框架(二)

addUser.png

ssm框架整合_Idea整合Restful风格的SSM框架(二)

db1.png

根据用户名获取用户

ssm框架整合_Idea整合Restful风格的SSM框架(二)

getUser.png

登录

ssm框架整合_Idea整合Restful风格的SSM框架(二)

login1.png

ssm框架整合_Idea整合Restful风格的SSM框架(二)

login2.png

到此,整个框架的搭建和一些基础代码的实现和测试都已完成,当然其中还有很多很多细节问题,也没有去处理这些细节问题。不过作为一个框架的搭建学习和对SSM的初步认识还是足够了,毕竟是从新手的角度出发。

文章大概讲述了idea的配置,idea中项目的建立,框架的搭建,和功能代码的编写。各个步骤都还是比较详细,认真一边阅读和一边写代码的同学应该是可以运行的。

编者水平有限,若有错误或者更优的建议欢迎指出。

热文推荐 Idea整合Restful风格的SSM框架(一)主宰这个世界的10大算法 推 荐阅读

阿里、腾讯、百度、华为、京东最新面试题汇集

计算机算法基础总结为什么每个程序员都需要学习算法?

两年JAVA程序员的面试总结

ssm框架整合_Idea整合Restful风格的SSM框架(二)
这里有你需要的编程技术、心得、经验(数据结构与算法、源码分析等),这里不止限于技术!还有职场心得、生活感悟、以及面经等。关注公众号,第一时间送达!

继续阅读