前两天写完了天猫商城的ssm项目,部署到了阿里云上面
http://120.26.185.107:8080/tmall_ssm
然后就萌生了个想法,自己写一个个人博客,想了想还是把Springboot学完了之后再动手试试。
那么开始springboot吧。
首先,在IDEA中开发Springboot应用和Eclipse里面一样,本质上都是一个maven 项目。 但是呢,IDEA 本身自带对SpringBoot支持的插件,不像Eclipse那样,要用插件还需要从第三方安装, 而且很缓慢 (国外插件源)。
菜单 -> New -> Project -> Spring Initializr 然后点 Next
然后只用修改Group和Artifact就行,我直接跟着站长的改的,第一个应该是包名,第二个项目名
接着左边选择 Web, 右边只勾选 Web 即可,然后点击Next
然后就把项目创建好了
然后会有个自带的类
被@SpringBootApplication 所标记,表示这个是一个Springboot 应用,就是因为它!我们不用自己配置Tomcat
SpringBoot的默认视图是Thymeleaf,但还没学,这里就处理下让SpringBoot支持我们习惯的JSP
在pom.xml中配置对jsp的支持
javax.servlet
javax.servlet-api
javax.servlet
jstl
org.apache.tomcat.embed
tomcat-embed-jasper
视图定位,我们要改一下 application.properties
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
建一个Controller包,建一个HelloController类,这里和之前ssm里面差不多。
package com.how2java.springboot.web;
import java.text.DateFormat;
import java.util.Date;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(Model m) {
m.addAttribute("now", DateFormat.getDateTimeInstance().format(new Date()));
return "hello";
}
}
在main目录下,新建-> webapp/WEB-INF/jsp 目录。
随后新建hello.jsp 文件,在其中使用EL 表达式显示放在HelloController的model中的当前时间。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Hi JSP. 现在时间是 ${now}
然后运行,访问http://127.0.0.1:8080/hello
为了让咱改了项目内容之后,不用再自己重启项目,可以加上一个插件,让他自己动。
做法很简单,在pom.xml中新增加一个依赖和一个插件就行了。
依赖:
org.springframework.boot
spring-boot-devtools
true
插件:
org.springframework.boot
spring-boot-maven-plugin
重启项目试试,不得行就 ctrl+s ctrl+f9,
还不行就这样试试:https://blog.csdn.net/diaomeng11/article/details/73826564
新增加一个类GlobalExceptionHandler,用于捕捉Exception异常以及其子类。
捕捉到之后,把异常信息,发出异常的地址放进ModelAndView里,然后跳转到 errorPage.jsp
package com.how2java.springboot.exception;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
ModelAndView mav = new ModelAndView();
mav.addObject("exception", e);
mav.addObject("url", req.getRequestURL());
mav.setViewName("errorPage");
return mav;
}
}
errorPage:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
系统 出现了异常,异常原因是:
${exception}
出现异常的地址是:
${url}
这样出了啥一场他都会调到errorPage页面给你显示出来。
可以通过修改application.properties,修改访问的端口号和上下文路径(我还没搞懂上下文路径是啥,但端口的确能改变成功)
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
server.port=8888
server.context-path=/test
有时候在本地测试是使用8080端口,可是上线使用的又是80端口。 此时就可以通过多配置文件实现多配置支持与灵活切换
3个配置文件:
核心配置文件:application.properties
开发环境用的配置文件:application-dev.properties
生产环境用的配置文件:application-pro.properties
这样就可以通过application.properties里的spring.profiles.active =啥 灵活地来切换使用哪个环境了,下面代码里面spring.profiles.active =pro,就是代表用的application-pro.properties里面的配置。
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
spring.profiles.active=pro
JPA(Java Persistence API)是Sun官方提出的Java持久化规范,用来方便大家操作数据库。
真正干活的可能是Hibernate,TopLink等等实现了JPA规范的不同厂商,默认是Hibernate。
本知识演示如何在Springboot中快捷方便地使用JPA。
大概就是帮我们处理与数据库的交互的。
查了下资料发现它比Mybatis厉害,不用我们自己去写基础的sql语句,不像Mybatis还要各种Mapper啥的。
第一步 修改application.properties,把数据库信息写进去,要注意的是!
spring.jpa.properties.hibernate.hbm2ddl.auto=update这一句,很der,表示会自动更新表结构,所以表都需要我们去建。
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.hbm2ddl.auto=update
然后在pom里面增加对mysql和jpa的依赖
mysql
mysql-connector-java
5.1.21
org.springframework.boot
spring-boot-starter-data-jpa
然准备咱的pojo,这里也和之前的pojo不一样,需要一些注解。
增加一个包:com.how2java.springboot.pojo,然后创建实体类Category。
@Entity 注解表示这是个实体类
@Table(name = "category_") 表示这个类对应的表名是 category_ ,注意有下划线哦
@Id 表明主键
@GeneratedValue(strategy = GenerationType.IDENTITY) 表明自增长方式
@Column(name = "id") 表明对应的数据库字段名
package com.how2java.springboot.pojo;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "category_")
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后准备DAO:
增加一个包:com.how2java.springboot.dao,然后创建dao接口CategoryDAO,继承了JpaRepository,并且提供泛型
JpaRepository 这个父接口,就提供了CRUD, 分页等等一系列的查询了,直接拿来用,都不需要二次开发的了。
package com.how2java.springboot.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import com.how2java.springboot.pojo.Category;
public interface CategoryDAO extends JpaRepository{
}
然后就可以试试咱的增删改查了。
准备CategoryController
package com.how2java.springboot.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.how2java.springboot.dao.CategoryDAO;
import com.how2java.springboot.pojo.Category;
@Controller
public class CategoryController {
@Autowired CategoryDAO categoryDAO;
@RequestMapping("/listCategory")
public String listCategory(Model m,@RequestParam(value = "start", defaultValue = "0") int start,@RequestParam(value = "size", defaultValue = "5") int size) throws Exception {
start = start<0?0:start;
Sort sort = new Sort(Sort.Direction.DESC, "id");
Pageable pageable = new PageRequest(start, size, sort);
Page page =categoryDAO.findAll(pageable);
System.out.println(page.getNumber());
System.out.println(page.getNumberOfElements());
System.out.println(page.getSize());
System.out.println(page.getTotalElements());
System.out.println(page.getTotalPages());
m.addAttribute("page", page);
return "listCategory";
}
@RequestMapping("/addCategory")
public String addCategory(Category c) throws Exception {
categoryDAO.save(c);
return "redirect:listCategory";
}
@RequestMapping("/deleteCategory")
public String deleteCategory(Category c) throws Exception {
categoryDAO.delete(c);
return "redirect:listCategory";
}
@RequestMapping("/updateCategory")
public String updateCategory(Category c) throws Exception {
categoryDAO.save(c);
return "redirect:listCategory";
}
@RequestMapping("/editCategory")
public String ediitCategory(int id,Model m) throws Exception {
Category c= categoryDAO.getOne(id);
m.addAttribute("c", c);
return "editCategory";
}
}
listCategory
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
运行
的确感觉简洁了很多, 没有spring那里转过来转过去的配置过程了。美滋滋。