복붙노트

[SPRING] Spring을 사용하여 web.xml의 루트에 매핑하면 정적 리소스를 찾을 수 없습니다.

SPRING

Spring을 사용하여 web.xml의 루트에 매핑하면 정적 리소스를 찾을 수 없습니다.

내가 뭘 하려는지 서블릿 루트 (올바른 용어?) 요청을지도입니다. URL이 올바른보기로 매핑되지만 페이지의 일부인 모든 정적 콘텐츠 (CSS, 자바 스크립트, 이미지)를 찾을 수 없습니다.

그래서 내 web.xml 내 서블릿 태그는 다음과 같습니다.

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

내 컨트롤러는 다음과 같이 보입니다.

@RequestMapping("/shop")
public class TheShopController extends MyBaseController {

    public static String VIEW = "Tile.Shop";

    @Override
    @RequestMapping(method = RequestMethod.GET)
    protected ModelAndView processRequest(HttpServletRequest req, HttpServletResponse resp) {
        ModelAndView mav = new ModelAndView(VIEW);
        return mav;
    }

}

MyBaseController는 매우 간단합니다. 다음과 같이 보입니다.

public abstract class MyBaseController extends AbstractController {

    protected Logger log = Logger.getLogger(getClass());

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) 
        throws Exception {

        ModelAndView mav = processRequest(req, resp);
        return mav;
    }

    protected abstract ModelAndView processRequest(HttpServletRequest req, HttpServletResponse resp);
}

내 뷰 레이어에서 Tiles를 사용하고 있습니다. 내 구성은 다음과 같습니다.

/WEB-INF/tiles-defs.xml

앞에서 언급했듯이 뷰는 있지만 페이지의 포트 인 정적 리소스는 찾을 수 없습니다. 다음은 몇 가지 일반적인 로그 아웃 출력입니다.

가는 중 http : // localhost : 8080 / springapp / shop은 제대로 작동하지만 CSS와 이미지가 누락되었습니다.

나는 Tiles를 사용하는 것이 어떻게 든 복잡해 보이지만 나는 그것을 제거하는 것을 꺼려한다. 나는 내 view 구성을 조정할 필요가 있는지 어떻게 생각 하느냐에 대해 의문을 품고있다. view resolvers를 연결하는 것일까? 나는 그렇지 않다. 그 일을 경험했다.

해결법

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

    1.문제는 정적 컨텐츠에 대한 요청이 / 으로 매핑 되었기 때문에 dispatcherServlet으로 이동한다는 것입니다. "RESTful"URL (즉, DispatcherServlet 매핑에 접두사가없는)이있는 응용 프로그램에서는 매우 일반적인 문제입니다.

    문제는 정적 컨텐츠에 대한 요청이 / 으로 매핑 되었기 때문에 dispatcherServlet으로 이동한다는 것입니다. "RESTful"URL (즉, DispatcherServlet 매핑에 접두사가없는)이있는 응용 프로그램에서는 매우 일반적인 문제입니다.

    이 문제를 해결할 수있는 몇 가지 방법이 있습니다.

    Spring 3.x 이후로 정적 자원에 접근하는 가장 좋은 방법은 를 사용하는 것이다. web.xml :

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

    봄 설정 :

    <!-- Handles GET requests for /resources/** by efficiently serving static content 
        in the ${webappRoot}/resources dir --> 
    <mvc:resources mapping="/resources/**" location="/resources/" /> 
    

    Spring 3의 MVC Simplification도 참고하자.

    1. URL 재 작성 필터 사용 여기에 mvc-basic 예제를 참조하십시오.

    2. 기본 서블릿의 접두어를 설정합니다.

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/static/*</url-pattern>
    </servlet-mapping>
    

    즉, /static/images/image.png에 대한 요청은 /images/image.png라는 파일을 반환합니다. 그러나이 방법은 서로 다른 서블릿 컨테이너에서 호환되지 않습니다 (Jetty에서는 작동하지 않음). 여기에서 해결 방법을 참조하십시오.

    3. 기본 서블릿에 대한 정적 컨텐츠 확장을 설정하십시오.

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.png</url-pattern>
        <url-pattern>*.js</url-pattern>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>
    

    4. RESTful URL을 사용하지 말고 접두사가있는 URL을 사용하십시오.

    <servlet-mapping> 
        <servlet-name>springapp</servlet-name> 
        <url-pattern>/app</url-pattern> 
    </servlet-mapping>
    

    5. RESTful URL을 사용하지 말고 확장명을 가진 URL을 사용하십시오.

    <servlet-mapping> 
        <servlet-name>springapp</servlet-name> 
        <url-pattern>*.do</url-pattern> 
    </servlet-mapping>
    
  2. ==============================

    2.이것을 사용하는 사람이 있습니까?

    이것을 사용하는 사람이 있습니까?

    <!-- Allows for mapping the DispatcherServlet to "/" by forwarding static resource requests to the container's default Servlet -->
    <mvc:default-servlet-handler/>
    

    여기에 최신 스프링 문서가 있습니다 : http://static.springsource.org/spring/docs/3.1.2.RELEASE/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-default-servlet-handler

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

    3.제안 된 솔루션 번호 (2, 서블릿 컨테이너에서 서블릿 컨테이너까지 다르게 동작하는 기본 서블릿) 대신 Spring Webflow 프로젝트의 Resource Servlet (org.springframework.js.resource.ResourceServlet)을 살펴 보시기 바랍니다. .

    제안 된 솔루션 번호 (2, 서블릿 컨테이너에서 서블릿 컨테이너까지 다르게 동작하는 기본 서블릿) 대신 Spring Webflow 프로젝트의 Resource Servlet (org.springframework.js.resource.ResourceServlet)을 살펴 보시기 바랍니다. .

    자세한 내용은 Spring MVC에서 정적 컨텐츠를 처리하는 방법을 살펴 보시기 바랍니다.

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

    4.나는 같은 문제를 가지고 있지만 봄을 사용하는 대신, 나는 내 시작 페이지에 루트를 리디렉션하는 작은 필터를 사용한다.

    나는 같은 문제를 가지고 있지만 봄을 사용하는 대신, 나는 내 시작 페이지에 루트를 리디렉션하는 작은 필터를 사용한다.

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
    
        String pageName = req.getServletPath();
    
        if(pageName.equals("/")) {
            res.sendRedirect( req.getContextPath() + "/start" );
        } else {
            chain.doFilter(request, response);
        }
    

    그것은 아마 트릭이지만 작은 코드로 잘 작동하는 것처럼 보입니다. 자세한 필터 정보는 http://www.oracle.com/technetwork/java/filters-137243.html을 참조하십시오.

  5. from https://stackoverflow.com/questions/2129876/using-spring-mapping-to-root-in-web-xml-static-resources-arent-found by cc-by-sa and MIT license