写一个Spring Boot的Hello World
尽管这个demo也就hello world水平,但我还是要记录一下(总算能动了QAQ),毕竟老是看文章不动手不行啊
上次写Servlet的CRUD项目还是2月份,虽然代码忘的差不多了,但我就记得JDBC写起来特别累,作为入门还是学学Spring吧,然而被Spring的配置劝退了(现在看好像也不是问题,只是没有那种经验,碰到就懵逼),现在改用SpringBoot了,并且学习牛客网上的小demo作为入门参考
从啥都不会到写个能动的Spring Boot应用需要知道以下概念↓
1.maven构建项目的套路,为了方便还要会改国内源(然后当你配置好后发现IDEA居然用自带的配置)
2.MVC架构,其中controller就是相当于一个服务器的入口
3.注解的用法,初次接触到高度封装的代码我确实头疼,一个@就完事的非侵入式写法很难明白它的原理(因为过于隐蔽了)
4.项目常规的通用结构,由于没有写过正经的项目,我也不懂该怎么分orz(只会DAO),参考一个project能解决这种问题(核心是在于了解MVC的细分)
5.懂设计模式,感谢自己几个月前了解了不少设计模式,核心的IOC/AOP不是问题(虽然这里没体现)
6.了解一下用于注入的XML,前几天的物联网(安卓)实验课上用了XML作为显式的注入,了解这个过程虽然用不上但会更明白Spring(Boot)的隐式注入是咋回事
7.同理,了解AOP的过程就是要尝试写一个静态代理,然后到动态代理
8.不知道是mybatis封装的太好还是怎样,起码能动的水平只要你会@个CRUD就好
9.关于view的部分,我个人认为目前会对着改网页即可
10.项目中剩余部分暂留
由于这只是hello world水平的记录,因此代码也十分的hello world。。
项目结构如下(test/biz/utils等暂无),具体class/interface以.java区分
|------------com.caturra.training
|
|--------BookLibraryApplication.java
|
|-------controller
|
|----BookController.java
|--------model
|----Book
|--------dao
|----BookDAO.java
|--------service
|----BookService.java
|------------resources
|--------templates
|----book
|----books.html
|----hello.html
|-------application.properties
|-------log4j.properties
|-------mybatis-config.xml
UPDATE.更新个截图版

以下忽略全限定名
BookLibraryApplication
package com.caturra.training;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class BookLibraryApplication {
public static void main(String[] args) {
SpringApplication.run(BookLibraryApplication.class,args);
}
}
BookController
package com.caturra.training.controller;
import com.caturra.training.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class BookController {
@Autowired
private BookService bookService;
@RequestMapping(path = {"/index"},method = {RequestMethod.GET})
public String getAllBooks(Model model) {
model.addAttribute("books",bookService.getAll());
return "book/books";
}
@RequestMapping(path = {"/"},method = {RequestMethod.GET})
public String tempTest() {
return "hello";
}
}
Book
package com.caturra.training.model;
public class Book {
private int id;
private String title;
private String author;
private int price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
BookDAO
package com.caturra.training.dao;
import com.caturra.training.model.Book;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface BookDAO {
String tableName = " book ";
String insertField = " title, author, price ";
String selectField = insertField;
@Select({"SELECT",selectField,"FROM",tableName})
List<Book> getAll();
@Insert({"INSERT INTO",tableName,"(",insertField,") VALUES (#{title},#{author},#{price})"})
int add(Book book);
}
BookService
package com.caturra.training.service;
import com.caturra.training.dao.BookDAO;
import com.caturra.training.model.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BookService {
@Autowired
private BookDAO bookDAO;
public void add(Book book) {
bookDAO.add(book);
}
public List<Book> getAll() {
return bookDAO.getAll();
}
}
application.properties配置
spring.freemarker.suffix=.html
spring.datasource.url=jdbc:mysql://localhost:3306/mybooklib?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
mybatis.config-location=classpath:mybatis-config.xml
mybatis和log4j的配置我没有查过官方文档,直接套用别人的,篇幅问题只放出mybatis方便以后抄(删去)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- Globally enables or disables any caches configured in any mapper under this configuration -->
<setting name="cacheEnabled" value="true"/>
<!-- Sets the number of seconds the driver will wait for a response from the database -->
<setting name="defaultStatementTimeout" value="3000"/>
<!-- Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java property names aColumn -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- Allows JDBC support for generated keys. A compatible driver is required.
This setting forces generated keys to be used if set to true,
as some drivers deny compatibility but still work -->
<setting name="useGeneratedKeys" value="true"/>
</settings>
<!-- Continue going here -->
</configuration>
books.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>图书列表</title>
</head>
<body>
<div align="center">
<h3>图书列表</h3>
<table border="1" cellpadding="10">
<tr>
<td>书名</td>
<td>作者</td>
<td>价格</td>
</tr>
<#list books as book>
<tr>
<td>《${book.title}》</td>
<td>${book.author}</td>
<td>${book.price}</td>
</tr>
</#list>
</table>
</div>
</body>
</html>
hello.html作为检查是否正常运行
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<p>hello the no offer world!</p>
</body>
</html>
遇到的坑:
0.数据库记得写好表
1.即使是最简单的项目也有一定的依赖关系,因此从哪里写起也是一个问题,个人做法是先写好controller,画草稿写设计一个模块需要什么东西,比如一个serive的完成顺序model->DAO->service
2.比较晦涩的注解可以用IDE的源码查看下载大概看一下
3.一路写过去大概率完蛋,可以用简单的页面debug一下,或者写好test
4.自己太菜是个问题
完成这些那就意味着我总算能动我的OJ项目了
期望能尽早肝出来
写一个Spring Boot的Hello World的更多相关文章
- 摊牌了!我要手写一个“Spring Boot”
目前的话,已经把 Spring MVC 相关常用的注解比如@GetMapping .@PostMapping .@PathVariable 写完了.我也已经将项目开源出来了,地址:https://gi ...
- 自己写一个spring boot starter
https://blog.csdn.net/liuchuanhong1/article/details/55057135
- 我的第一个spring boot程序(spring boot 学习笔记之二)
第一个spring boot程序 写在前面:鉴于spring注解以及springMVC的配置有大量细节和知识点,在学习理解之后,我们将直接进入spring boot的学习,在后续学习中用到注解及其他相 ...
- 创建一个 Spring Boot 项目,你会几种方法?
我最早是 2016 年底开始写 Spring Boot 相关的博客,当时使用的版本还是 1.4.x ,文章发表在 CSDN 上,阅读量最大的一篇有 42W+,如下图: 2017 年由于种种原因,就没有 ...
- 第一个Spring Boot程序
Windows 10家庭中文版,java version "1.8.0_152", Eclipse Oxygen.1a Release (4.7.1a),Spring Tools ...
- Spring Boot (1) 构建第一个Spring Boot工程
Spring boot简介 spring boot是spring官方推出的一个全新框架,其设计目的是用来简化新spring应用的初始搭建以及开发过程. Spring boot特点 1.化繁为简,简化配 ...
- 年轻人的第一个 Spring Boot 应用,太爽了!
Spring Boot 大家都知道是啥吧? 还有不知道的来看这篇扫下盲:告诉你,Spring Boot 真是个牛逼货!. 顺便再往下看,栈长给你带来年轻人的第一个 Spring Boot 应用,撸码史 ...
- 最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/
最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/,帮忙找找bug,网站里有源码地址 网站说明 甲壳虫社区(Beetle Community) 一个开源 ...
- 峰哥说技术:02-第一个Spring Boot应用程序
Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 02第一个Spring Boot应用程序 1.版本要求 集成开发环境:IntelliJ IDEA 2017 ...
随机推荐
- C# WinForm 关闭登陆窗体后进程还再内存怎么办?
问题:我们通常再制作WinForm应用程序的时候,运行程序的第一个窗口一般是登陆窗口.代码如下: 那么这种方式有一个弊端,这种启动方式,其实就是把登陆窗口设置为主窗体.因此,再登陆后,我们通常是调用H ...
- Android实现智能提示的文本输入框AutoCompleteTextView
今天我们要讲一个十分简单的内容,就是一个安卓控件的使用,用法很简单,但是很常用的一个.这里我用两种不同的写法来处理.当然,无论用哪一种写法,效果都是一样的. 我们先来看效果图. 要实现这种效果十分简单 ...
- 【259】ucpole.dat update
2017年2月21日 57871 +0.020896 0.007232 +0.414732 0.009212 +0.418044 0.007533 p 57872 +0.022055 0.007284 ...
- Java知识点总结1
1.java的引用传递和值传递 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参 ...
- re 模块 常用正则表达式符号 最常用的匹配语法
常用正则表达式符号1 '.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行 '^' 匹配字符开头,若指定flags MULTILINE, ...
- Winform状态栏控件中Label靠右显示的方法
设计器: 代码: 在Form_Load事件中添加 : statusStripMain.LayoutStyle= ToolStripLayoutStyle.HorizontalStackWithOv ...
- Python沙盒环境配置
一.简介 本文介绍配置python沙盒环境的方法步骤. 二.安装步骤 1.安装pyenv http://www.cnblogs.com/274914765qq/p/4948530.html 2.安装v ...
- ZROI2018普转提day7t2
传送门 分析 首先我们不难想到我们一定可以将每一个点分开算,然后看这个点被几个矩形包含 于是对于位置为$(i,j)$的点它被包含的次数为$i * (n-i+1) * j * (m-j+1)$ 这个式子 ...
- WarTransportation TopCoder - 8404
传送门 分析 我们高兴的发现数据范围特别小,所以我们可以随便搞.因为一共只砍掉一条路,所以我们先算出对于任意一个点如果将它的出边割掉一条则它到达终点的最坏情况的最短距离是多少,然后我们从终点向起点反着 ...
- Spring第四篇
在spring第三篇中介绍了bean元素属性 在第四篇中介绍spring注入的方式 1 set方法注入 建立一个User类 创建私有的属性 set get 方法 重写toString方法 代码如下 ...