第003课:Spring Boot 快速体验 Web 开发

我是「猿码天地」,一个热爱技术、热爱编程的IT猿。技术是开源的,知识是共享的!

写作是对自己学习的总结和记录,如果您对 Java、分布式、微服务、中间件、Spring Boot、Spring Cloud等技术感兴趣,可以关注我的动态,我们一起学习,一起成长!

用知识改变命运,让家人过上更好的生活,互联网人一家亲!

——公众号《猿码天地》

第003课:Spring Boot 快速体验 Web 开发

上一节我们讲解了Spring Boot的工程构建、项目编码的配置、jdk环境配置、 maven环境配置、Spring Boot 项目工程结构等内容。

本节课程主要对Spring Boot Web 开发中涉及到的 引入关键的web依赖、配置application.properpties、RESTful支持、Ajax支持、freemarker支持、读取yml配置文件、@PathVariable和@RequestParam 请求传参、Json 的支持、Transactional事务作详细讲解。

1. 引入关键的web依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2. 配置application.properpties

#server
server.port=8080
context-path= /

#name
spring.application.name=springboot-web

#datasource
spring.datasource.url=jdbc:mysql://localhost:3306/db_web?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#jpa
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql= true

#\u81EA\u5B9A\u4E49\u53C2\u6570
helloWorld=SpringBoot!

#\u81EA\u5B9A\u4E49\u53C2\u6570\u5C01\u88C5
mysql.jdbcName=1
mysql.dbUrl=2
mysql.userName=3
mysql.password=4

3. RESTful支持

RESTful就是一个资源定位既操作资源的风格,不是标准也不是协议,只是一种风格。
基于这个风格设计软件空格更加的简洁,更有层次,更容易实现缓存等机制。

http://127.0.0.1/item/1 查询GET
http://127.0.0.1/item 新增POST
http://127.0.0.1/item 更新PUT
http://127.0.0.1/item/1 删除DELETE

实例:实现对书籍的增删改查功能(RESTful风格)

前端

bookAdd.html文件

后台

BookController.java文件

@ApiOperation(value = "查询所有图书", notes = "查询所有图书")
@RequestMapping("/list")
public ModelAndView list() {
    ModelAndView mav = new ModelAndView();
    mav.addObject("bookList", bookRepository.findAll());
    //返回给bookList页面
    mav.setViewName("bookList");
    return mav;
}

@ApiOperation(value = "添加图书", notes = "添加图书")
@RequestMapping("/add")
public String add(Book book) {
    bookRepository.save(book);
    return "forward:/book/list";
}

@ApiOperation(value = "根据id查询book实体", notes = "根据id查询book实体")
@RequestMapping("/preUpdate/{id}")
public ModelAndView preUpdate(@PathVariable("id") Integer id) {
    ModelAndView mav = new ModelAndView();
    mav.addObject("book", bookRepository.getOne(id));
    mav.setViewName("bookUpdate");
    return mav;
}

@ApiOperation(value = "修改图书", notes = "修改图书")
@RequestMapping("/update")
public String update(Book book) {
    bookRepository.save(book);
    return "forward:/book/list";
}

@ApiOperation(value = "删除图书", notes = "删除图书")
@RequestMapping("/delete")
public String delete(@RequestParam(value = "id") Integer id) {
    Book book = new Book();
    book.setId(id);
    bookRepository.delete(book);
    return "forward:/book/list";
}

4. Ajax支持

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)
AJAX 不是新的编程语言,而是一种使用现有标准的新方法。
AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下。

实例:实现对学生信息的新增功能

前端

studentAdd.html文件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
    <script src="/js/jquery-3.3.1.min.js"></script>
    <script type="text/javascript">

        function submitData(){
            $.post("/student/add",{name:$("#name").val(),age:$("#age").val()},
                function(result){
                    alert(result);
                }
            );
        }

    </script>
</head>
<body>
    姓名:<input type="text" id="name" name="name"/><br/>
    年龄:<input type="text" id="age" name="age"/><br/>
    <button onclick="submitData()">提交</button>
</body>
</html>

后台

StudentController.java文件

@ApiOperation(value = "添加学生信息",notes = "添加学生信息")
@PostMapping("/add")
public String add(@RequestBody Student student, BindingResult bindingResult){
    if(bindingResult.hasErrors()){
        return bindingResult.getFieldError().getDefaultMessage();
    }else{
        studentService.add(student);
        return "添加成功!";
    }
}

5. freemarker支持

FreeMarker 是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是像PHP那样成熟的编程语言。那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。

freemarker


后台

HelloWorldFreemarkerController.java文件

@ApiOperation(value = "freemarker模板",notes = "freemarker模板")
@GetMapping("/say")
public ModelAndView say(){
    ModelAndView mav = new ModelAndView();
    mav.addObject("message" ,"springboot freemarker!你好!");
    //返回给freemarker页面
    mav.setViewName("freemarker");
    return mav;
}

前端

freemarker.ftl文件

6. 读取yml配置文件

springboot配置文件都是放在application.properties或application.yml文件中,在程序开发中,我们有时需要读取配置文件的内容,那如何才能获取到呢?

首先我们在配置文件里新增需要读取的参数

参数一:helloWorld
#\u81EA\u5B9A\u4E49\u53C2\u6570
helloWorld=SpringBoot!

参数二:mysql配置文件
#\u81EA\u5B9A\u4E49\u53C2\u6570\u5C01\u88C5
mysql.jdbcName=1
mysql.dbUrl=2
mysql.userName=3
mysql.password=4

后台文件:HelloWorldYmlController.java
从yml读取配置文件

@Value("${helloWorld}")
private String helloWorld;

从yml读取配置文件,进行了封装

@Resource
private MysqlConfig mysqlProperties;

/**
 * <h3>springboot-study</h3>
 * <p>Mysql属性配置文件</p>
 * @author : zhang.bw
 * @date : 2020-07-17 21:37
 **/
@Component
@ConfigurationProperties(prefix="mysql")
public class MysqlConfig {

    private String jdbcName;

    private String dbUrl;

    private String userName;

    private String password;

    public String getJdbcName() {
        return jdbcName;
    }

    public void setJdbcName(String jdbcName) {
        this.jdbcName = jdbcName;
    }

    public String getDbUrl() {
        return dbUrl;
    }

    public void setDbUrl(String dbUrl) {
        this.dbUrl = dbUrl;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

获取配置文件验证

@ApiOperation(value = "获取自定义参数",notes = "获取自定义参数")
@GetMapping("/hi")
public String hi() {
    return helloWorld;
}

@ApiOperation(value = "获取自定义参数封装",notes = "获取自定义参数封装")
@GetMapping("/mysql")
public String mysql() {
    return mysqlProperties.getJdbcName() + "<br>" + mysqlProperties.getDbUrl() + "<br>" +
            mysqlProperties.getUserName() + "<br>" + mysqlProperties.getPassword();
}

获取自定义参数结果

获取自定义参数封装结果

 

7. @PathVariable和@RequestParam 请求传参

前端

index.html文件
<a href="/blog/211">@PathVariable测试</a>
<a href="/blog/query?q=1234567">@RequestParam测试</a>

后台

BlogController.java文件

@ApiOperation(value = "@PathVariable测试",notes = "@PathVariable测试")
@GetMapping("/{id}")
public ModelAndView show(@PathVariable("id") Integer id){
    ModelAndView mav=new ModelAndView();
    mav.addObject("id", id);
    //返回到blog.ftl页面
    mav.setViewName("blog");
    return mav;
}

@ApiOperation(value = "@RequestParam测试",notes = "@RequestParam测试")
@GetMapping("/query")
public ModelAndView query(@RequestParam(value="q",required=false)String q){
    ModelAndView mav=new ModelAndView();
    mav.addObject("q", Integer.valueOf(q));
    //返回到query.ftl页面
    mav.setViewName("query");
    return mav;
}

@PathVariable
使用@PathVariable接收参数,参数值需要在url进行占位,前端传参的URL:@PathVariable测试
前端传参的URL于后端@RequestMapping的URL必须相同且参数位置一一对应,否则前端会找不到后端地址

@RequestParam
使用@RequestParam接收前段参数比较方便,前端传参的URL:@RequestParam测试
后端使用集合来接受参数,灵活性较好,如果url中没有对参数赋key值,后端在接收时,会根据参数值的类型赋一个初始key(String、long ……)

8. Json 的支持

简单的说一下几个用到的关键注解:

1、@RestController

@RestController = @Controller + @ResponseBody

表示返回的是json格式的数据

2、@RequestBody

@RequestBody

代表请求的数据为json格式

9. Transactional事务

运行配置@Transactional注解类的时候,具体会发生如下步骤:

  1. 事务开始时,通过AOP机制,生成一个代理connection对象,并将其放入DataSource实例的某个与DataSourceTransactionManager相关的某处容器中。在接下来的整个事务中,客户代码都应该使用该connection连接数据库,执行所有数据库命令[不使用该connection连接数据库执行的数据库命令,在本事务回滚的时候得不到回滚]

  2. 事务结束时,回滚在第1步骤中得到的代理connection对象上执行的数据库命令,然后关闭该代理connection对象。

实例:账号A给账号B转账,保证事务成功

后台代码

AcountController.java文件

核心功能:账号id为1给账号id为2转账200元,要么成功,要么失败,保证事务成功。

@ApiOperation(value = "事务",notes = "事务")
@GetMapping("/transfer")
public String transferAccounts(){
    try {
        accountService.transferAccounts(1,2,200);
        return "YES";
    }catch (Exception e){
        return "NO";
    }
}

@Override
@Transactional
public void transferAccounts(int fromUser, int toUser, float account) {
    Account fromAccount = accountRepository.getOne(fromUser);
    fromAccount.setBalance(fromAccount.getBalance() - account);
    //System.out.println(fromAccount.getUserName());
    accountRepository.save(fromAccount);

    Account toAccount = accountRepository.getOne(toUser);
    toAccount.setBalance(toAccount.getBalance() + account);
    //int zero=1/0; //转账过程中抛出异常,看转账情况
    accountRepository.save(toAccount);
}

数据库 转账前:

 

数据库 转账后:

10. 总结

本节课程主要介绍了对Spring Boot Web 开发中涉及到的 引入关键的web依赖、配置application.properpties、RESTful支持、Ajax支持、freemarker支持、读取yml配置文件、@PathVariable和@RequestParam 请求传参、Json 的支持、Transactional事务相关知识做了详细的讲解,通过实例的方式让读者对Spring Boot Web 开发有一个大致的了解。

源码下载地址:关注并回复 springboot 获取

扫描二维码关注公众号 : 猿码天地

你多学一样本事,就少说一句求人的话,现在的努力,是为了以后的不求别人,实力是最强的底气。记住,活着不是靠泪水博得同情,而是靠汗水赢得掌声。

——《写给程序员朋友》

猜你喜欢

转载自blog.csdn.net/zbw125/article/details/107572769