1.获取启动后的Spring容器
方式一:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
/**
* SpringBoot 程序启动后,返回值是 ConfigurableApplicationContext,它也是一个Spring 容器对象
* 其它相当于原来 Spring 中启动容器 ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("");
*/
//获取 SpringBoot 程序启动后的 Spring 容器
ConfigurableApplicationContext context =SpringApplication.run(Application.class, args);
//从 Spring 容器中获取指定 bean 的对象
UserService userService = (UserService)context.getBean("userServiceImpl");
//调用业务 bean 的方法
String sayHello = userService.sayHello();
System.out.println(sayHello);
}
}
方式二:
将原有 Application 类的@SpringBootApplication 注解注释掉,复制一 个新的 Application 取名为 Application2,实现 CommandLineRunner 接 口
@SpringBootApplication
public class Application2 implements CommandLineRunner {
//第二步:通过容器获取 bean,并注入给 userService
@Autowired
private UserService userService;
public static void main(String[] args) {
//第一步:SpringBoot 的启动程序,会初始化 spring 容器
SpringApplication.run(Application2.class,args);
}
//覆盖接口中的 run 方法
@Override
public void run(String... args) throws Exception {
//第三步:容器启动后调用 run 方法,在该方法中调用业务方法
String sayHello = userService.sayHello();
System.out.println(sayHello);
}
}
修改Banner---->banner.txt
1.SpringBoot 中使用拦截器
1.拦截器知识的回顾
拦截器的作用:可以在方法到达控制器之前进行校验。
拦截器的实现:
1.创建一个类,实现HandlerInterceptor
2.重写接口中的3个方法
preHandle:在方法控制器执行之前,先拦截。
返回false代表,拦截不执行控制器。
返回true,代表继续向下执行,执行控制器操作。
postHandle:在方法控制器执行之后,执行。
afterCompletion:页面加载完成后,执行。
作用:是否已经登录
2.应用
用户在第一次登陆的时候没有session,需要第二次登陆才有
1.Springboot.inteceptor
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//打印日志
System.out.println("拦截器方法执行啦...preHandle");
//判断当前用户是否已登录
String user = (String) request.getSession().getAttribute("user");
if(user == null ){
//如果未登录,返回false
System.out.println("用户未登录,请先登录");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//打印日志
System.out.println("拦截器方法执行啦...postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//打印日志
System.out.println("拦截器方法执行啦...afterCompletion");
}
}
2.spring.config
@Configuration
public class MyConfiguration implements WebMvcConfigurer {
/**
* 重写添加拦截器的方法
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截器的注册类
registry.addInterceptor(new MyInterceptor()). // 自定义拦截器添加
addPathPatterns("/user/findAll"). //要拦截的路径
excludePathPatterns("/user/login"); //要放行的路径
}
}
3.springboot.UserController
@RestController
@RequestMapping("/user")
public class UserController {
/**
* 未登录情况下可以访问
* @return
*/
@RequestMapping("/login")
public Object login(HttpSession session){
session.setAttribute("user","zhangsan");
return "用户已登录";
}
/**
* 登录请求下可以访问
* @return
*/
@RequestMapping("/findAll")
public Object findAll(){
List> list = new ArrayList<>();
for(int i=0;i<10;i++){
Map map = new HashMap<>();
map.put("id",i+"");
map.put("name","zhangsan"+i);
list.add(map);
}
return list;
}
}
2.SpringBoot使用Servlet 用的少
1.导入servlet 支持坐标
javax.servlet
javax.servlet-api
javax.servlet.jsp
javax.servlet.jsp-api
2.3.1
org.springframework.boot
spring-boot-starter-web
2.方式一:在启动类上加注解
1.启动类:
/*
* 扫描web组件注解
* 可以扫描servlet、filter、listener
*/
@ServletComponentScan(basePackages = "cn.ccut.springboot.web")
public class Application {
2.Controller
@WebFilter(urlPatterns = "/springboot/filter")
public class MyFilter extends HttpFilter {
@WebServlet(urlPatterns = "/myServlet")
public class MyServlet extends HttpServlet {
//Controller 里面的内容不变,
3.方式二:注册的方式
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
//----------------方式2:通过注册Bean的方法注册web组件-----------------
@Bean //就自动添加到当前容器了
public ServletRegistrationBean getServletRegistrationBean(){
//参数1,初始化的servlet对象
//参数2,urlPatterns
ServletRegistrationBean srb = new ServletRegistrationBean(new MyServlet(),"/springboot/servlet");
//两种方式是一样的
// srb.setServlet(new MyServlet());
// srb.addUrlMappings("/springboot/servlet");
return srb;
}
//拦截器
@Bean
public FilterRegistrationBean getFilterRegistrationBean(){
//参数1,初始化的Filter对象
//参数2,urlPatterns
FilterRegistrationBean frb = new FilterRegistrationBean();
frb.setFilter(new MyFilter());
frb.addUrlPatterns("/myFilter");
return frb;
}
}
3.设置项目的编码字符集
实现中文乱码过滤器
1.原先是通过在web.xml上加注解
characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
characterEncodingFilter
/*
2.现在的:
1.方式一:启动器类里
@ServletComponentScan(basePackages = "cn.ccut.springboot.web")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean(name = "characterEncodingFilter") // 让其注册容器不重名
public FilterRegistrationBean getCharacterEncodingFilterBean(){
//参数1,初始化的servlet对象
//参数2,urlPatterns
FilterRegistrationBean frb = new FilterRegistrationBean();
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
//强制使用
characterEncodingFilter.setForceEncoding(true);
//org.springframework.web.filter.CharacterEncodingFilter
frb.setFilter(characterEncodingFilter);
///*
frb.addUrlPatterns("/*");
return frb;
}
2.方式二:通过配置文件
#方式2:#设置请求响应的字符编码
spring.http.encoding.charset=utf-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
3.linux中运行jar包
linux
可以将该命令封装到一个 Linux 的一个 shell 脚本中(上线部署)
1.写一个 shell 脚本(run.sh):
#!/bin/sh
java -jar xxx.jar
2.赋权限 chmod 777 run.sh
3.启动 shell 脚本: ./run.sh
3.SpringBoot 集成logback日志
1.新建项目勾选web
2.导入依赖
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.0.0
mysql
mysql-connector-java
org.projectlombok
lombok
1.18.2
3.logback-spring.xml 放到resources 里面
debug
%date [%-5p] [%thread] %logger{60} [%file : %line] %msg%n
UTF-8
D:/log/p2p/p2p-web.log
%date [%-5p] %thread %logger{60} [%file : %line] %msg%n
D:/log/p2p/p2p-web.log.%d{yyyy-MM-dd}.log
30
4.使用:
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/findAll")
public Object findAll(){
List userList = userService.findAll();
System.out.println("userList:"+userList);
log.debug("userList"+userList); //使用
return userList;
}
}
5.lombok的使用
@Data 让当前的实体类,自动生成get set toString hashCode等方法