Spring学习(十七)——SpringBoot Web开发

用SpringBoot和我们之前用Spring + Spring MVC基本上是一样的用法,比如Controller层,AOP编程,拦截器,全局异常,文件上传下载等,当然,我们目前主要用的是SpringBoot的Restful接口调用,所以下面也已返回Restful方式的Controller为中心,进行案例演示。

一、Spring Boot Web基础开发

引入SpringBoot Web依赖

    <!-- SpringBoot web -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

Controller类

package cool.gjh.controller;

import cool.gjh.entity.Student;
import cool.gjh.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Controller层
 * <p>
 *     Restful风格,返回json数据
 * </p>
 * @author ACE_GJH
 */
@RestController
@RequestMapping("/student")
public class StudentController {

    @Autowired
    private StudentService studentService;

    @GetMapping(value = "/data")
    public Map<String, Object> showAll(){

        List<Student> students = studentService.getAllStudent();
        HashMap<String, Object> data = new HashMap<>(4*5/4, 0.8f);
        data.put("code", 200);
        data.put("msg", "OK");
        data.put("data", students);
        data.put("date", System.currentTimeMillis());
        return data;
    }

}

访问路径配置

application.yml

server:
  port: 80
  servlet:
    context-path: /test

测试

浏览器访问http://localhost/test/student/data
结果

二、拦截器开发

拦截器类

package cool.gjh.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 拦截器
 * <p>
 * 针对/student请求的拦截处理
 * </p>
 *
 * @author ACE_GJH
 */
@Component
public class StudentInterceptor implements HandlerInterceptor {
    /**
     * 请求最先经过的方法,在HandlerAdapter之前调用
     *
     * @param request  current HTTP request
     * @param response current HTTP response
     * @param handler  chosen handler to execute, for type and/or instance evaluation
     * @return {@code true} 放行请求;{@code false} 中断请求
     * @throws Exception in case of errors
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("StudentInterceptor:preHandle");
        return true;
    }

    /**
     * 请求在HandlerAdapter之后调用
     *
     * @param request      current HTTP request
     * @param response     current HTTP response
     * @param handler      handler (or {@link HandlerMethod}) that started asynchronous
     *                     execution, for type and/or instance examination
     * @param modelAndView the {@code ModelAndView} that the handler returned
     *                     (can also be {@code null})
     * @throws Exception in case of errors
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("StudentInterceptor:postHandle");
    }

    /**
     * 请求完成之后调用。
     * <p>注意:仅当此拦截器的{@code preHandle} 方法成功完成并返回{@code true}时才会调用!
     * <p>与{@code postHandle}方法一样,该方法将在链中的每个拦截器上以相反的顺序调用,因此第一个拦截器将是最后一个要调用的拦截器。
     *
     * @param request  current HTTP request
     * @param response current HTTP response
     * @param handler  handler (or {@link HandlerMethod}) that started asynchronous
     *                 execution, for type and/or instance examination
     * @param ex       exception thrown on handler execution, if any
     * @throws Exception in case of errors
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("StudentInterceptor:afterCompletion");
    }
}

配置拦截器

package cool.gjh.config;

import cool.gjh.interceptor.StudentInterceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 拦截器配置类
 *
 * @author ACE_GJH
 */
@Component
public class InterceptorConfig implements WebMvcConfigurer {


    /**
     * 添加拦截器
     *
     * @param registry 拦截器注册器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new StudentInterceptor())
                //定义拦截路径
                .addPathPatterns("/student/**");
    }
}

测试结果

测试结果

排除对特定请求路径的拦截

  /**
     * 添加拦截器
     *
     * @param registry 拦截器注册器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new StudentInterceptor())
                //定义拦截路径
                .addPathPatterns("/student/**")
                //排除该路径的拦截
                .excludePathPatterns("/student/data");

    }

三、war包方式部署

1. 排除内嵌tomcat

    <!-- 排除内嵌tomcat -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <scope>provided</scope>
    </dependency>

2. 配置入口类

  • 继承SpringBootServletInitializer类
  • 重写其configure()方法
package cool.gjh.app;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;

/**
 * SpringBoot入口类
 * <p>
 *     注意:war包部署需要继承SpringBootServletInitializer类,并重写configure()方法
 * </p>
 *
 * @author ACE_GJH
 */
@SpringBootApplication
@MapperScan("cool.gjh.dao")
@ComponentScan("cool.gjh")
public class App extends SpringBootServletInitializer
{
    public static void main( String[] args )
    {
        SpringApplication.run(App.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(App.class);
    }
}

3. 在Maven插件中指定入口类

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <!-- 增加JVM参数 -->
          <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
          <!-- 指定入口类 -->
          <mainClass>cool.gjh.app.App</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>

4. 修改打包方式

pom.xml
在该位置添加<packaging>war</packaging>

  <groupId>cool.gjh</groupId>
  <artifactId>springboot</artifactId>
  <version>1.0-SNAPSHOT</version>

  <packaging>war</packaging>

四、jar包方式部署

笔者在用war包部署的时候,在windows上的tomcat里部署没有一点问题,但在linux里部署的时候,总是报404,无奈,只能采用jar包方式直接部署运行了。

1. 配置Maven打包插件

pom.xml

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

2. package打jar包

3. 服务器部署、运行

在有java运行环境的服务器上部署,可以先用下面命名运行一下,看下效果:

java -jar springboot.jar

在这里插入图片描述
测试一下能否正常访问:
访问结果
可以看到,没有问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭建華

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值