복붙노트

[SPRING] Spring MVC의 서블릿 매핑에서 url 패턴 디렉토리의 루트를 어떻게 매핑 할 수 있습니까?

SPRING

Spring MVC의 서블릿 매핑에서 url 패턴 디렉토리의 루트를 어떻게 매핑 할 수 있습니까?

<servlet-mapping>
    <servlet-name>testServlet</servlet-name>
    <url-pattern>/test/*</url-pattern>
</servlet-mapping>

내가 / test / page를 누르면 위의 코드가 작동합니다. 그러나 타격 / 테스트 또는 / 테스트 / 작동하지 않습니다. 저는 Spring MVC를 사용하고 있으며 요청 매핑은 다음과 같습니다 :

@RequestMapping(value = {"","/"})

편집하다:

독립 프로젝트로 검증하는 중이지만, 이것은 Spring의 UrlPathHelper와 관련된 버그 인 것으로 보입니다. 다음 메소드는 컨텍스트와 서블릿 경로가 모두 있고, 슬래시없이 서블릿에 도달하면 잘못된 경로를 리턴합니다.

public String getPathWithinApplication(HttpServletRequest request) {
    String contextPath = getContextPath(request);
    String requestUri = getRequestUri(request);
    if (StringUtils.startsWithIgnoreCase(requestUri, contextPath)) {
        // Normal case: URI contains context path.
        String path = requestUri.substring(contextPath.length());
        return (StringUtils.hasText(path) ? path : "/");
    }
    else {
        // Special case: rather unusual.
        return requestUri;
    }
}

예를 들어 "admin"컨텍스트와 다음 서블릿 매핑이 있다고 가정 해 봅시다.

<servlet-mapping>
    <servlet-name>usersServlet</servlet-name>
    <url-pattern>/users/*</url-pattern>
</servlet-mapping>

이제 다음과 같은 컨트롤러에 요청 매핑이 있습니다.

@RequestMapping(value = {"","/"})

내가 / admin / users를 친다면 그것은 작동하지 않을 것이다. 그러나 내가 / admin / users /를 치면 작동 할 것입니다. 이제 요청 매핑을 다음과 같이 변경하면 둘 다 작동합니다.

@RequestMapping(value = {"/users","/"})

그러나 이제는 / admin / users / users URL도 작동합니다 (원하는 것은 아닙니다).

해결법

  1. ==============================

    1.Yevgeniy은 정확하지만 DispatcherServlet이 기본 서블릿을 인계 받으면 web.xml에 이것을 추가해야합니다.

    Yevgeniy은 정확하지만 DispatcherServlet이 기본 서블릿을 인계 받으면 web.xml에 이것을 추가해야합니다.

    <welcome-file-list>
        <welcome-file>/</welcome-file>
    </welcome-file-list>
    
  2. ==============================

    2.내 설정은 일반적으로 다음과 같습니다.

    내 설정은 일반적으로 다음과 같습니다.

    <servlet-mapping>
        <servlet-name>testServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    

    컨트롤러, 여기서 당신이 / 테스트 및 / 테스트 동등하게 처리하려는 가정 :

    @Controller
    public class MyController {
    
        @RequestMapping("/test")
        public String test() {
            return "redirect:/welcome";
        }
    
        @RequestMapping("/test/")
        public String test() {
            return "redirect:/welcome";
        }
    
        @RequestMapping("/welcome")
        public void test(ModelMap model) {
            // do your stuff
        }
    }
    

    이와 같은 설정은 DispatcherServlet이 * .css 및 * .js 파일에 대한 요청을 처리하게하므로 대부분의 경우 바람직하지 않습니다. 나는 이것이 Bhavik이 설명하는 문제라고 생각한다. 이러한 리소스의 경우 다음과 같이 ResourceController를 사용할 수 있습니다.

    <mvc:resources mapping="/css/**" location="/resources/css/" />
    <mvc:resources mapping="/js/**" location="/resources/js/" />
    

    / resources / css 및 / resources / js 파일은 별도의 컨트롤러를 작성하지 않고도 제공됩니다.

  3. ==============================

    3.우선, 디스패처 서블릿을 "/"및 "/ *"에 매핑하는 것의 차이점. 차이점이 있습니다!

    우선, 디스패처 서블릿을 "/"및 "/ *"에 매핑하는 것의 차이점. 차이점이 있습니다!

    "/ *"에 매핑하면 모든 URL 요청 ( "/WEB-INF/jsp/.../index.jsp"와 같은 항목 포함)이 Dispatcher 서블릿에 매핑됩니다.

    둘째, Spring + Tiles를 사용하고 타일 정의에 일부 JSP를 반환하면 내부 요청을 처리하고 원래 요청과 동일한 서블릿에서 처리합니다. 필자는 home () 메소드에 의해 적절하게 포착 된 루트 URL "/"을 호출 한 다음 다시 Dispatcher Servlet에 의해 처리되는 Tiles에 의해 "index.jsp"로 전달됩니다. 분명히 dispatcher 서블릿은 컨트롤러가 없기 때문에 "index.jsp"를 처리 할 수 ​​없습니다.

    예,보기 흉하지만이게 작동하는 것처럼 보입니다.

    그래서, 지금까지 찾은 유일한 해결책은 web.xml에서 "/ *"를 "/"로 다시 변경하는 것입니다. 이 방법으로 JSP는 톰캣의 jsp 서블릿에 의해 적절하게 표현 될 것입니다. 디스패처 서블릿이 아닙니다. 불행하게도,이 수정은 Spring에 의해 파견 된 ROOT URL을 깨뜨릴 것이므로 지금은 ROOT URL + Tiles를 사용하는 아이디어를 남겨 둘 필요가있다.

    web.xml의 명시적인 서블릿 매핑 ".jsp -> Tomcat jsp를 추가하는 것은"/ * "을 사용할 때 도움이되지 않습니다.

    여전히 문제는 해결되지 않습니다.

    또한 이것은 Spring MVC 3.0의 문제점이다.

  4. ==============================

    4.web.xml 파일을 건드리지 않는 방법은 맵을 기본 환영 파일 경로로 설정하는 것입니다.

    web.xml 파일을 건드리지 않는 방법은 맵을 기본 환영 파일 경로로 설정하는 것입니다.

    @RequestMapping("/index.html")
    
  5. ==============================

    5.내 경우, 모든 URL은 루트 "/"URL을 제외하고는 작동했습니다. 문제는 내 프로젝트의 webapp 루트 폴더에서 index.htm 파일을 삭제하지 않았다는 것입니다.

    내 경우, 모든 URL은 루트 "/"URL을 제외하고는 작동했습니다. 문제는 내 프로젝트의 webapp 루트 폴더에서 index.htm 파일을 삭제하지 않았다는 것입니다.

  6. from https://stackoverflow.com/questions/13405868/in-a-servlet-mapping-in-spring-mvc-how-do-i-map-the-root-of-a-url-pattern-direct by cc-by-sa and MIT license