为啥么说再战呢,因为我翻了翻以前的项目,上一个用springcloud做的项目时间还定格在2021年1月18号了,已经过去半年了。为啥这篇写了个(0)呢,因为这次的实例还是照着不良人21年springcloud教程做的,他在前10节里先是回顾了下springboot里面的相关知识,我在这里也迅速的跟了一遍,在(0)章里做个记录。

还是先写点题外话,刚才坐公交读到编程导航这个公众号里转了一篇关于凤凰架构的介绍性文章,细节还没看,但光看介绍内容,从一个架构师的角度去设计一个大型分布式系统,感觉很勇嘛,又要开新坑了,先star后看!为啥要说这个架构呢,因为SpringCloud也是基于SpringBoot的一整套实现微服务的框架,从单体服务时代到SOA再到微服务,我们现在就在这里(当然我觉得之后会是无服务的时代),综上微服务现在还是挺有市场的,要不人家也不出这40多小时的视频了(吧,不确定是否已经进入了后微服务时代哈哈哈😴 ),所以开SpringCloud标签再来重新跟一下这个教程。

1、首先就是建立springboot项目

这个没啥好说的,引好maven,设置好java版本,设置好编码,然后就开写吧,至于是建maven、springinitialzir都无所谓了,视频里是建了一个空项目然后建了好几个module把这两种都分别建了一遍吧。

2、然后就是springboot整合了mybatis和jsp

老生常谈了,不过这次没用mybatisplus 和 粘呢瑞特儿(英文不会拼),所以需要我们手写mapper.xml。实现的功能很简单,在jsp页面上增删改查,有些细节看注释吧,我贴出部分代码:

controller层:

package com.jin.controller;

import com.jin.entity.User;
import com.jin.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @author jinyunlong
 * @date 2021/6/21 14:22
 * @profession ICBC锅炉房保安
 */
@Controller
@RequestMapping(value = "user")
public class UserController {

    private static Logger logger = LoggerFactory.getLogger(UserController.class);

    @Autowired
    UserService userService;

    //添加用户
    @RequestMapping(value = "addUser")
//    @ResponseBody
//    public String addUser(@RequestBody User user){
    public String addUser(User user){
        userService.save(user);
//        return user.getId().toString();
        return "redirect:/user/findAll";
    }
    //查询所有
    @RequestMapping(value = "findAll")
    public String findAll(HttpServletRequest httpServletRequest, Model model){
        List<User> users = userService.findAll();
        //保存到作用域
        model.addAttribute("users",users);   //对应jsp中requestScope.users取值
        return "showAll";
    }

    //查询一个
    @RequestMapping(value = "findById")
    public String findById(@RequestParam Integer id,Model model){
        User users = userService.findById(id);
        //保存到作用域
        model.addAttribute("users",users);  //对应jsp中requestScope.users取值
        return "showOne";
    }
    //更新用户信息
    @RequestMapping(value = "updateUser")
    public String update(User user){
        userService.upadte(user);
        logger.debug("修改的用户信息:{}",user.toString());
        return "redirect:/user/findAll";
    }

    //根据id删除一个
    @RequestMapping(value = "delete")
    public String delete(@RequestParam Integer id){
        userService.delete(id);
        return "redirect:/user/findAll";
    }
}

dao和service就不写了,两个查询要返回实体内容,其余三个void即可,接口实现类中别忘了写注入容器的注解(//@Component //@Controller @Service @Repository这几个都一样,在不同类里用,对应controller、service、dao,config里好像还有个@Configuation),例:

@Service  //用来通知springboot 扫描当前该注解  作用:用来在工厂中创建对象  @Component <bean id="" class="com.jin.service.UserServiceImpl">

查询里的

//保存到作用域
        model.addAttribute("users",users);   //对应jsp中requestScope.users取值

要注意一下,要把返回的实体放到model中供jsp使用,用requestScope.users.xxx取值

两个关键jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" language="java" %>
<html>
<head>
    <title>用户列表</title>
</head>
<body>

<c:forEach items="${requestScope.users}" var="user">
    id:${user.id} name:${user.name} age:${user.age} salary:${user.salary}<a href="${pageContext.request.contextPath}/user/delete?id=${user.id}">删除</a> <a href="${pageContext.request.contextPath}/user/findById?id=${user.id}">修改</a> <br>
</c:forEach>
<a href="${pageContext.request.contextPath}/user/findAll">查询全部</a>
<a href="${pageContext.request.contextPath}/save.jsp">添加</a>
</body>
</html>

这里要用c标签别忘了在maven中引入jstl嗷

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" language="java" %>
<html>
<head>
    <title>修改用户信息</title>
</head>
<body>

<form action="${pageContext.request.contextPath}/user/updateUser" method="post">
    Id :<input type="text" name ="id" readonly value="${requestScope.users.id}"><br>
    姓名:<input type="text" name="name" value="${requestScope.users.name}"><br>
    年龄:<input type="text" name="age" value="${requestScope.users.age}"><br>
    薪水:<input type="text" name="salary" value="${requestScope.users.salary}"><br>
    <input type="submit" value="修改用户信息"><br>
</form>


</body>
</html>

实体类、sql语句、配置文件不贴了,没啥内容,配置文件别忘了配置jsp视图解析器

增删改查的语句,很简单,注意下有固定写法才能有返回主键值(虽然是void但是也有返回)

<?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="com.jin.dao.UserDao">
    <!--namespace根据自己需要创建的的mapper的路径和名称填写-->
    <!--findAll-->
    <select id="findAll" resultType="User">
        select * from t_user
    </select>

    <!--save 采用数据库自动生成(useGeneratedKeys="true")并返回主键的值(keyProperty保存主键的属性名)-->
    <insert id="save" parameterType="User" useGeneratedKeys="true" keyProperty="id">
        insert into t_user values(#{id},#{name},#{age},#{salary})
    </insert>

    <!--findById-->
    <select id="findById" parameterType="Integer" resultType="User">
        select * from t_user where id = #{id}
    </select>

    <!--update-->
    <update id="update" parameterType="User">
        update t_user set name = #{name},age = #{age},salary = #{salary} where id = #{id}
    </update>

    <!--delete-->
    <delete id="delete" parameterType="User">
        delete from t_user where id = #{id}
    </delete>
</mapper>

启动类别忘了@MapperScan dao的package

还有一点在测试类里,有关继承,可以关注下。

3、关于日志log4j

关于日志我一直秉承能用就行、得过且过的理念,而且很奇怪,log4j中没有LoggerFactory.getLogger(),还得引slf4j的,还得强转,不明白,最后用来用去,最后引入的还是这俩东西啊。。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

直接贴笔记了,不纠结,日志能用就行,测试开debug,生产开info - -

1.PNG

配置文件中配置:

#开启日志 日志级别: off>error>warn>info>debug>all
logging.level.com.jin.dao=debug
logging.level.com.jin.controller=debug
4、关于restful

restful足可以单列出一篇文章来说,可以参照以下几篇文章:1文偏rest和restful的概念,2文偏代码实例,3文偏restful风格的特点

1、REST服务与RestfulAPI风格

2、SpringBoot Web开发——构建Restful风格接口

3、RESTful 架构风格概述

在Restful之前的操作:
http://127.0.0.1/user/query/1 GET  根据用户id查询用户数据
http://127.0.0.1/user/save POST 新增用户
http://127.0.0.1/user/update POST 修改用户信息
http://127.0.0.1/user/delete GET/POST 删除用户信息

RESTful用法:
http://127.0.0.1/user/1 GET  根据用户id查询用户数据
http://127.0.0.1/user  POST 新增用户
http://127.0.0.1/user  PUT 修改用户信息
http://127.0.0.1/user  DELETE 删除用户信息

简单理解:以前:根据接口名决定curd操作;restful:根据http的动作决定curd操作

restful简单就简单在了统一接口(同一接口名通过不同的http动作对应要进行的curd增删改查方法,更加倾向于面向业务编程😂 )和可以直接通过服务端url直接返回资源了(可以这么理解),随便通过url暴露接口,挺方便。。其他特性优点看上面文章3

好早以前和同事聊时写过一个例子,现在也忘了,先贴出来吧:

package com.jin.restful.controller;

import com.jin.restful.entity.Result;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author jinyunlong
 * @date 2021/4/30 13:29
 * @profession ICBC锅炉房保安
 */
@RestController
public class Controller {

//    @RequestMapping("/interface")
//    public String kkk(@RequestBody Result result) {
//        return result.toString();
//    }
    @RequestMapping(value = "/interface",method = RequestMethod.POST)
    public String post(@RequestBody Result result) {
//        return result.toString();
        return "123";
    }
//    @RequestMapping(value = "/interface",method = RequestMethod.GET)
//    public String get(@RequestBody Result result) {
////        return result.toString();
//        return "321";
//    }
//    @RequestMapping(value = "/123",method = RequestMethod.PUT)
//    public String put(@RequestBody Result result) {
////        return result.toString();
//        return "456";
//    }
//    @RequestMapping(value = "/interface",method = RequestMethod.DELETE)
//    public String delete(@RequestBody Result result) {
////        return result.toString();
//        return "654";
//    }
}

这里写是麻烦了,直接@GETMapping、@DELETEMapping、@POSTMapping、@PUTMapping也行

这段代码还有一个404和405的问题,访问不到接口就404,http动作不对应就405,应该是404优先级高于405,毕竟你接口地址都访问不到,谁还管你用什么方式请求

3.PNG

5、关于jsonview和easycode

EasyCode是idea的一款插件,能直接对数据的表生成entity,controller,service,dao,mapper,比较好用,但我没用过😷

jsonview是谷歌浏览器的插件,json格式优化的,需要科学上网装,我没装也没用 - -😷 ,一般直接用ue32来格式化数据信息了

6、maven项目的聚合开发

可以以业务项目作为模块划分,也可以以功能点作为模块划分,归结起来最后要达到模块间互相依赖调用的效果。

2.PNG

后面还有springboot整合redis,但是在视频列表里好像没找见,所以复习的内容就这么多,下面就要准备写一个springcloud项目了。

是不是特别混乱,说实话我自己总结完自己都不愿意看第二遍😅


标题:再战SpringCloud(0)
作者:jyl
地址:http://jinyunlong.xyz/articles/2021/06/21/1624291175170.html