美文网首页工作生活
SpringBoot_11 开发Web应用程序

SpringBoot_11 开发Web应用程序

作者: o______o | 来源:发表于2019-07-10 17:50 被阅读0次

    开发Web应用程序


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

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

    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<Customer> 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<MultipartFile>:接收多个文件上传
    中文乱码: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<B> 用于访问请求标头和正文。身体转换为HttpMessageConverter
    @SessionAttribute 用于访问任何会话属性,与由于类级@SessionAttributes声明而存储在会话中的模型属性相反。
    @RequestAttribute 用于访问请求属性。

    控制器常用方法返回值


    控制器常用方法返回值 描述
    @ResponseBody 返回值通过HttpMessageConverter实现转换并写入响应。
    HttpEntity<B>ResponseEntity<B> 指定完整响应(包括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应用程序

        本文链接:https://www.haomeiwen.com/subject/rloicctx.html