tomcat服务器已经内嵌
不需要再去配置一些以前的ssm的配置文件,springboot都给配置好了
package com.demo1.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController //@Controller和@ResponseBody的结合,此类中的所有方法都加上了@ResponseBody
@RequestMapping("/hello")
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello world!!!";
}
}
在resources目录下的application.properties中更改
server.port=8081
spring-boot-dependencies:核心依赖在父工程中
导入一些springboot依赖的时候,不需要指定版本,因为有这些版本仓库
启动器:说白了就是springboot的启动场景,比如spring-boot-starter-web,会帮我们导入web环境所所有的依赖,我们需要什么功能,找到相应的启动器即可
springboot所有的自动配置类都是在启动的时候扫描并加载:spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了相应的starter,就有了对应的启动器,有了启动器,自动装配就会生效,然后就配置成功
SpringBoot使用一个全局配置文件,配置文件名称是固定的
application.properties
application.yaml
application.yaml
#普通的key-value
name: wyf
#对象
student:
name: wyf
age:3
#对象的行内写法
student: {那么: wyf,age: 3}
#数组
pets:
- cat
- dog
- pig
#数组的行内写法
pets: [cat,dog,pig]
@Component
@Data
@ConfigurationProperties(prefix = "person")
@Validated//开启数据校验
public class Person {
@Email(message = "邮箱格式错误")//给email赋值必须是email类型
private String email;
private Integer age;
private boolean happy;
}
//application.properties
#可以指定激活哪一个配置文件
spring.profiles.active=test/dev
//application-dev.properties
server
port: 8081
//application-test.properties
server
port: 8082
@Configuration
@EnableWebMvc
public class MyMvcConfig implements WebMvcConfigurer {
//设置静态资源的访问路径
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/").addResourceLocations("classpath:/templates/");
}
//添加视图控制器
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
}
}
需要配置i18n(国际化单词的缩写)文件
如果需要在项目中进行按钮自动切换,我们需要自定义一个组件LocalResolver
将自己写额组件配置到spring容器中,@Bean
//form表单提交按钮之后会走action,并将name="username"和name="password"传递到后端
<form class="form-signin" th:action="@{/user/login}">
<img class="mb-4" th:src="@{/img/bootstrap-solid.svg}" alt="" width="72" height="72">
<h1 class="h3 mb-3 font-weight-normal">Please sign inh1>
<p style="color: red" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}">p>
<input type="text" name="username" class="form-control" placeholder="Username" required="" autofocus="">
<input type="password" name="password" class="form-control" placeholder="Password" required="">
<button class="btn btn-lg btn-primary btn-block" type="submit">Sign inbutton>
form>
@Controller
public class LoginController {
@RequestMapping("/user/login")
public String login(@RequestParam("username") String username,
@RequestParam("password") String password,
Model model, HttpSession session){
//具体的业务
if (!StringUtils.isEmpty(username) && "123456".equals(password)){
session.setAttribute("loginUser",username);
return "redirect:/main.html";
}else {
model.addAttribute("msg","用户名密码错误");
return "index";
}
}
}
//配置自己的拦截器,重写方法
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object loginUser = request.getSession().getAttribute("loginUser");
if (loginUser == null){
request.setAttribute("msg","没有权限,请先登录");
request.getRequestDispatcher("/index.html").forward(request,response);
return false;
}else{
return true;
}
}
}
//扩展mvc的配置文件
@Configuration
@EnableWebMvc
public class MyMvcConfig implements WebMvcConfigurer {
//可以加载静态资源
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/").addResourceLocations("classpath:/templates/");
}
//配置视图控制器
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
registry.addViewController("main.html").setViewName("dashboard");
}
//配置拦截器的拦截条件
@Override/70
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor())
.addPathPatterns("/**").excludePathPatterns()
.excludePathPatterns("/index.html","/","/user/login","/css/*","/js/**","/img/**");
}
}
SpringBoot默认数据库连接池Hikari Hikari是一款非常强大,高效,并且号称“史上最快连接池。
Spring Boot2.0以上默认使用Hikari数据源,可以说Hikari与Driud都是当前Java Web上最优秀的数据源。
//对Driud的一些属性进行设置
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")//指定配置哪的属性
@Bean
public DataSource druidDataSource(){
return new DruidDataSource();
}
//后台监控 :相当于web.xml
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet());
//后台需要有人登录,账号密码配置
HashMap<String,String> initParameters = new HashMap<>();
//增加配置
//设置后端监控平台的用户名和密码
initParameters.put("loginUsername","admin");
initParameters.put("loginPassword","123456");
//设置允许谁可以访问
initParameters.put("allow","");
bean.setInitParameters(initParameters);
return bean;
}
//同样也可以配置过滤器,对哪些请求不进行统计
}
//在application.yaml中配置mybatis的mapper-locations的路径(注意mapper是否需要增加@Mapper和@Repository)
mybatis-plus:
mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml,classpath:mapper/*/*Mapper.xml
Spring Security是针对项目的安全框架,也是spring boot底层安全模块认证的技术选型,可以实现强大的Web安全控制,仅仅需要导入spring-boot-starter-security模块,进行少量的配置
记住几个重要的类
Spring Security两个主要目标是认证和授权
//设置自己的安全策略
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//授权
@Override
protected void configure(HttpSecurity http) throws Exception {
//链式编程思想
//首页所有人可以访问,功能页只能有对应权限的人才能访问
//请求授权的规则
http.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/level1/**").hasRole("vip1")
.antMatchers("/level2/**").hasRole("vip2")
.antMatchers("/level3/**").hasRole("vip3");
//没有权限会默认到登录页面,需要开启登录的页面,/login
http.formLogin();
//开启注销功能
http.logout();
//开启记住我,存了一个cookie,默认时长2周
http.rememberMe();
}
//认证,认证之后,授权的界面才能进行访问
//需要对密码进行加密,Java中有默认的MD5加密
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//这些数据正常应该从数据库中进行读取
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
.withUser("wyf").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2","vip3").and()
.withUser("csq").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1");
}
}
shiro的三层
shiro的内置过滤器
Shiro的具体实现
需要导入导入thymeleaf-extras-shiro依赖包
//实体类
@ApiModel("用户实体类")
public class user(){
@ApiModelProperty("用户名")
public String username;
@ApiModelProperty("密码")
public String password;
}
@Api(tags="纪念日祝福")
@RestController
@RequestMapping("/birthday/zhBirthdayBless")
public class ZhBirthdayBlessController extends JeecgController<ZhBirthdayBless, IZhBirthdayBlessService> {
@Autowired
private IZhBirthdayBlessService zhBirthdayBlessService;
@ApiOperation(value="纪念日祝福-分页列表查询", notes="纪念日祝福-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<ZhBirthdayBless>> queryPageList(ZhBirthdayBless zhBirthdayBless,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<ZhBirthdayBless> queryWrapper = QueryGenerator.initQueryWrapper(zhBirthdayBless, req.getParameterMap());
Page<ZhBirthdayBless> page = new Page<ZhBirthdayBless>(pageNo, pageSize);
IPage<ZhBirthdayBless> pageList = zhBirthdayBlessService.page(page, queryWrapper);
return Result.OK(pageList);
}
TaskScheduler 任务调度者
TaskExecutor 任务执行者
@EnableScheduling //开启定时功能的注解
@Scheduled //什么时候执行
在启动类上加上开启定时功能的注解@EnableScheduling
在方法上加上@Scheduled注解表示什么时候执行
@Service
public class ScheduledService{
//在特定一个时间执行这个方法
//cron表达式
//秒 分 时 日 月 周几
@Scheduled(cron = "30 15 10 * * ?")
public void hello(){
System.out.println("hello,你在每日的10点15分30秒被执行了")
}
}
Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为 String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。
RedisTemplate提供了redis各种操作。
springboot2.x以后,Lettuce是一个高性能基于Java编写的Redis驱动框架
RedisTemplate和StringRedisTemplate区别
StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。而stringredistemplate,默认存入的数据就是原文,因为stringRedistemplate默认使用的是string序列化策略。
RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。RedisTemplate默认使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示。
RPC:远程调用,是一种技术的概念名词。RPC可以通过 HTTP 来实现,也可以通过Socket自己实现一套协议来实现.所以题目可以换一种理解,为何 RPC 还有除 HTTP 之外的实现法,有何必要,毕竟除了HTTP实现外,私有协议不具备通用性。
RPC好处:如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了:首先就是长链接,不必每次通信都要像http一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。最后是安全性。
为stringRedistemplate默认使用的是string序列化策略。
RPC:远程调用,是一种技术的概念名词。RPC可以通过 HTTP 来实现,也可以通过Socket自己实现一套协议来实现.所以题目可以换一种理解,为何 RPC 还有除 HTTP 之外的实现法,有何必要,毕竟除了HTTP实现外,私有协议不具备通用性。
RPC好处:如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了:首先就是长链接,不必每次通信都要像http一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。最后是安全性。