Spring boot +tymeleaf 小案例总结

Spring boot +tymeleaf 小案例总结

首先在spring 官网上 https://start.spring.io/ 上生成一个程序包,注意依赖选择
在这里插入图片描述
解压出程序,用idea 工具打开
这里我们对客户信息进行增删改查
在mysql中新建一个customer表

create table customer(
		   id varchar(40) primary key,
		   name varchar(20),
		   gender varchar(10),
		   birthday date,
		   cellphone varchar(20),
		   email varchar(40),
		   preference varchar(100),
		   type varchar(40),
		   description varchar(255)
		);
	插入三条测试数据
	insert into customer values("a11","tom","男","2010-10-10","13888888888","tom@163.com","吃,喝,玩","vip","good man");
	insert into customer values("a11","fox","男","2000-10-10","13888888888","tom@163.com","吃,喝,玩","vip","good man");
	insert into customer values("a11","james","男","1990-10-10","13888888888","tom@163.com","吃,喝,玩","vip","good man");

idea 工具安装上lombox插件,

安装过程很简单
点开File-setting 菜单搜索插件lombox,点击安装即可
安装完成之后别忘了在pom文件下加入依赖

 <dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<version>1.16.6</version>
	</dependency>

然后新建一个customer 类的java bean

@Getter
@Setter
@ToString
public class Customer {
  private String id;
  private String name;
  private String gender;
  @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
  private Date birthday;
  private String cellphone;
  private String email;
  private String preference;
  private String type;
  private String description;
}

建立Controller层

@Controller
@RequestMapping("customer")
public class CustomerController {
    @Autowired
    public CustomerService customerService;
    @RequestMapping("customerList")
    public  String getCustomerList(Model model){    //获取全部客户端列表
        try {
            model.addAttribute("customerlist",customerService.getCustomerList());
            return "customer/customerlist";
        } catch (Exception e) {
            return "customer/error";
        }
    }


    @RequestMapping("customerDetail")
    public  String getCustomerDatail(String id,Model model){
        try {
            model.addAttribute("customerdetail",customerService.getCustomerDetail(id));
            return "customer/customerdetail";
        } catch (Exception e) {
            return "customer/error";
        }
    }

    /**
     * 调用接口类
     * @param customer
     * @return
     */
    @RequestMapping("customerupdate1")
    @ResponseBody
    public CustomerUpdate customerUpdate1(@Valid  @RequestBody Customer customer){
        CustomerUpdate customerUpdate=new CustomerUpdate();
        if(customer.getName()==null){
            return customerUpdate;
        }
        try {
            if(customerService.customerUpdate(customer)){
                customerUpdate.retunCode="1";
                customerUpdate.success="success";
            }
            return customerUpdate;
        } catch (Exception e) {
            return customerUpdate;
        }
    }

    @RequestMapping("customerupdate2")
    public void customerUpdate2(HttpServletRequest request,HttpServletResponse response){
        try {
            request.setCharacterEncoding("UTF-8");
             Customer customer=new Customer();
            DateConverter dateConverter=new DateConverter();
            dateConverter.setPattern("yyyy-mm-dd");//调用日期转换器
            ConvertUtils.register(dateConverter,java.util.Date.class);//将Date类的格式转换为yyyy-mm-dd的形式
            BeanUtils.populate(customer,request.getParameterMap());//customer中的birthday是date类型,
            if(customerService.customerUpdate(customer)){
                response.sendRedirect(request.getContextPath()+"/customer/customerList");

            }else{
                response.sendRedirect(request.getContextPath()+"/customer/error");

            }
        } catch (Exception e) {
            try {
                response.getWriter().write("编辑客户信息出错");
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }
     @RequestMapping("customerDelete")
    public void customerDelete(HttpServletRequest request,HttpServletResponse response,String id){
        try {
            if(customerService.customerDelete(id)){
                response.sendRedirect(request.getContextPath()+"/customer/customerList");
            }else{
                response.sendRedirect(request.getContextPath()+"/customer/error");
            }
        } catch (Exception e) {
            try {
                response.getWriter().write("删除客户信息出错");
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }
}

创建Service层

@Service
public class CustomerService {
    @Autowired
    public CustomerDao customerDao;

    public List<Customer> getCustomerList() throws Exception {
        return customerDao.getCoustomerList();
    }

    public Customer getCustomerDetail(String id) throws Exception {
        return customerDao.getCoustomerDetail(id);
    }

    public boolean customerUpdate(Customer customer) throws Exception {
        return customerDao.customerUpdate(customer);
    }
 public boolean customerDelete(String id) throws Exception {
        return customerDao.customerDelete(id);
    }
}

创建Dao层

@Repository
public class CustomerDao {
public List<Customer> getCoustomerList() throws Exception {
    QueryRunner qr=new QueryRunner(DbUtilsHelp.getDateSource());
     return qr.query(SQLConst.getCustomerList,new BeanListHandler<Customer>(Customer.class));
}

public Customer getCoustomerDetail(String id) throws Exception {
    QueryRunner qr=new QueryRunner(DbUtilsHelp.getDateSource());
    return qr.query(SQLConst.getCustomerDetail,new BeanHandler<Customer>(Customer.class),id);
}

public boolean customerUpdate(Customer customer) throws Exception {
    QueryRunner qr=new QueryRunner(DbUtilsHelp.getDateSource());
    return qr.update(SQLConst.customerUpdate,customer.getName(),customer.getGender()
    ,customer.getBirthday(),customer.getCellphone(),customer.getEmail(),
            customer.getPreference(),customer.getType(),customer.getDescription(),customer.getId())>0;
}
 public boolean customerDelete(String id) throws Exception {
    QueryRunner qr=new QueryRunner(DbUtilsHelp.getDateSource());
    return qr.update(SQLConst.customerDelete,id)>0;
}
}

创建SQl常量

public class SQLConst {

     public  static final String  getCustomerList="select * from customer";

     public  static final String  getCustomerDetail="select * from customer where id=?";

     public  static final String  customerUpdate= "update customer set name=?,gender=?,birthday=?,cellphone=?,email=?,preference=?,type=?,description=? where id=?";
     
      public  static final String  customerDelete="delete from customer where id=?";
}

由于我采用的DBUtils 操作的JDBC所以还需要在pom文件下添加如下依赖

	<dependency>
		<groupId>com.mchange</groupId>
		<artifactId>c3p0</artifactId>
		<version>0.9.5.4</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils -->
	<dependency>
		<groupId>commons-dbutils</groupId>
		<artifactId>commons-dbutils</artifactId>
		<version>1.7</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.30</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/com.mchange/mchange-commons-java -->
	<dependency>
		<groupId>com.mchange</groupId>
		<artifactId>mchange-commons-java</artifactId>
		<version>0.2.14</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
	<dependency>
		<groupId>commons-beanutils</groupId>
		<artifactId>commons-beanutils</artifactId>
		<version>1.9.3</version>
	</dependency>

新建工具类DbUtilsHelp 操作C3p0连接池

public class DbUtilsHelp {

private static ComboPooledDataSource dataSource=new ComboPooledDataSource();
public static  ComboPooledDataSource getDateSource () throws Exception{
    setDateSource();
    return dataSource;
}
public static Connection getConnection () throws Exception{
    setDateSource();
    return dataSource.getConnection();
}

private static void setDateSource() throws PropertyVetoException {
    dataSource.setDriverClass("com.mysql.jdbc.Driver");
    dataSource.setJdbcUrl("jdbc:mysql:///luoming?characterEncoding=UTF-8");
    dataSource.setUser("root");
    dataSource.setPassword("123456");
}
}

创建一个输出的Dto,用来接口返回参数

public class CustomerUpdate {
    public String retunCode="0";
    public String success="error";
}

这里我的编辑方法写了两种
第一种是通过ajax 调用/customer/customerupdate1接口进行修改,然后转发到列表页面
第二种则是通过request 和response操作修改,然后转发到列表页面
获取列表页面customerlist.html代码如下

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div align="center">
    <p th:if="${customerlist}==null">无客户信息
    <p>
    <table th:if="${customerlist}!=null" border="1" width="85%" align="center">
        <tr>
            <td><input type="checkbox"/></td>
            <td>客戶編號</td>
            <td>客戶姓名</td>
            <td>客戶性別</td>
            <td>客戶生日</td>
            <td>客戶電話</td>
            <td>客戶郵箱</td>
            <td>客戶愛好</td>
            <td>客戶類別</td>
            <td>客戶描述</td>
            <td>操作</td>
        </tr>
      <tr th:each="customer:${customerlist}">
          <td><input type="checkbox"/></td>
          <td th:text="${customer.id}"></td>
          <td th:text="${customer.name}"></td>
          <td th:text="${customer.gender}"></td>
          <td th:text="${customer.birthday}"></td>
          <td th:text="${customer.cellphone}"></td>
          <td th:text="${customer.email}"></td>
          <td th:text="${customer.preference}"></td>
          <td th:text="${customer.type}"></td>
          <td th:text="${customer.description}"></td>
          <td>
              <a th:text="编辑" th:href="@{/customer/customerDetail(id=${customer.id})}"></a>
              &nbsp;&nbsp;&nbsp;
                <a th:text="删除" th:href="@{/customer/customerDelete(id=${customer.id})}"></a>
          </td>
      </tr>
    </table>
</div>

</body>
</html>

客户详情页面如下customerdetail

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>客户详情信息</title>
</head>
<body>
<form method="post" id="form">
    <input type="hidden" name="id" th:value="${customerdetail.id}"/>
    客户姓名:<input type="text" name="name" th:value="${customerdetail.name}"/></br>
    客户姓别:<input type="text"  name="gender" th:value="${customerdetail.gender}"/></br>
    客户生日:<input type="text"  name="birthday" th:value="${customerdetail.birthday}"/></br>
    客户电话:<input type="text"  name="cellphone" th:value="${customerdetail.cellphone}"/></br>
    客户邮箱:<input type="text"  name="email" th:value="${customerdetail.email}"/></br>
    客户爱好:<input type="text"  name="preference" th:value="${customerdetail.preference}"/></br>
    客户类别:<input type="text"  name="type" th:value="${customerdetail.type}"/></br>
    客户描述:<input type="text"  name="description" th:value="${customerdetail.description}"/></br>
    <input type="button" id="update" value="修改" />
</form>
</body>
<script type="text/javascript" th:src="@{/JS/jquery-3.3.1.min.js}"></script>
<script type="text/javascript">
    $(function () {

        $("#update").click(function () {
            var  para={id:$("input[name='id']").val(),
                name:$("input[name='name']").val(),
                gender:$("input[name='gender']").val(),
                birthday:new Date($("input[name='birthday']").val()),//getDate(),
                cellphone:$("input[name='cellphone']").val(),
                email:$("input[name='email']").val(),
                preference:$("input[name='preference']").val(),
                type:$("input[name='type']").val(),
                description:$("input[name='description']").val()
                };
            $.ajax( {
                type:"POST",
                contentType:"application/json",
                url:"/customer/customerupdate1",
                dataType: "json",
                data: JSON.stringify(para),
                success :function (data) {
                      if(data.retunCode="1" && data.success=="success"){
                            location.href="/customer/customerList"
                      }
                }
            })
        })
    })
</script>
</html>

这个页面表单最终会调用/customer/customerupdate1这个借口返回数据 并转发列表页面
浏览器输入http://localhost:8080/customer/customerList
在这里插入图片描述
可以看到如上结果
点击编辑
在这里插入图片描述
在这里插入图片描述
列表得到修改
但是这种方法采用的是ajax转发的请求,性能并不好
如果采用第二种方法,性能则会好很多
修改客户详情页customerdetail.html
代码如下

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>客户详情信息</title>
</head>
<body>
<form method="post" th:action="@{/customer/customerupdate2}">
    <input type="hidden" name="id" th:value="${customerdetail.id}"/>
    客户姓名:<input type="text" name="name" th:value="${customerdetail.name}"/></br>
    客户姓别:<input type="text"  name="gender" th:value="${customerdetail.gender}"/></br>
    客户生日:<input type="text"  name="birthday" th:value="${customerdetail.birthday}"/></br>
    客户电话:<input type="text"  name="cellphone" th:value="${customerdetail.cellphone}"/></br>
    客户邮箱:<input type="text"  name="email" th:value="${customerdetail.email}"/></br>
    客户爱好:<input type="text"  name="preference" th:value="${customerdetail.preference}"/></br>
    客户类别:<input type="text"  name="type" th:value="${customerdetail.type}"/></br>
    客户描述:<input type="text"  name="description" th:value="${customerdetail.description}"/></br>
    <input type="submit" value="修改"/>
</form>
</body>
<script type="text/javascript" th:src="@{/JS/jquery-3.3.1.min.js}"></script>
</html>

采用表单自动提交处理方式
这时候请求会发往controller层中如下代码处理

  @RequestMapping("customerupdate2")
    public void customerUpdate2(HttpServletRequest request,HttpServletResponse response){
        try {
            request.setCharacterEncoding("UTF-8");
             Customer customer=new Customer();
            DateConverter dateConverter=new DateConverter();
            dateConverter.setPattern("yyyy-mm-dd");//调用日期转换器
            ConvertUtils.register(dateConverter,java.util.Date.class);//将Date类的格式转换为yyyy-mm-dd的形式
            BeanUtils.populate(customer,request.getParameterMap());//customer中的birthday是date类型,
            if(customerService.customerUpdate(customer)){
                response.sendRedirect(request.getContextPath()+"/customer/customerList");

            }else{
                response.sendRedirect(request.getContextPath()+"/customer/error");

            }
        } catch (Exception e) {
            try {
                response.getWriter().write("编辑客户信息出错");
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }
}

这里的日期格式转化器一定要使用,否则会出现日期转化失败问题
新增批量删除和按条件查询和新增客户功能,修改customerList页面如下

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title th:text="查询客户信息"></title>

</head>
<body>
<div align="center">

    <div align="center">
         <form method="post" th:action="@{/customer/getcustomerByCon}">
             <select name="field">
                 <option th:text="请选择条件查询"></option>
                 <option value="name" th:text="按姓名查询"></option>
                 <option value="gender" th:text="按性别查询"></option>
                 <option value="type" th:text="按类别查询"></option>
             </select>
             <input  type="text" name="msg"/>
             <input type="submit" value="查询">
         </form>
    </div>
    <p th:if="${customerlist}==null" th:text="无客户信息">
    <p>

    <table th:if="${customerlist}!=null" border="1" width="85%" align="center">
        <tr>
            <td><input type="checkbox" id="ck"/></td>
            <td th:text="客戶編號"></td>
            <td th:text="客戶姓名"></td>
            <td th:text="客戶性別"></td>
            <td th:text="客戶生日"></td>
            <td th:text="客戶電話"></td>
            <td>客戶郵箱</td>
            <td>客戶愛好</td>
            <td>客戶類別</td>
            <td>客戶描述</td>
            <td>操作</td>
        </tr>
        <tr th:each="customer:${customerlist}">
            <td><input type="checkbox" th:value="${customer.id}" name="cks"/></td>
            <td th:text="${customer.id}" ></td>
            <td th:text="${customer.name}"></td>
            <td th:text="${customer.gender}"></td>
            <td th:text="${customer.birthday}"></td>
            <td th:text="${customer.cellphone}"></td>
            <td th:text="${customer.email}"></td>
            <td th:text="${customer.preference}"></td>
            <td th:text="${customer.type}"></td>
            <td th:text="${customer.description}"></td>
            <td>
                <a th:text="编辑" th:href="@{/customer/customerDetail(id=${customer.id})}"></a>
                &nbsp;&nbsp;&nbsp;
                <a th:text="删除" th:href="@{/customer/customerDelete(id=${customer.id})}"></a>
            </td>
        </tr>
        <tr>
            <td colspan="10"><a class="del" href="javascript:void(0)" th:text="删除全选"></a></td>
            <td><a th:text="添加" th:href="@{/customer/getcustomerAdd}"></a></td>
        </tr>
    </table>
</div>

</body>
<script type="text/javascript" th:src="@{/JS/jquery-3.3.1.min.js}"></script>
<script type="text/javascript">
    $(function () {
        $("#ck").click(function () {
            var flag = $(this).get(0).checked;
            $("input[name='cks']").each(function () {
                $(this).get(0).checked = flag;
            });
        })

        $(".del").click(function () {
            var ids=new Array();
            $("input[name='cks']").each(function () {
                var flag=$(this).get(0).checked;
                if(flag){
                    var id=$(this).val();
                    ids.push(id);
                }
            });
            $.ajax({
                type:"POST",
                url:"/customer/customerDeleteBatch",
                contentType:"application/json",
                data:JSON.stringify(ids),
                dataType:"json",
                success:function (data) {
                    if(data.success=="success" && data.retunCode=="1"){
                        location.href="/customer/customerList";
                    }
                }
            })
        })
    })
</script>
</html>

创建一个添加客户页面customerAdd.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>客户信息添加</title>
</head>
<body>
<form method="post" th:action="@{/customer/customerAdd}">
    客户姓名:<input type="text" name="name" /></br>
    客户姓别:<input type="text"  name="gender" /></br>
    客户生日: <input type="text" name="birthday" class="Wdate" "WdatePicker()" readonly="readonly"><br>
    客户电话:<input type="text"  name="cellphone" /></br>
    客户邮箱:<input type="text"  name="email" /></br>
    客户爱好:<input type="text"  name="preference" /></br>
    客户类别:<input type="text"  name="type" /></br>
    客户描述:<input type="text"  name="description" /></br>
    <input type="submit" value="添加"/>
</form>
</body>
<script language="javascript" type="text/javascript" th:src="@{/My97DatePicker/WdatePicker.js}"></script>
</html>

这里用了一个时间选择器的插件WdatePicker.js
customercontroller中添加如下代码

 @RequestMapping("getcustomerAdd")
    public  String getcustomerAdd(Model model){
        try {
            return "customer/customerAdd";
        } catch (Exception e) {
            return "customer/error";
        }
    }
    @RequestMapping("customerAdd")
    public void customerAdd(HttpServletRequest request,HttpServletResponse response){
        try {
            request.setCharacterEncoding("UTF-8");
            Customer customer=new Customer();
            DateConverter dateConverter=new DateConverter();
            dateConverter.setPattern("yyyy-mm-dd");//调用日期转换器
            ConvertUtils.register(dateConverter,java.util.Date.class);//将Date类的格式转换为yyyy-mm-dd的形式
            BeanUtils.populate(customer,request.getParameterMap());//customer中的birthday是date类型,
            if(customerService.customerAdd(customer)){
                response.sendRedirect(request.getContextPath()+"/customer/customerList");
            }else{
                response.sendRedirect(request.getContextPath()+"/customer/error");
            }
        } catch (Exception e) {
            try {
                response.setCharacterEncoding("UTF-8");
                response.getWriter().write("添加客户信息出错");
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }
    //批量删除
 @RequestMapping("customerDeleteBatch")
    @ResponseBody
    public CustomerUpdate customerDeleteBatch(@Valid @RequestBody String[] id){
        CustomerUpdate customerUpdate=new CustomerUpdate();
       if(id==null){
            return customerUpdate;
        }
        try {
            if(customerService.customerDeleteBatch(id)){
                customerUpdate.retunCode="1";
                customerUpdate.success="success";
            }
            return customerUpdate;
        } catch (Exception e) {
            return customerUpdate;
        }
    }

    /**
     * 按条件查询
     * @param model
     * @return
     */
    @RequestMapping("getcustomerByCon")
    public  String getCustomerListByCon(HttpServletRequest request,Model model){
        try {
              String filed=request.getParameter("field");
              String msg=request.getParameter("msg");
              if(!StringHelp.IsNullOrEmpty(filed) && !StringHelp.IsNullOrEmpty(msg)){
                  model.addAttribute("customerlist",customerService.getCustomerListByCon(filed,msg));
              }else{
                  model.addAttribute("customerlist",customerService.getCustomerList());
              }
            return "customer/customerlist";
        } catch (Exception e) {
            return "customer/error";
        }
    }

customerservice添加如下代码

  public boolean customerAdd(Customer customer) throws Exception {
        return customerDao.customerAdd(customer);
    }
    public boolean customerDeleteBatch(String[] id) throws Exception {
        return customerDao.customerDeleteBatch(id);
    }

    public List<Customer> getCustomerListByCon(String filed,String msg) throws Exception {
        return customerDao.getCustomerListByCon(filed,msg);
    }

dao层添加如下代码

 public boolean customerAdd(Customer customer) throws Exception {
        QueryRunner qr=new QueryRunner(DbUtilsHelp.getDateSource());
        return qr.update(SQLConst.customerAdd, UUiDHelp.getUUID(),customer.getName(),customer.getGender()
                ,customer.getBirthday(),customer.getCellphone(),customer.getEmail(),
                customer.getPreference(),customer.getType(),customer.getDescription())>0;
    }

 
    public boolean customerDeleteBatch(String[] id) throws Exception {
        QueryRunner qr=new QueryRunner(DbUtilsHelp.getDateSource());
        Object[][] para=new Object[id.length][1];
        for (int i=0;i<id.length;i++){
            para[i][0]=id[i];
        }
        int count=0;
         int[] res=qr.batch(SQLConst.customerDelete,para);
        for (int i=0;i<res.length;i++){
            count++;
        }
        return count==res.length;
    }

    public List<Customer> getCustomerListByCon(String filed,String msg) throws Exception {
        QueryRunner qr=new QueryRunner(DbUtilsHelp.getDateSource());
        return qr.query(SQLConst.getCustomerListByCon.replace("ss",filed),new BeanListHandler<Customer>(Customer.class),"%"+msg+"%");
    }

SqlConst添加如下sql语句

     public static final String customerAdd="insert into customer value(?,?,?,?,?,?,?,?,?)";

     public  static final String  getCustomerListByCon="select * from customer where ss like ?";

浏览器输入地址最终结果如下
在这里插入图片描述
到此这个小案例暂时完成,目前可以进行一些增删改查的操作,后续将会在添加一些新功能,尽情期待

【2021年,将Spring全家桶的课程进行Review,确保不再有课程的顺序错乱,从而导致学员看不懂。进入2022年,将Spring的课程进行整理,整理为案例精讲的系列课程,并开始加入高阶Spring Security等内容,一步步手把手教你从零开始学会应用Spring,课件将逐步进行上传,敬请期待!】 本课程是Spring全家桶系列课程的第三部分Spring BootSpring案例精讲课程以真实场景、项目实战为导向,循序渐进,深入浅出的讲解Java网络编程,助力您在技术工作中更进一步。 本课程聚焦Spring Boot核心知识点:整合Web(如:JSP、Thymeleaf、freemarker等的整合)的开发、全局异常处理、配置文件的配置访问、多环境的配置文件设置、日志Logback及slf4j的使用、国际化设置及使用, 并在最后以一个贯穿前后台的Spring Boot整合Mybatis的案例为终奖,使大家快速掌握Spring的核心知识,快速上手,为面试、工作都做好充足的准备。 由于本课程聚焦于案例,即直接上手操作,对于Spring的原理等不会做过多介绍,希望了解原理等内容的需要通过其他视频或者书籍去了解,建议按照该案例课程一步步做下来,之后再去进一步回顾原理,这样能够促进大家对原理有更好的理解。 【通过Spring全家桶,我们保证你能收获到以下几点】 1、掌握Spring全家桶主要部分的开发、实现2、可以使用Spring MVC、Spring BootSpring Cloud及Spring Data进行大部分的Spring开发3、初步了解使用微服务、了解使用Spring进行微服务的设计实现4、奠定扎实的Spring技术,具备了一定的独立开发的能力  【实力讲师】 毕业于清华大学软件学院软件工程专业,曾在Accenture、IBM等知名外企任管理及架构职位,近15年的JavaEE经验,近8年的Spring经验,一直致力于架构、设计、开发及管理工作,在电商、零售、制造业等有丰富的项目实施经验  【本课程适用人群】如果你是一定不要错过!  适合于有JavaEE基础的,如:JSP、JSTL、Java基础等的学习者没有基础的学习者跟着课程可以学习,但是需要补充相关基础知识后,才能很好的参与到相关的工作中。 【Spring全家桶课程共包含如下几门】 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值