Xử lý các kiểu tham số và phản hồi trong SpringMVC

1. Giới thiệu về các kiểu tham số phổ biến

Trong SpringMVC, việc xử lý dữ liệu truyền vào có thể thực hiện thông qua nhiều cách khác nhau, bao gồm cả gửi dữ liệu dạng URL encoded, tải file hoặc sử dụng JSON.

1.1 Dạng application/x-www-form-urlencoded

Kiểu này là mặc định khi không chỉ định thuộc tính enctype trong form HTML. Các tham số sẽ được mã hóa dưới dạng key-value và gửi tới server.


@PostMapping("/update")
public void update(@ModelAttribute("student") Student student) {
    System.out.println(student);
}

1.2 Tải lên file (multipart/form-data)

Khi cần tải file lên server, bạn phải cấu hình enctype của form thành multipart/form-data.


@PostMapping("/uploadFile")
public String uploadFile(@RequestParam("file") MultipartFile uploadedFile) throws IOException {
    if (!uploadedFile.isEmpty()) {
        byte[] bytes = uploadedFile.getBytes();
        Path path = Paths.get("uploads/" + uploadedFile.getOriginalFilename());
        Files.write(path, bytes);
    }
    return "redirect:/success";
}

Bạn cũng cần thêm các cấu hình sau vào tệp XML:


<bean id="multipartResolver" 
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="5242880"/>
</bean>

Và đảm bảo rằng dự án đã có dependency sau:


<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

1.3 Gửi dữ liệu dạng JSON (application/json)

Dữ liệu JSON có thể được xử lý bằng cách sử dụng annotation @RequestBody.


@PostMapping(value = "/processJson", consumes = "application/json")
public ResponseEntity<String> processJson(@RequestBody Person person) {
    return new ResponseEntity<>("Received: " + person.getName(), HttpStatus.OK);
}

Cần thêm cấu hình sau để hỗ trợ chuyển đổi JSON:




    <bean class="org.springframework.http.converter.StringHttpMessageConverter">
        
    </bean>

2. Xử lý phản hồi từ Controller

2.1 Không trả về giá trị

Nếu phương thức không có giá trị trả về, nó sẽ tìm kiếm một trang JSP tương ứng với tên phương thức.

2.2 Trả về chuỗi

Chuỗi có thể đại diện cho tên của một trang JSP hoặc dùng để chuyển hướng/truyền tiếp yêu cầu.


@GetMapping("/redirectExample")
public String redirectToPage() {
    return "redirect:/anotherPage";
}

@GetMapping("/forwardExample")
public String forwardToPage() {
    return "forward:/internalPage";
}

2.3 Trả về dữ liệu trực tiếp

Sử dụng @ResponseBody để trả về dữ liệu thay vì tên trang JSP.


@RestController
@RequestMapping("/api")
public class ApiController {

    @GetMapping("/data")
    public List<Item> getData() {
        List<Item> items = new ArrayList<>();
        items.add(new Item(1, "Item 1"));
        items.add(new Item(2, "Item 2"));
        return items;
    }
}

3. Sử dụng Interceptor trong SpringMVC

Interceptor giúp kiểm soát luồng thực thi của request trước và sau khi đến controller.

3.1 Tạo interceptor


public class LoggingInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("Request received at: " + request.getRequestURI());
        return true; // Cho phép tiếp tục xử lý
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Post handle executed.");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("Request completed.");
    }
}

3.2 Đăng ký interceptor



    
        
        
        <bean class="com.example.interceptor.LoggingInterceptor"/>
    

4. Sử dụng Lombok để tối ưu hóa mã nguồn

Lombok giúp giảm thiểu việc viết các getter/setter, constructor và các phương thức thường gặp như equals hay toString.

4.1 Cấu hình Lombok

Thêm dependency vào pom.xml:


<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.26</version>
    <scope>provided</scope>
</dependency>

4.2 Sử dụng các annotation của Lombok

  • @Getter/@Setter: Tự động tạo getter và setter.
  • @NoArgsConstructor: Tạo constructor không tham số.
  • @AllArgsConstructor: Tạo constructor với tất cả tham số.
  • @Data: Kết hợp nhiều annotation như @Getter, @Setter, @ToString...

5. Kết luận

Bài viết đã trình bày chi tiết về cách xử lý các kiểu tham số, phản hồi trong SpringMVC cũng như cách sử dụng Lombok để tối ưu hóa mã nguồn.

Thẻ: SpringMVC file-upload Lombok

Đăng vào ngày 20 tháng 7 lúc 14:08