springboot 미니 튜토리얼 005-URL 매핑

19834 단어 SpringBoot
나는 많은springboot 강좌에서 URL 매핑을 언급한 적이 거의 없다는 것을 발견했다. 주로 매우 간단하다. 코드를 보면 기본적으로 알 수 있다. 나는 여기서 간단하게 말하고 Django와 약간의 차이점도 말한다.
@RequestMapping 등록 URL 맵
Django의 URL 매핑은 프로젝트 urls에 의해 이루어집니다.py의 urlpatterns 설정은 먼저 Django가 요청을 어떻게 처리하는지 설명합니다.
  • url 페이지 요청이 생성되면 요청은 urls에 전달됩니다.py;
  • Django는urlpatterns에서 일치하는 링크를 제거한다(Django는 일치하는 첫 번째 링크에서 멈춘다).
  • 이 일치하면 실행됩니다. path 뒤의 방법은 Django가 해당하는view 페이지를 제시합니다. (이 페이지는 Python의 함수나 view(Django에 내장된) 클래스를 기반으로 할 수 있습니다. 즉, 사용자가 볼 수 있는 페이지입니다.
  • 일치하는 데 실패하면 잘못된 페이지가 나타납니다.

  • 이와 유사하게springboot에도 URL 매핑 관계가 있어야 사용자가 URL 링크에 접근할 때 서로 다른 논리를 실행할 수 있다. 여기서 언급한 논리는 바로 MCV 모드에서 말하는 제어층(C층)이기 때문에 URL의 매핑은 제어층과 큰 관련이 있다.springboot에서 제어층은 직접 주석을 통해 완성된다.일반적인 방법은 다음과 같습니다.
  • 컨트롤러라는 패키지 만들기
  • 그리고 이 가방 밑에 각종 Controller
  • 를 만듭니다.
  • 메모 @RequestMapping을 통해 등록하여 URL 매핑(URL에 접근할 때 실행하는 함수)을 실현합니다.

  • 먼저 하나의 간단한 예를 볼 수 있다.
    @RestController
    @EnableAutoConfiguration
    public class HelloController {
        @Value("${version}")
        private String version;
    
        @Autowired
        private StudentProperties student_default;
    
        @Autowired
        private StudentTestBean student_test;
    
        @RequestMapping("/student")
        private String student(String name, Integer age) {
            if (name == null) {
                name = student_default.getName();
            }
            if (age == null) {
                age = student_default.getAge();
            }
            return String.format("Online: %s
    name: %s, age: %d
    name(Test): %s, age(Test): %d"
    , version, name, age, student_test.getName(), student_test.getAge()); } }

    @RequestMapping을 통해 **/student**를 HelloController의 student 함수에 매핑하면 프로젝트를 실행할 때springboot의 출력 로그를 볼 수 있습니다.
    2018-10-30 14:57:08.116  INFO 13692 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/student]}" onto private java.lang.String com.example.useconfigurationproperties.HelloController.student(java.lang.String,java.lang.Integer)
    

    방문 중http://localhost:8080/studentHelloController의 student 함수가 호출됩니다.
    @RequestMapping의 method에는 기본값이 없습니다. method를 설정하지 않으면 모든 요청 형식 (RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE) 으로 접근할 수 있습니다.
    이런 디자인 방법은 약간 혼란스럽다. Django와 같은 일반적인 시계를 설정하는 것이 편리하지 않아서 Django의 URL 매핑 관계는 비교적 보기 쉽다.springboot의 이런 주해 방식은 비교적 흩어져 있고 때로는 각 Controller가 클릭하여 보아야 한다.물론 약간의 절충 방법도 있다. 바로 Controller류에서 어떤 하위 디렉터리 URL을 상영할 수 있다. 이 Controller류가 하위 URL 아래의 다른 하위 URL, 즉 모듈별로 관리하는 사상을 통일적으로 관리하고 그 안에서 비추면 구체적인 함수에 귀속된다. 이런 효과는 보기에 그렇게 어지럽지 않을 것이다.
    예를 들어 다음 코드에 대해 CourseController 클래스는 통일적으로 매핑되었다http://localhost:8080/course내부 함수 매핑은 다음과 같습니다.
  • 액세스http://localhost:8080/course호출된 것은course 함수
  • 입니다
  • 액세스http://localhost:8080/course/queryCourseListquery Course 함수
  • 가 호출되었습니다.
  • 액세스http://localhost:8080/course/addaddCourse 함수
  • 가 호출되었습니다.
  • 액세스http://localhost:8080/course/update업데이트Course 함수
  • 가 호출되었습니다.
  • 액세스http://localhost:8080/course/deletedeleteCourse 함수
  • 가 호출되었습니다.
    @Controller
    @RequestMapping("/course")
    public class CourseController extends BaseController {
        @Autowired
        private CourseService courseService;
        private Logger logger = LoggerFactory.getLogger(this.getClass());
    
        @RequestMapping("")
        public String course(Model model) {
            model.addAttribute("ctx", getContextPath() + "/");
            return "courses";
        }
    
        /**
         *       
         *
         * @param page
         * @return
         */
        @RequestMapping(value = "/queryCourseList", method = RequestMethod.POST)
        @ResponseBody
        public AjaxObject queryCourse(Page<?> page) {
            PageHelper.startPage(page.getPage(), page.getRows());
    
            Map<String,Object> pageParams = new HashMap<String,Object>();
            pageParams.put("page", page.getPage());
            pageParams.put("rows", page.getRows());
    
            List<Course> courseList = courseService.queryList(pageParams);
            PageInfo<Course> pageInfo = new PageInfo<Course>(courseList);
            return AjaxObject.ok().put("page", pageInfo);
        }
    
        /**
         *     
         *
         * @param course
         */
        @RequestMapping(value = "/add", method = RequestMethod.POST)
        @ResponseBody
        public AjaxObject addCourse(@RequestBody Course course) {
            courseService.save(course);
            return AjaxObject.ok();
        }
    
        /**
         *     
         *
         * @param course
         */
        @RequestMapping(value = "/update", method = RequestMethod.POST)
        @ResponseBody
        public AjaxObject updateCourse(@RequestBody Course course) {
            logger.info(course.getAuthor() + "");
            courseService.update(course);
            return AjaxObject.ok();
        }
    
        /**
         *     
         *
         * @param ids
         */
        @RequestMapping(value = "/delete", method = RequestMethod.POST)
        @ResponseBody
        public AjaxObject deleteCourse(@RequestBody Long[] ids) {
            courseService.deleteByIds(ids);
            return AjaxObject.ok();
        }
    }
    

    Spring4.3 이후 @RequestMapping(method = RequestMethod.XXX)의 쓰기를 간소화하기 위해 현재의 GetMapping, PotMapping, PutMapping, DeleteMapping, PatchMapping을 포장했다.
    @Controller와 @RestController의 차이점
    @RestController 주석은 @ResponseBody+@Controller가 합쳐진 작용에 해당합니다.
    @RestController를 사용하여 Controller를 주석하기만 하면 Controller의 방법은 jsp 페이지나 html로 돌아갈 수 없습니다. 설정된 보기 해상도인 인터넷 Resource ViewResolver는 작동하지 않습니다. 되돌아오는 내용은 Return의 내용입니다.
    지정한 페이지로 돌아가려면 @Controller와 보기 해상도 인터넷 ResourceViewResolver를 함께 사용해야 합니다.JSON, XML, 또는 사용자 정의 미디어타입 내용을 페이지로 되돌려야 한다면, 대응하는 방법에 @ResponseBody 주석을 붙여야 합니다.
    @Controller 주석을 사용하면 대응하는 방법에서 보기 해석기는return의 jsp, html 페이지를 분석하고 해당하는 페이지로 이동할 수 있습니다.json 등의 내용을 페이지로 되돌려주려면 @ResponseBody 주석을 추가해야 합니다

    좋은 웹페이지 즐겨찾기