SpringBoot_11 开发Web应用程序

开发Web应用程序


Spring Boot非常适合Web应用程序开发。您可以使用嵌入式Tomcat,Jetty,Undertow或Netty创建自包含的HTTP服务器。大多数Web应用程序使用该spring-boot-starter-web模块快速启动和运行。您还可以选择使用该spring-boot-starter-webflux模块构建响应式Web应用程序 。

        
            org.springframework.boot
            spring-boot-starter-web
        

Spring Web MVC框架


Spring Web MVC是一个丰富的“模型视图控制器” Web框架。简称Spring MVC且允许您绑定特殊的@Controller或@RestControllerbean注解来处理传入的HTTP请求。控制器中的方法通过使用@RequestMapping注解映射到HTTP 。

以下代码显示了@RestController注解为JSON数据提供服务的典型代码:

@RestController
@RequestMapping(value="/users")
public class MyRestController {

    @RequestMapping(value="/{user}", method=RequestMethod.GET)
    public User getUser(@PathVariable Long user) {
        // ...
    }

    @RequestMapping(value="/{user}/customers", method=RequestMethod.GET)
    List getUserCustomers(@PathVariable Long user) {
        // ...
    }

    @RequestMapping(value="/{user}", method=RequestMethod.DELETE)
    public User deleteUser(@PathVariable Long user) {
        // ...
    }

}

Spring MVC自动配置


自动配置在Spring的默认值之上添加很多功能,例如:

  • 静态index.html支持
  • 自定义Favicon支持
  • 支持提供静态资源

静态内容


默认情况下,Spring Boot从资源根目录或类根目录或src/main/resources/static目录中提供静态内容.

欢迎页面


Spring Boot支持静态和模板化欢迎页面。在src/main/resources/static目录下查找index文件或模板。如果找到任何一个,它将自动用作应用程序的欢迎页面

自定义Favicon


Spring Boot 在配置的静态内容位置和类路径的根(按此顺序)中查找favicon.ico 。如果存在这样的文件,它将自动用作应用程序的展示图标。

跨源资源共享


在Spring Boot应用程序中使用带有@CrossOrigin注解的控制器方法且不需要任何其他特定配置就可以实现跨域

其他方式


  • HttpMessageConverters
  • 自定义JSON序列化程序和反序列化程序
  • MessageCodesResolver
  • 路径匹配和内容协商
  • ConfigurableWebBindingInitializer
  • 模板引擎
  • 错误处理
  • 映射Spring MVC之外的错误页面
  • Spring HATEOAS
  • Spring WebFlux框架
  • Spring WebFlux自动配置
  • 带有HttpMessageReaders和HttpMessageWriters的HTTP编解码器
  • 嵌入式Servlet容器支持
  • 程序化定制
  • 嵌入式Reactive Server支持
  • Reactive Server资源配置

下面的内容出自Spring Web MVC

带注解的控制器


Spring MVC提供基于注解的编程模型,其中@Controller和 @RestController组件使用注释来表达请求映射,请求输入,异常处理等。带注解的控制器具有灵活的方法签名,不必扩展基类,也不必实现特定的接口。以下示例显示了由注释定义的控制器:

get http://localhost:8080/hello?par=test
@Controller
public class HelloController {

    @GetMapping("/hello")
    public String handle(HttpServletRequest request, String par) {
        // others
        return "index";
    }
}

文件上传下载:最简化


@RestController
public class FileUploadController {

    @Value("${file.base.path}")
    String filePath;
    
    @PostMapping("/fileUp")
    public String getName(String fileName, MultipartFile fileUpload){
        String uid = UUID.randomUUID().toString().replace('-','x');
        if ( fileUpload.isEmpty() == false) {
            try {
                Path basePath = Paths.get(filePath+"file/");
                if(Files.notExists(basePath)) Files.createDirectory(basePath);
                fileUpload.transferTo(new File(filePath+"file/"+uid+fileName));
            } catch (IllegalStateException | IOException e) {
                e.printStackTrace();
            }
        }else{
            return "null";
        }
        return "filePath/"+uid+fileName;
    } 
    @GetMapping("/fileLoad")
    public void handleFormUpload(HttpServletResponse response) {
        try{
            OutputStream outputStream = response.getOutputStream();
            response.setContentType("application/x-download");
            response.addHeader("Content-Disposition","attachment;filename=name.txt");
            Files.copy(Paths.get(filePath+"file/name.txt"),outputStream );
            outputStream.flush();
            outputStream.close();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

transferTo(File):转存文件
List:接收多个文件上传
中文乱码:new String(name.getBytes("UTF-8"),"iso-8859-1");
application/x-download:设置内容类型为下载类型
Content-Disposition,attachment;filename=name:设置文件下载提示和文件名

重定向


redirect:原请求数据丢失

@Controller
public class HelloController {
    @GetMapping("/red")
    public String toRedict(HttpServletResponse response) {
        return "redirect:/boss.html";
    }
}

转发


forward:原数据还在

@Controller
public class HelloController {
    @GetMapping("/for")
    public String toForwerd(HttpServletResponse response) {
        return "forward:/client.html";
    }
}

重定向和转发的页面都是在资源下的static静态目录下的html页面,斜杠开头代表根目录开始

请求映射


你可以使用 @RequestMapping注解将请求映射到控制器方法上。它具有各种属性,可通过URL,HTTP方法,请求参数,标头和媒体类型进行匹配。您可以在类级别使用它来表示共享映射,或者在方法级别使用它来缩小到特定的端点映射。

还有HTTP方法特定的快捷方式变体@RequestMapping(默认情况下,它与所有HTTP方法匹配):
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
您可以使用以下全局模式和通配符映射请求:

  • ?匹配一个字符
  • *匹配路径段中的零个或多个字符
  • **匹配零个或多个路径段

控制器常用方法参数


控制器方法请求参数 描述
javax.servlet.ServletRequest, javax.servlet.ServletResponse 选择任何特定的请求或响应类型-例如ServletRequest,HttpServletRequest或Spring的MultipartRequest,MultipartHttpServletRequest。
javax.servlet.http.HttpSession 强制进行会话。因此,这种论点永远不会null。请注意,会话访问不是线程安全的。如果允许多个请求同时访问会话,请考虑将RequestMappingHandlerAdapter实例的synchronizeOnSession标志设置为 true。
HttpMethod 请求的HTTP方法
@PathVariable 用于访问URI模板变量
@RequestParam 用于访问Servlet请求参数,包括多部分文件。参数值将转换为声明的方法参数类型。请注意,@RequestParam对于简单参数值,使用是可选的
@RequestHeader 用于访问请求标头。标头值将转换为声明的方法参数类型。
@CookieValue 用于访问cookie。Cookie值将转换为声明的方法参数类型。
@RequestBody 用于访问HTTP请求正文。通过使用HttpMessageConverter实现将正文内容转换为声明的方法参数类型。
HttpEntity 用于访问请求标头和正文。身体转换为HttpMessageConverter
@SessionAttribute 用于访问任何会话属性,与由于类级@SessionAttributes声明而存储在会话中的模型属性相反。
@RequestAttribute 用于访问请求属性。

控制器常用方法返回值


控制器常用方法返回值 描述
@ResponseBody 返回值通过HttpMessageConverter实现转换并写入响应。
HttpEntityResponseEntity 指定完整响应(包括HTTP标头和正文)的返回值将通过HttpMessageConverter实现进行转换并写入响应。
HttpHeaders 用于返回带标题且没有正文的响应。
String 要使用ViewResolver实现解析的视图名称,并与隐式模型一起使用 - 通过命令对象和@ModelAttribute方法确定。处理程序方法还可以通过声明Model参数以编程方式丰富模型
View View实例以使用用于与所述隐式模型一起渲染-通过命令对象和确定@ModelAttribute方法。处理程序方法还可以通过声明Model参数以编程方式丰富模型
java.util.Maporg.springframework.ui.Model 要添加到隐式模型的属性,通过RequestToViewNameTranslator隐式确定视图名称。
@ModelAttribute 要添加到模型的属性,通过a隐式确定视图名称RequestToViewNameTranslator。请注意,这@ModelAttribute是可选的。请参见本表末尾的“任何其他返回值”。
ModelAndView 要使用的视图和模型属性,以及(可选)响应状态。
void 具有void返回类型(或null返回值)的方法被认为已完全处理响应(如果它还具有a ServletResponseOutputStream参数或@ResponseStatus注释)。如果控制器已进行正检查ETaglastModified时间戳检查,也是如此,如果以上都不是,则void返回类型还可以指示REST控制器的“无响应主体”或HTML控制器的默认视图名称选择。

URI变量


您可以在类和方法级别声明URI变量,如以下示例所示:

@Controller
@RequestMapping("/owners/{ownerId}")
public class OwnerController {

    @GetMapping("/pets/{petId}")
    public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
        // ...
    }
}

URI变量会自动转换为适当的类型,或者TypeMismatchException 被引发。简单类型(int,long,Date,等)默认支持,你可以注册任何其它数据类型的支持。

您可以显式命名URI变量(例如,@PathVariable("customId"))

语法{varName:regex}声明一个URI变量,其正则表达式的语法为{varName:regex}。例如,给定URL "/spring-web-3.0.5 .jar",以下方法提取名称,版本和文件扩展名:

@GetMapping("/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}")
public void handle(@PathVariable String name, @PathVariable String version, @PathVariable String ext) {
    // ...
}

URI路径模式还可以具有嵌入式${…​}占位符,这些占位符在启动时通过使用PropertyPlaceHolderConfigurer针对本地,系统,环境和其他属性源来解析。例如,您可以使用此参数来基于某些外部配置参数化基本URL。

使用consumes属性通过内容类型缩小映射范围


@PostMapping(path = "/pets", consumes = "application/json") 
public void addPet(@RequestBody Pet pet) {
    // ...
}

该consumes属性还支持否定表达式 - 例如,!text/plain表示除了以外的任何内容类型text/plain

对应关系


@GetMapping对应@RequestMapping(method=HttpMethod.GET)
@PostMapping,@PutMapping,@DeleteMapping,和@PatchMapping等都有此对应

@RequestParam,@RequestHeader,@PathVariable,@MatrixVariable,和@CookieValue)可以要求类型转换如果参数被声明为比其它的东西String。

对于此类情况,将根据配置的转换器自动应用类型转换

@GetMapping("/demo")
public void handle(@CookieValue("JSESSIONID") String cookie) { 
    //...
}

你可能感兴趣的:(SpringBoot_11 开发Web应用程序)