springboot(三)

springboot创建非WEB工程

方式一:main方法中取spring容器,调用业务层bean

application.java

@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);
	}
}

方式二:入口类实现CommandLineRunnable接口

application.java

@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);
	}
}

springboot拦截器

ssm配置文件中怎么使用拦截器

  1. 定义拦截器类实现HandlerInterceptor接口,重写preHandle ,postHandle,afterCompletion三个方法
public class UserInterceptor implements HandlerInterceptor {
	@Override
	public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
		//编写登录拦截业务逻辑
		//返回 true 通过
		//返回 false 被拦截
		System.out.println("--------登录拦截器---------");
		return true;
	}
	@Override
	public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
	
	}
	@Override
	public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) throws Exception {
	
	}
}
  1. dispatcherServlet.xml配置文件,注册拦截器
    在这里插入图片描述

springboot拦截器(2步)

  1. 定义拦截器类,这一步不变,实现HandlerInterceptor接口,重写三个方法
public class UserInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String data = (String) request.getSession().getAttribute("data");
        /*
		这里的StringUtils和ObjectUtils来自commons-lang3依赖
		<dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
		*/
        if (StringUtils.equals("", data)|| !ObjectUtils.allNotNull(data)) {
            response.sendRedirect(request.getContextPath()+"/llerror");
            return false;
        }
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}
  1. 定义配置类,这个类相当于配置文件对拦截器的注册,@Configuration表示当前类是配置类 ,需要实现WebMvc Configurer 接口,重写addInterceptors方法
    IntercepterConfig.java
@Configuration
public class IntercepterConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        String [] addPath = { "/user/add","/user/center","/user/loan/**"};
        String [] excludePath={"/user/loan/loanInfo"};
		//       addInterceptor注册拦截器          addPathPatterns需要拦截的请求   excludePathPatterns拦截请求中可以排除的请求
        registry.addInterceptor(new UserInterceptor()).addPathPatterns(addPath).excludePathPatterns(excludePath);
    }
}
  1. 控制层发送请求,测试
    UserController.java
@Controller
public class UserController {

	//可以显示
    @RequestMapping("/user/loan/loanInfo")
    public @ResponseBody Object loanInfo() {
        return "loanInfo 进来了,没被拦截";
    }
	//被拦截
    @RequestMapping("/user/add")
    public @ResponseBody Object add() {
        return "add 进来了";
    }
    //被拦截
    @RequestMapping("/user/loan")
    public @ResponseBody Object loan() {
        return "loan 进来了";
    }
    //不能使用error请求,使用/error请求会报BeanCreateException异常
    @RequestMapping("/llerror")
    public @ResponseBody Object loan() {
        return "error 进来了";
    }
}

springboot使用servlet

注解扫描方式

  1. controller层,使用@WebServlet注解,参数使用urlPatterns表示接收的请求,需要继承HttpServlet类,重写doGet和doPost方法
@WebServlet(urlPatterns = "/myServlet")
public class MyServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {
		response.getWriter().print("My SpringBoot Servlet");
		response.getWriter().flush();
		response.getWriter().close();
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {
		doGet(request,response);
	}
}
  1. 在主应用程序 Application 类上添加@ServletComponentScan(“com.abc.springboot.servlet”)
    @ServletComponentScan 表示扫描@WebServlet注解,当然它不仅仅可以扫描servlet注解
@SpringBootApplication
@ServletComponentScan(basePackages = "com.abc.springboot.servlet")
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}
  1. 运行
    在这里插入图片描述

配置类方式

  1. 创建一个普通的Servlet,注意这里不需要加@WebServlet注解
public class MyServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.getWriter().print("Hello,SpringBoot Servlet!");
		resp.getWriter().flush();
		resp.getWriter().close();
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req,resp);
	}
}
  1. 编写配置类,注册servlet,这个配置类就相当于原先的配置文件web.xml。@Configuration注解表示这个类是配置类,ServletRegistrationBean 就是Servlet注册实体bean(字面意思),需要@Bean注解修饰
@Configuration //这个注解表示将此类作为配置类
public class ServletConfig {
	//@Bean 是一个方法级别上的注解,主要用在配置类里
	/*
	* 相当于一个<beans>
	* <bean id="" class=""/>
	* </beans>
	* */
	@Bean
	public ServletRegistrationBean myServletRegistrationBean() {
		//将自定义 servlet 注册到注册 Servlet 类中,并指定访问路径
		ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new MyServlet(), "/springboot/myServlet");
		return servletRegistrationBean;
	}
}
  1. 运行
    在这里插入图片描述

springboot使用Filter

注解扫描方式

  1. 通过注解方式创建一个 Filer,在过滤器类上面加上注解@WebFilter,和@WebServlet一样,urlPattern表示过滤请求,需要重写doFilter方法,当然它没有配置类
@WebFilter(urlPatterns = "/springboot/myFilter")
public class MyFilter implements Filter {
	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
		System.out.println("-------------您已进入过滤器---------------");
		filterChain.doFilter(servletRequest,servletResponse);
	}
}
  1. 在 主 应 用 程 序 Application 类 上 添 加@ServletComponentScan("basePackages = “com.abc.springboot.filter”),扫描@WebFilter注解
@ServletComponentScan(basePackages = "com.abc.springboot.filter")
@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}
  1. 运行
    过滤/springboot/myFilter 请求
    在这里插入图片描述

配置类方式

  1. 创建 MyFilter 类,实现Filter接口,实现doFilter方法
public class MyFilter implements Filter {
	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
		System.out.println("---------------通过配置类注册过滤器-------------------");
		filterChain.doFilter(servletRequest,servletResponse);
	}
}
  1. 编写一个 FilterConfig配置类 ,在该类中注册 Filter,使用@Configuration 声明 这个类是配置类,FilterRegistrationBean 表示过滤器注册实体bean,使用@Bean 注解声明
@Configuration //定义为配置类
public class FilterConfig {
	@Bean
	public FilterRegistrationBean myFilterRegistration() {
		//注册过滤器
		FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());
		//添加过滤路径
		filterRegistrationBean.addUrlPatterns("/springboot/*","/user/*");
		return filterRegistrationBean;
	}
}
  1. 运行
    在这里插入图片描述

springboot配置字符编码

配置类方式

  1. 创建一个 Servlet:MyServlet.java
public class MyServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
		resp.getWriter().print("Hello World,世界您好!");
		//设置浏览器编码格式
		resp.setContentType("text/html;character=utf-8");
		resp.getWriter().flush();
		resp.getWriter().close();
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
		doGet(req, resp);
	}
}
  1. 创建配置类 SystemConfig
@Configuration //设置为配置类
public class SystemConfig {
	@Bean
	public ServletRegistrationBean myServletRegistration() {
		ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new MyServlet(),
		"/springboot/myServlet");
		return servletRegistrationBean;
	}
	@Bean
	public FilterRegistrationBean characterFilterRegistration() {
		//设置字符编码过滤器
		//CharacterEncoding 是由 Spring 提供的一个字符编码过滤器,之前是配置在web.xml 文件中
		CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
		//强制使用指定字符编码
		characterEncodingFilter.setForceEncoding(true);
		//设置指定字符编码
		characterEncodingFilter.setEncoding("UTF-8");
		//创建过滤器注册 bean
		FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
		//设置字符编码过滤器
		filterRegistrationBean.setFilter(characterEncodingFilter);
		//设置字符编码过滤器路径
		filterRegistrationBean.addUrlPatterns("/*");
		return filterRegistrationBean;
	}
}
#关闭 springboot 的 http 字符编码支持
#只有关闭该选项后,spring 字符编码过滤器才生效
spring.http.encoding.enabled=false
  1. 测试
    无字符编码过滤器
    在这里插入图片描述
    使用字符编码过滤器
    在这里插入图片描述
    在 servlet 中添加 response.setContextType(“text/html;charset=utf-8”) 指定浏览器编码方式

配置文件(推荐使用)

  1. 主配置文件字符编码设置
#设置请求响应的字符编码
spring.http.encoding.enabled=true
spring.http.encoding.force=true
spring.http.encoding.charset=UTF-8
  1. 创建Servlet
public class MyServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.getWriter().print("Hello World!世界您真好!");
		resp.setContentType("text/html;character=utf-8");
		resp.getWriter().flush();
		resp.getWriter().close();
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}
  1. 创建配置类 ServletConfig
@Configuration
public class ServletConfig {
	@Bean
	public ServletRegistrationBean myServletRegistration() {
		ServletRegistrationBean servletRegistrationBean =new ServletRegistrationBean(new MyServlet(),"/myservlet");
		return servletRegistrationBean;
	}
}
  1. 测试
    未添加字符编码设置
    在这里插入图片描述
    已添加字符编码设置
    在这里插入图片描述

Springboot打包与部署

默认 SpingBoot 提供的打包插件版本为 2.2.2.RELEASE ,这个版本打的 jar 包 包 jsp 不能访问,为我们这里修改为 1.4.2.RELEASE
(附:一般情况下javaweb项目部署

war打包与部署

使用idea创建web项目时默认打成jar包,如果想打成war包,有两种方式:

  1. 创建时packaging 选择war,打包时会打成war包
  2. pom.xml文件中有标签<packaging>jar</packaging>,将jar改成war,如果没有就加上<packaging>war</packaging>打成war包
    在这里插入图片描述
    打包插件maven在项目创建时自动添加,通过package指令把项目打包,生成的包在target目录下:项目名.war

部署:

  1. 如果项目中需要开启redis服务、mysql服务、zookeeper服务,要提前开启
  2. 将war放在Tomcat安装目录的webapp文件夹下,在bin目录下启动服务
  3. 在地址栏输入请求格式:IP地址:8080//war包名称/项目请求

jar打包与部署

项目创建时默认打jar包,在pom.xml文件中显示<packaging>jar</packaging>或者不显示项目都是默认打jar包
打包插件在项目创建时自动添加maven插件,可以通过maven的package指令打包项目
部署

  1. 如果项目中需要开启redis服务、mysql服务、zookeeper服务,要提前开启
  2. 将jar放在任意位置,在dos命令窗口切换到jar包所在文件目录,使用java -jar jar包包名 即可运行程序
  3. 在地址栏输入请求格式(与war包请求不同的是,不需要添加包名在地址栏):IP地址:8080//项目请求

springboot集成logback日志

  1. pom.xml文件添加日志依赖lombok
<dependency>
 	<groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
  1. 安装日志插件
    idea使用快捷键ctrl+alt+s 打开settings ,在Plugins的市场(Marketplace)搜索lombok,并进行安装,重启idea
  2. 日志配置文件logback-spring.xml
    Spring Boot 官方推荐优先使用带有 -spring 的文件名作为你的日志配置。默认的命名规则,并且放在 src/main/resources 下如果你即想完全掌控日志配置,但又不想用 logback.xml 作为 Logback 配置的名字,application.properties可以通过 logging.config 属性指定自
    定义的名字:
logging.config=classpath:logging-config.xml

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
	<!-- 日志级别从低到高分为 TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如
	果设置为 WARN,则低于 WARN 的信息都不会输出 -->
	<!-- scan:当此属性设置为 true 时,配置文件如果发生改变,将会被重新加载,默认值为
	true -->
	<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默
	认单位是毫秒。当 scan 为 true 时,此属性生效。默认的时间间隔为 1 分钟。 -->
	<!-- debug:当此属性设置为 true 时,将打印出 logback 内部日志信息,实时查看
	logback 运行状态。默认值为 false。通常不打印 -->
	<configuration scan="true" scanPeriod="10 seconds">
	<!--输出到控制台-->
	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
		<!--此日志 appender 是为开发使用,只配置最底级别,控制台输出的日志级别是
		大于或等于此级别的日志信息-->
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>debug</level>
		</filter>
		<encoder>
			<Pattern>%date [%-5p] [%thread] %logger{60} [%file : %line] %msg%n</Pattern>
			<!-- 设置字符集 -->
			<charset>UTF-8</charset>
		</encoder>
	</appender>
	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!--<File>/home/log/stdout.log</File>-->
		<File>D:/log/stdout.log</File>
		<encoder>
			<pattern>%date [%-5p] %thread %logger{60} [%file : %line] %msg%n</pattern>
		</encoder>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 添加.gz 历史日志会启用压缩 大大缩小日志文件所占空间 -->
			<!--<fileNamePattern>/home/log/stdout.log.%d{yyyy-MM-
			dd}.log</fileNamePattern>-->
			<fileNamePattern>D:/log/stdout.log.%d{yyyy-MM-dd}.log</fileNamePattern>
			<maxHistory>30</maxHistory><!-- 保留 30 天日志 -->
		</rollingPolicy>
	</appender>
	<logger name="com.abc.springboot.mapper" level="DEBUG" />
	<root level="INFO">
		<appender-ref ref="CONSOLE"/>
		<appender-ref ref="FILE"/>
	</root>
</configuration>
  1. 在需要使用日志的类名上添加注解@Slf4j (一般针对 DAO 的包进行 DEBUG 日志设置),在方法中直接使用Logger对象log 显示info,error,warn,debug等信息:log.info(String);log.error(String);log.warn(String);log.debug(String)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值