복붙노트

[SPRING] Spring MVC ViewResolver가 HTML 파일에 매핑되지 않는다.

SPRING

Spring MVC ViewResolver가 HTML 파일에 매핑되지 않는다.

봄 mvc .html보기 파일을 해결할 수 없습니다.

다음과 같은보기 폴더 구조가 있습니다.

WEB-INF
      `-views
            |- home.jsp
            `- home.html

메시지를 출력하는 간단한 hello world 컨트롤러 메소드가 있습니다. 뷰 이름 "home"을 리턴합니다. home.jsp 파일을 가지고 있지만 대신 home.html을 사용하십시오.

<!-- Working servlet mapping --> 
<servlet-mapping>
    <servlet-name>spaceShips</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<!-- working servlet context -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <beans:property name="prefix" value="WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" /> 
</beans:bean>

우주선 / 집에 충돌하면 컨트롤러에서 안녕하세요 세계 메시지를 인쇄하고 문제점없이 home.jsp 뷰.

문제는 접미사를 .html로 변경하는 경우입니다.

접미어를 변경하고 / home으로 이동 한 후 컨트롤러는 메시지가 표시되지만 브라우저에서 404 오류가 표시되고 콘솔에서 다음 오류가 표시됩니다. 경고 : URI가있는 HTTP 요청에 대한 매핑이 없습니다 [/spaceships/WEB-INF/views/home.html]

명확히하기 :

<!-- not working with .html -->
<servlet-mapping>
    <servlet-name>spaceShips</servlet-name>
    <!-- I have tried /* here as well without success -->
    <url-pattern>/</url-pattern>
</servlet-mapping>

<!-- not working with .html-->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <beans:property name="prefix" value="WEB-INF/views/" />
    <beans:property name="suffix" value=".html" /> 
</beans:bean>

나는 폭발 한 전쟁 폴더를 조사해 두 가정 파일이 모두 있다는 것을 확인할 수 있습니다.

누구도 이런 식으로 뭔가를 만났습니까?

콘솔 메시지의 마지막 덩어리 :

INFO: Server startup in 5256 ms
Hello, World!
Jul 27, 2014 12:52:01 PM org.springframework.web.servlet.DispatcherServlet noHandlerFound
WARNING: No mapping found for HTTP request with URI [/spaceships/WEB-INF/views/home.html] in DispatcherServlet with name 'spaceShips'

읽어 주셔서 감사합니다.

=========== 해결책 ============

다음 (못생긴) 구성으로 문제가 해결되었습니다. 이 문제를 해결할 수있는 방법이 있지만 동일한 문제가 발생하는 경우이를 해결할 수 있습니다.

폴더 구조 :

 WEB-INF
       `-static
              |-html
                    `-home.html
              |-css
              `-img

컨트롤러 방법 :

 @RequestMapping(value = "/home")
 public String goHome() { 
      System.out.println("lolololololol");
      return "static/html/home";
 }

봄 설정 :

 <resources mapping="/static/**" location="/WEB-INF/static/" />

 <beans:bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <beans:property name="prefix" value="" />
      <beans:property name="suffix" value=".html" />
 </beans:bean>

해결법

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

    1.Spring mvc에서 html 파일을 매핑하기 위해 이것을 확인하십시오 (세부 단계는 Answer로 제공됩니다) :

    Spring mvc에서 html 파일을 매핑하기 위해 이것을 확인하십시오 (세부 단계는 Answer로 제공됩니다) :

    어느 spring view resolver가 angularjs와 잘 맞습니까?

    단순함 :

    봄에 정적 리소스 (html, css, img, js)를 사용하려면 다음과 같은 디렉토리 구조를 사용하십시오.

    src/
       package/
       LayoutController.java
    WebContent/
       WEB-INF/
        static/
          html/
           layout.html
          images/
           image.jpg
          css/
           test.css
          js/
           main.js
         web.xml
        springmvc-servlet.xml
    
    
    @Controller 
    public class LayoutController {
    
     @RequestMapping("/staticPage") 
    public String getIndexPage() { 
    return "layout.htm"; 
    
    } }
    
    
    
    
    <!-- in spring config file -->
     <mvc:resources mapping="/static/**" location="/WEB-INF/static/" />
    

    layout.html

    <h1>Page with image</h1>
    <img src="/static/img/image.jpg"/>
    
  2. ==============================

    2.이것은 보통 * .jsp 스타일의 uri 패턴이 서블릿 컨테이너에 의해 처리되고이 특정 인스턴스에서 * .html이 컨테이너에 의해 처리되지 않고 경로가 이러한 확장을 렌더링하는 방법을 모르는 Spring MVC에 위임되기 때문입니다 .

    이것은 보통 * .jsp 스타일의 uri 패턴이 서블릿 컨테이너에 의해 처리되고이 특정 인스턴스에서 * .html이 컨테이너에 의해 처리되지 않고 경로가 이러한 확장을 렌더링하는 방법을 모르는 Spring MVC에 위임되기 때문입니다 .

    예를 들어, tomcat을 사용하는 경우 conf / web.xml 파일에서 다음 항목을 볼 수 있습니다.

    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
        <url-pattern>*.jspx</url-pattern>
    </servlet-mapping>
    

    즉 jsp servlet은 * .jsp, * .jspx 확장자를 처리합니다.

    따라서이 링크 에서처럼 jsp servlet이 처리 할 수 ​​있도록 추가 할 .html을 추가하는 것이 잠재적 인 해결책입니다.

    JSP로 .html 파일 사용

    또는 .jsp로 확장자를 남겨두고 컨트롤러 패턴으로 .html을 대신 사용 하시겠습니까?

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

    3.

    I was also facing the same issue and tried various solutions to load the AngularJS html file using Spring configuration. After applying below steps it got resolved.
    
    Step-1 in server's web.xml commemt these two lines
    
    <!--     <mime-mapping>
            <extension>htm</extension>
            <mime-type>text/html</mime-type>
        </mime-mapping>--> 
    <!--     <mime-mapping>
            <extension>html</extension>
            <mime-type>text/html</mime-type>
        </mime-mapping>
     -->
    
    Step-2 enter following code in application's web xml
    
      <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
    
    
    Step-3
    
    create a static controller class 
    
    @Controller 
    public class StatisController {
         @RequestMapping("/landingPage") 
        public String getIndexPage() { 
        return "CompanyInfo"; 
    
        }
    
    }
    Step-4 in the Spring configuration file change the suffix to .htm
            <property name="suffix">
                <value>.htm</value>
            </property>
    
    Step-5
    Rename page as .htm file and store it in WEB-INF and build/start the server 
    
    localhost:8080/.../landingPage
    
  4. ==============================

    4.

    //Finally a working solution both html and jsp view together 
    ------------------------------------------------------------------------
    
    public class ChainableInternalResourceViewResolver extends InternalResourceViewResolver {
    
        private static Log logger = LogFactory.getLogger(ChainableInternalResourceViewResolver.class);
    
        /**
         * 
         */
        protected AbstractUrlBasedView buildView(String viewName) throws Exception {
            logger.entering("buildView");
            String url = getPrefix() + viewName + getSuffix();
            InputStream stream = getServletContext().getResourceAsStream(url);
            if (stream == null) {
                logger.log(Log.DEBUG,"-----!!!------resource not found-------!!!-----"+getPrefix() + viewName + getSuffix());
                return new NonExistentView();
            } else {
                logger.log(Log.DEBUG,"----***-------resource found-------***-----"+getPrefix() + viewName + getSuffix());
                stream.close();
            }
            return super.buildView(viewName);
        }
    
        /**
         * 
         * @author 
         *
         */
        private static class NonExistentView extends AbstractUrlBasedView {
    
            //private static Log logger = LogFactory.getLogger(NonExistentView.class);
    
            protected boolean isUrlRequired() {
                //logger.entering("isUrlRequired");
                return false;
            }
    
            public boolean checkResource(Locale locale) throws Exception {
                //logger.entering("checkResource");
                return false;
            }
    
            protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
                    HttpServletResponse response) throws Exception {
                //logger.entering("renderMergedOutputModel");
                // Purposely empty, it should never get called
            }
        }
    }
    
    ----------------------------------------------------------------------------
    @EnableWebMvc
    @Configuration
    @ComponentScan({ "com.*" })
    public class ApplicationConfig extends WebMvcConfigurerAdapter {
    
        //Be careful while changing here
        private static final String VIEW_DIR_HTML = "/WEB-INF/static/";
        private static final String VIEW_EXTN_HTML = ".html";
    
        private static final String VIEW_DIR_JSP = "/WEB-INF/";
        private static final String VIEW_EXTN_JSP = ".jsp";
    
        private static final String RESOURCE_URL_PATTERN_1 = "/resources/**";
        private static final String RESOURCE_URL_PATTERN_2 = "/WEB-INF/static/**";
        private static final String RESOURCE_PATH_1 = "/resources/";
        private static final String RESOURCE_PATH_2 = "/WEB-INF/static/";
    
        private static Logger logger = LoggerFactory.getLogger(ApplicationConfig.class);
    
        /**
         * 
         * @return
         */
        @Bean
        public ViewResolver htmlViewResolver() {
            logger.info(" htmlViewResolver method ");
            InternalResourceViewResolver viewResolver= new ChainableInternalResourceViewResolver();
            viewResolver.setPrefix(VIEW_DIR_HTML);
            viewResolver.setSuffix(VIEW_EXTN_HTML);
            viewResolver.setOrder(0);
            return viewResolver;
        }
    
        @Bean
        public ViewResolver jspViewResolver() {
            logger.info(" jspViewResolver method ");
            InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
            viewResolver.setPrefix(VIEW_DIR_JSP);
            viewResolver.setSuffix(VIEW_EXTN_JSP);
            viewResolver.setOrder(1);
            return viewResolver;
        }
    
    --------------------------------------------------------------------------------
    return "pages/login"; // for login.html resides inside /WEB-INF/static/pages/login.html
    
    return "jsp/login"; // for login.jsp resides inside /WEB-INF/jsp/login.jsp
    
  5. from https://stackoverflow.com/questions/24980839/spring-mvc-viewresolver-not-mapping-to-html-files by cc-by-sa and MIT license