我是「猿码天地」,一个热爱技术、热爱编程的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那样成熟的编程语言。那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。
后台
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注解类的时候,具体会发生如下步骤:
-
事务开始时,通过AOP机制,生成一个代理connection对象,并将其放入DataSource实例的某个与DataSourceTransactionManager相关的某处容器中。在接下来的整个事务中,客户代码都应该使用该connection连接数据库,执行所有数据库命令[不使用该connection连接数据库执行的数据库命令,在本事务回滚的时候得不到回滚]
-
事务结束时,回滚在第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 获取
扫描二维码关注公众号 : 猿码天地
你多学一样本事,就少说一句求人的话,现在的努力,是为了以后的不求别人,实力是最强的底气。记住,活着不是靠泪水博得同情,而是靠汗水赢得掌声。
——《写给程序员朋友》