Tmall_SpringBoot项目练习
POJO
POJO是一个简单的、普通Java对象,它包含业务逻辑处理或持久化逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊角色,不继承或不实现任何其它Java框架的类或接口。可以包含类似与JavaBean属性和对属性访问的setter和getter方法的。
基本意思是说POJO一个普通的Java对象(不是JavaBean,EntityBean等),也不担当任何的特殊的角色,也不实现任何Java框架指定的接口。
错误的POJO
public class DbHello implements Hello {
//实现了接口,就不能称之为POJO,这已经不是简单的Java类了
private DictionaryDAO dao;
public void setDao(DictionaryDAO dao) {
this.dao = dao;
}
}
正确的POJO
public class DbHello {
//简单的Java类,称之为POJO,不继承,不实现接口
private DictionaryDAO dao;
public void setDao(DictionaryDAO dao) {
this.dao = dao;
}
}
JPA之@GeneratedValue注解
在JPA中,@GeneratedValue
注解存在的意义主要就是为一个实体生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键)
@GeneratedValue
提供了主键的生成策略。@GeneratedValue
注解有两个属性,分别是strategy
和generator
,其中generator
属性的值是一个字符串,默认为"",其声明了主键生成器的名称(对应于同名的主键生成器@SequenceGenerator和@TableGenerator)。
JPA为开发人员提供了四种主键生成策略,其被定义在枚举类GenerationType中,包括GenerationType.TABLE
GenerationType.SEQUENCE
GenerationType.IDENTITY
GenerationType.AUTO
–IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle 不支持这种方式;
–AUTO: JPA自动选择合适的策略,是默认选项;
–SEQUENCE:通过序列产生主键,通过@SequenceGenerator 注解指定序列名,MySql不支持这种方式
–TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
实例
@Entity //jpa标注实体
@Table(name = "t_customer") // 创建/修改表的名称
@Data
public class Customer {
@Id // 主键
//@GeneratedValue(strategy = GenerationType.AUTO)
//主键自增 Auto为默认使用oracle自增的方式
//所以在运行时会多生成一张表 记录从1开始 记录主键
//这里不适用与mysql 但是使用
//@GeneratedValue(strategy = GenerationType.IDENTITY)报主键不能为空错误
private Long id;
@Column(name = "name", nullable = true)
// 数据库对应字段名 非空约束(可以为空)
private String name;
@Column(name = "remark", nullable = true)
// 数据库对应字段名 非空约束(可以为空)
private String remark;
......
}
RESULTFul
url重定向和转发
Web UI项目中, 很多 Spring controller 视图函数直接返回 html 页面, 还有一些视图函数是要重定向或转发到其他的 url 上.
redirect 和 forward的区别:
重定向 redirect: 完整的重定向包含两次request-response过程,
第一次是访问原始url
第二次是服务器通知客户端访问重定向后的url. 重定向完成后, 浏览器的地址是重定向后的url, 而不是原始的url
重定向的使用场景: 因为重定向会修改浏览器地址, 所以 form 提交应该使用重定向, 以免用户刷新页面导致form重复提交.
转发 forward: 完整的转发仅包含一次 request-response 过程, 用户发出request后, 服务器端视图函数先处理自己的逻辑, 然后在服务器端有调用另一个视图函数, 最后将response返回给浏览器.
调用顺序
控制层调用service层
service调用dao层
dao调用具体的增删改查
常用注解
@PathVaribale
获取url中的数据
如果我们需要获取Url=localhost:8080/hello/id中的id值,实现代码如下:
@RestController
public class HelloController {
@RequestMapping(value="/hello/{id}",method= RequestMethod.GET)
public String sayHello(
@PathVariable("id") Integer id){
return "id:"+id;
}
}
同样,如果我们需要在url有多个参数需要获取,则如下代码所示来做就可以了。
@RestController
public class HelloController {
@RequestMapping(value="/hello/{id}/{name}",method=RequestMethod.GET)
public String sayHello(
@PathVariable("id") Integer id,
@PathVariable("name") String name){
return "id:"+id+" name:"+name;
}
}
@RequestParam
获取请求参数的值
获取Url=localhost:8080/hello?id=98中id的值
@RestController
public class HelloController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
public String sayHello(@RequestParam("id") Integer id){
return "id:"+id;
}
}
@RequestParam注解给我们提供了这种解决方案,即允许用户不输入id时,使用默认值
@RestController
public class HelloController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
//required=false 表示url中可以不穿入id参数,此时就使用默认参数
public String sayHello(@RequestParam(value="id",required = false,defaultValue = "1") Integer id){
return "id:"+id;
}
}
@GetMapping
@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。该注解将HTTP Get 映射到 特定的处理方法上。
即可以使用@GetMapping(value = “/hello”)来代替@RequestMapping(value=”/hello”,method= RequestMethod.GET)。即可以让我们精简代码。
@RestController
@RestController Spring框架4版本之后出来的注解,之前版本返回json数据需要@ResponseBody配合@Controller
@RestController
public class HelloController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
public String sayHello(){
return "hello";
}
}
等同于下面
@Controller
@ResponseBody
public class HelloController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
public String sayHello(){
return "hello";
}
}
添加支持CORS跨域访问
CORS(Cross-Origin Resource Sharing)"跨域资源共享",是一个W3C标准,它允许浏览器向跨域服务器发送Ajax请求,打破了Ajax只能访问本站内的资源限制
addMapping:配置可以被跨域的路径,可以任意配置,可以具体到直接请求路径。
allowedMethods:允许所有的请求方法访问该跨域资源服务器,如:POST、GET、PUT、DELETE等。
allowedOrigins:允许所有的请求域名访问我们的跨域资源,可以固定单条或者多条内容,如:"http://www.baidu.com",只有百度可以访问我们的跨域资源。
allowedHeaders:允许所有的请求header访问,可以自定义设置任意请求头信息,如:"X-YAUTH-TOKEN"
统一异常处理ControllerAdvice
在用spring Boot
做web
后台时,经常会出现异常,如果每个异常都自己去处理很麻烦,所以我们创建一个全局异常处理类来统一处理异常。通过使用@ControllerAdvice
定义统一的异常处理类,而不是在每个Controller
中逐个定义。
自定义全局异常处理类 GlobalExceptionHandler.java
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MyException.class)
@ResponseBody
public Result handleMyException(HttpServletRequest request, MyException e){
String message = e.getMessage();
Integer code = e.getCode();
Result result = new Result(code,message);
return result;
}
}
只需要使用 @ControllerAdvice 注解来标识即可,可以结合 @Controller 注解来理解.
@Controller 注解标识的类 拦截所有的web请求,使用 @RequestMappering() 进行匹配
@ControllerAdvice 注解标识的类 拦截程序抛出的异常,使用@ExceptionHandler() 进行匹配