中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring?Boot中怎么使用Spring?MVC

發布時間:2023-05-08 15:19:55 來源:億速云 閱讀:187 作者:iii 欄目:開發技術

本篇內容主要講解“Spring Boot中怎么使用Spring MVC”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Spring Boot中怎么使用Spring MVC”吧!

1.MVC

MVC 是一種常見的軟件設計模式,用于分離應用程序的不同部分以實現松散耦合和高內聚性。MVC 模式由三個核心組件組成:

  • 模型(Model):表示應用程序的數據和業務邏輯。模型處理應用程序的數據,并根據控制器的指令執行相應的操作。

  • 視圖(View):提供模型數據的用戶界面。視圖通常是模板、HTML 頁面、XML 文件或其他格式,可以呈現模型數據給用戶。

  • 控制器(Controller):處理用戶交互并更新模型和視圖。控制器負責接收來自視圖的用戶輸入,對模型進行相應的操作,并更新視圖以反映更改。

MVC 模式的優點是可以將代碼分離成三個獨立的組件,使得應用程序更易于維護和擴展。例如,如果要更改視圖的外觀,可以修改視圖而不影響模型和控制器;如果要更改數據存儲方式,可以修改模型而不影響視圖和控制器。同時,MVC 模式還有助于降低應用程序中的耦合度,使得各組件更加獨立和可重用。

2.Spring MVC

在Spring體系下的MVC架構中一次請求處理的流程如下:

請求到控制器(controller),經過業務模型(model)處理后返回響應給識圖層。

Spring?Boot中怎么使用Spring?MVC

整個流程里面Spring MVC干了些啥:

整個Spring MVC的核心是DispatcherServlet,圍繞DispatcherServlet SpringMVC提供了一套組件配合DispatcherServlet完成整個工作流程。

DispatcherServlet 首先收到請求,將請求映射到對應的處理器(controller)上,映射到controller的時候會觸發攔截器;處理器處理完后封裝數據模型,交給視圖解析器將數據模型解析為對應的視圖返回給前端。

Spring?Boot中怎么使用Spring?MVC

當然有時候以上流程不會全部走完,比如使用@RestController或者@ResponseBody的時候由于直接返回響應了,不會轉跳識圖,所以不會走視圖解析器。

3.Spring Boot中使用Spring MVC

3.1.配置

因為Spring Boot自動裝配機制的存在,一般來說我們不需要對Spring MVC進行配置,如果要進行特別定制化的配置,Spring Boot也支持配置文件或者編寫代碼的兩種方式來進行配置。

3.1.1.文件配置

# 啟用Spring MVC
spring.mvc.enabled=true

# 配置靜態資源路徑
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/

# 配置視圖解析器
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

# 配置HTTP緩存
spring.resources.cache.period=3600

# 配置文件上傳
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

# 配置JSON序列化
spring.jackson.serialization.indent_output=true
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

# 配置異常處理
server.error.whitelabel.enabled=false

# 配置攔截器
spring.mvc.interceptor.exclude-path-patterns=/login,/logout
spring.mvc.interceptor.include-path-patterns=/admin/**

# 配置會話管理
server.session.timeout=1800
server.session.cookie.max-age=1800

3.1.2.代碼配置
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
 
    // 配置視圖解析器
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        registry.viewResolver(resolver);
    }
 
    // 配置靜態資源
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");
    }
 
    // 配置攔截器
    @Autowired
    private MyInterceptor myInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor).addPathPatterns("/**");
    }
 
    // 配置消息轉換器
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        List<MediaType> supportedMediaTypes = new ArrayList<MediaType>();
        supportedMediaTypes.add(MediaType.APPLICATION_JSON);
        converter.setSupportedMediaTypes(supportedMediaTypes);
        converters.add(converter);
    }
 
    // 配置異常處理器
    @ControllerAdvice
    public class GlobalExceptionHandler {
        @ExceptionHandler(value = Exception.class)
        public ModelAndView handleException(HttpServletRequest req, Exception e) {
            ModelAndView mav = new ModelAndView();
            mav.addObject("exception", e);
            mav.addObject("url", req.getRequestURL());
            mav.setViewName("error");
            return mav;
        }
    }
 
    // 配置跨域資源共享(CORS)
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**").allowedOrigins("http://localhost:8080");
    }
 
    // 配置文件上傳
    @Bean
    public MultipartResolver multipartResolver() {
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        resolver.setMaxUploadSize(10485760);
        resolver.setMaxInMemorySize(4096);
        return resolver;
    }
 
    // 配置請求緩存
    @Bean
    public KeyGenerator keyGenerator() {
        return new DefaultKeyGenerator();
    }
 
    @Bean
    public RequestCache requestCache() {
        return new HttpSessionRequestCache();
    }
 
    // 配置視圖控制器
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/login").setViewName("login");
    }
}

3.2.使用

3.2.1.映射處理器

這里只介紹@RequestMapping,@GETMapping和@PostMapping類似。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
	
    String name() default "";
    
    @AliasFor("path")
    String[] value() default {};
	
    @AliasFor("value")
    String[] path() default {};
 
    RequestMethod[] method() default {};
 
    String[] params() default {};
 
    String[] headers() default {};
 
    String[] consumes() default {};
 
    String[] produces() default {};
}

各參數的作用如下:

  • value和path:用于指定請求的URL路徑,可以使用占位符和正則表達式。

  • method:指定HTTP請求方法,可以是GET、POST、PUT、DELETE等。

  • params:指定請求參數的條件,支持表達式、多個參數和邏輯運算。

  • headers:指定請求頭的條件,支持表達式、多個頭和邏輯運算。

  • consumes:指定請求的MIME類型,用于限制請求內容類型。

  • produces:指定響應的MIME類型,用于限制響應內容類型。

  • name:指定請求參數的名稱,用于自動綁定參數值。

  • defaultValue:指定請求參數的默認值。

  • pathVariable:用于綁定URL路徑中的占位符。

  • required:指定請求參數是否為必須的。

  • value、method、params、headers、consumes和produces屬性都支持數組形式,可以匹配多個條件。

3.2.2.傳參

1.按參數名匹配

@Controller
@RequestMapping("/user")
public class UserController {
    
    @RequestMapping("/info")
    public String getUserInfo(Integer userId, Model model) {
        // 根據用戶ID查詢用戶信息并返回
        User user = userService.getUserById(userId);
        model.addAttribute("user", user);
        return "user_info";
    }
}

URL:

ip:port/info?userId=1

2.@RequestParam

通過@RequestParam注解可以指定匹配的參數.

@Controller
@RequestMapping("/user")
public class UserController {
    
    @RequestMapping(value = "/search", method = RequestMethod.GET, params = "keyword")
    public String searchUser(@RequestParam("keyword") String keyword, Model model) {
        // 根據關鍵詞查詢用戶信息并返回
        List<User> userList = userService.searchUser(keyword);
        model.addAttribute("userList", userList);
        return "user_list";
    }
}

3.傳數組

@RequestMapping("/delete")
public String deleteUsers(int[] userIds, Model model) {
    // 根據用戶ID數組刪除多個用戶,并返回用戶列表頁面
    userService.deleteUsers(userIds);
    List<User> userList = userService.getUserList();
    model.addAttribute("userList", userList);
    return "user_list";
}

4.傳JSON

傳JSON只能用POST方法,使用@ResponseBody注解參數列表中的參數,就可以用來接收JSON,如果被注解的參數是個對象那么會將JSON自動轉化為改對象。

@RequestMapping(value = "/save", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> saveUser(@RequestBody User user) {
    // 保存用戶信息,并返回成功的響應
    userService.saveUser(user);
    return Collections.singletonMap("success", true);
}

注意傳參的時候要將設置好contentType: "application/json"

5.Restful

@Controller
@RequestMapping("/user")
public class UserController {
    
    @RequestMapping("/info/{id}")
    public String getUserInfo(@PathVariable("id") Integer userId, Model model) {
        // 根據用戶ID查詢用戶信息并返回
        User user = userService.getUserById(userId);
        model.addAttribute("user", user);
        return "user_info";
    }
}

前端URL為:

ip:port/info/1

3.2.3.參數轉換

當后端接口的參數列表是對象類型時,Spring MVC會自動按照參數名完成參數的轉換和填充,當然這種轉化規則也可以由我們自己定義,Spring MVC為我們準備了轉換接口,以下是一個完整示例:

實體對象:

public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
    // 省略 getter 和 setter 方法
}

參數轉換器:

public class UserConverter implements Converter<String, User> {
 
    @Override
    public User convert(String source) {
        // 將請求參數解析為User對象
        String[] values = source.split(",");
        User user = new User();
        user.setId(Long.parseLong(values[0]));
        user.setName(values[1]);
        user.setAge(Integer.parseInt(values[2]));
        user.setEmail(values[3]);
        return user;
    }
}

注冊參數轉換器:

@Configuration
public class WebConfig implements WebMvcConfigurer {
 
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new UserConverter());
    }
}

以后再傳對應類型的參數時,會用我們自定義的轉換規則來進行轉換:

@RequestMapping(value = "/save", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> saveUser(User user) {
    // 保存用戶信息,并返回成功的響應
    userService.saveUser(user);
    return Collections.singletonMap("success", true);
}
3.2.4.數據校驗

有時候我們希望前端傳過來的參數是滿足一定格式的,Spring MVC也考慮到了這一點,為我們提供了基于注解的參數校驗功能。

public class User {
    @NotNull(message = "id不能為空")
    private Long id;
 
    @NotBlank(message = "name不能為空")
    private String name;
 
    @Min(value = 0, message = "age不能小于0")
    @Max(value = 150, message = "age不能大于150")
    private Integer age;
 
    @Email(message = "email格式不正確")
    private String email;
 
    // 省略 getter 和 setter 方法
}

只是使用了注解,校驗并不會生效,還需要在想要進行校驗的地方配上@Validated開啟校驗:

public class User {
    @NotNull(message = "id不能為空")
    private Long id;
 
    @NotBlank(message = "name不能為空")
    private String name;
 
    @Min(value = 0, message = "age不能小于0")
    @Max(value = 150, message = "age不能大于150")
    private Integer age;
 
    @Email(message = "email格式不正確")
    private String email;
 
    // 省略 getter 和 setter 方法
}
3.2.5.數據模型

Spring MVC 中的數據模型用于在處理器方法(Controller)和視圖之間傳遞數,有三種:

  • Model

  • ModelMap

  • ModelAndView

Model:

只能承載參數

@GetMapping("/hello")
public String hello(Model model) {
    model.addAttribute("message", "Hello, world!");
    return "hello";
}

ModelMap:

和Model功能相似。

@GetMapping("/hello")
public String hello(ModelMap model) {
    model.put("message", "Hello, world!");
    return "hello";
}

ModelAndView:

既能承載參數也能承載視圖名。

@GetMapping("/hello")
public ModelAndView hello() {
    ModelAndView mav = new ModelAndView("hello");
    mav.addObject("message", "Hello, world!");
    return mav;
}
3.2.6.視圖和解析器

1.視圖

Spring MVC的視圖可以理解為最終返給前端的東西,分為兩類:

  • 邏輯視圖

  • 非邏輯視圖

邏輯視圖:

邏輯視圖是指一個字符串,它代表了一個視圖的邏輯名稱,與實際的視圖實現解耦合,而是通過視圖解析器將其映射為實際的視圖。在 Spring MVC 中,處理器方法可以返回邏輯視圖名,由 DispatcherServlet 根據視圖解析器的配置,將其映射為實際的視圖。

常用的邏輯視圖包括:

  • JSP 視圖:使用 InternalResourceViewResolver 視圖解析器,將邏輯視圖名映射為 JSP 文件名。

  • Velocity 視圖:使用 VelocityViewResolver 視圖解析器,將邏輯視圖名映射為 Velocity 模板文件名。

  • Thymeleaf 視圖:使用 ThymeleafViewResolver 視圖解析器,將邏輯視圖名映射為 Thymeleaf 模板文件名。

非邏輯視圖:

非邏輯視圖是指一個具體的視圖實現,通常是一個視圖類或者一個 RESTful Web Service。在處理器方法中,可以直接返回一個非邏輯視圖,它會被直接渲染,而不需要通過視圖解析器進行轉換。

常用的非邏輯視圖包括:

  • JSON 視圖:使用 MappingJackson2JsonView 視圖實現,將模型數據轉換為 JSON 格式返回給客戶端。

  • XML 視圖:使用 MappingJackson2XmlView 視圖實現,將模型數據轉換為 XML 格式返回給客戶端。

  • PDF 視圖:使用 iText PDF 庫和 AbstractPdfView 視圖實現,將模型數據轉換為 PDF 格式返回給客戶端。

需要注意的是,非邏輯視圖通常需要進行額外的配置和處理,比如 JSON 視圖需要添加 Jackson 依賴庫,并在 Spring 配置文件中配置 MappingJackson2JsonView 視圖解析器。

2.視圖解析器

視圖解析器決定@Controller的return具體映射到什么類型的視圖上,默認是使用InternalResourceViewResolver視圖解析器,也就是JSP視圖解析器,當我們配置好前綴、后綴后,它會自動將@Controller的return映射到對應的jsp上去。

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

當然在Spring Boot中也支持我們切換視圖解析器,以下是切換為JSON視圖解析器的示例,切換為JSON視圖解析器后return會直接返回JSON給前端:

@Configuration
@EnableWebMvc
public class AppConfig implements WebMvcConfigurer {
 
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}
3.2.7.攔截器

Spring Boot中使用自定義Spring MVC攔截器鏈的代碼如下:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new FirstInterceptor());
        registry.addInterceptor(new SecondInterceptor());
    }
}
 
public class FirstInterceptor implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 在處理器處理請求之前執行
        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 {
        // 在渲染視圖之后執行
    }
}
 
public class SecondInterceptor implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 在處理器處理請求之前執行
        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 {
        // 在渲染視圖之后執行
    }
}

到此,相信大家對“Spring Boot中怎么使用Spring MVC”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

册亨县| 会同县| 麻江县| 临邑县| 西青区| 绍兴县| 泰兴市| 安远县| 淳安县| 保亭| 姚安县| 宜州市| 清流县| 榆中县| 合川市| 历史| 汉寿县| 元江| 青州市| 广元市| 衡水市| 阳东县| 东乡| 葫芦岛市| 余庆县| 华亭县| 桦南县| 丹阳市| 萍乡市| 曲阜市| 黑水县| 曲靖市| 米林县| 久治县| 中江县| 丽江市| 吉安县| 涿州市| 沙田区| 大冶市| 壶关县|