it-source

Spring으로 .html 파일을 제공하는 방법

criticalcode 2023. 9. 3. 16:20
반응형

Spring으로 .html 파일을 제공하는 방법

Spring으로 웹 사이트를 개발하고 있으며 .jsp 파일(.html 등)이 아닌 리소스를 제공하려고 합니다.

지금 저는 서블릿 구성의 이 부분에 대해 의견을 제시했습니다.

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
        p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />

그리고 컨트롤러에서 리소스에 대한 전체 경로를 반환하려고 했습니다.

@Controller
public class LandingPageController {

protected static Logger logger = Logger.getLogger(LandingPageController.class);

@RequestMapping({"/","/home"})
public String showHomePage(Map<String, Object> model) {
    return "/WEB-INF/jsp/index.html";   
   }
}

그자리의 index.html파일이 해당 폴더에 있습니다.

:는 ": " " "index.htmlindex.jsp내 서버는 이제 페이지를 올바르게 처리합니다.

감사해요.

" " " 을 입니다.suffix=".jsp"는 ViewResolver를 추가합니다..jsp메서드에서 반환되는 보기 이름의 끝으로 이동합니다.

을 달았기 에.InternalResourceViewResolver그러면 나머지 응용 프로그램 구성에 따라 다른 ViewResolver가 등록되지 않을 수 있습니다.지금은 아무 것도 작동하지 않습니다.

때부터.html파일은 정적이며 서블릿에 의한 처리가 필요하지 않으므로 매핑을 사용하는 것이 더 효율적이고 간단합니다.이를 위해서는 Spring 3.0.4+가 필요합니다.

예:

<mvc:resources mapping="/static/**" location="/static/" />

다음으로 시작하는 모든 요청을 통과할 수 있습니다./static/에▁webapp/static/디렉토리입니다.

그래서 넣음으로써.index.htmlwebapp/static/ 및사용을 사용합니다.return "static/index.html";당신의 방법에서, Spring은 뷰를 찾을 것입니다.

서블릿 구성 파일에서 뷰 컨트롤러 태그(스프링 3)를 사용할 수 있으므로 컨트롤러 방법을 구현할 필요가 없습니다.

<mvc:view-controller path="/" view-name="/WEB-INF/jsp/index.html"/>

문제의 배경

먼저 이해해야 할 것은 jsp 파일을 렌더링하는 것이 봄이 아니라는 것입니다.Jsp Servlet(org.apache.jasper.servlet)입니다.JspServlet)을 실행합니다.이 서블릿은 스프링이 아닌 Tomcat(재스퍼 컴파일러)과 함께 제공됩니다.이 JspServlet은 jsp 페이지를 컴파일하는 방법과 클라이언트에 html 텍스트로 반환하는 방법을 알고 있습니다.JspServlet intomcat은 기본적으로 *.jsp 및 *.jspx 두 패턴과 일치하는 요청만 처리합니다.

이제 봄이 경치를 보여줄 때InternalResourceView(또는)JstlView세 일이

  1. 모델에서 모든 모델 매개 변수를 가져옵니다(컨트롤러 핸들러 방법에 따라 다름)."public ModelAndView doSomething() { return new ModelAndView("home") }")
  2. 이러한 모델 매개 변수를 요청 특성으로 노출(JspServlet에서 읽을 수 있도록)
  3. 요청을 JspServlet으로 전달합니다.RequestDispatcher는 각 *. Tomcat의이므로)으로 되어야 함을 있습니다. *.jsp는 JspServlet의 JspServlet 파일입니다.

단순히 보기 이름을 home.html Tomcat으로 변경하면 요청을 처리하는 방법을 알 수 없습니다.이는 *.html 요청을 처리하는 서블릿이 없기 때문입니다.

해결책

해결 방법.가장 확실한 솔루션은 세 가지입니다.

  1. html을 리소스 파일로 노출
  2. JspServlet에 *.html 요청도 처리하도록 지시합니다.
  3. 직접 서블릿을 작성합니다(또는 기존의 다른 서블릿 요청에 *.dll로 전달).

이를 달성하는 방법에 대한 전체 코드 예제는 다른 게시물에서 제 답변을 참조하십시오.Spring MVC에서 HTML 파일에 요청을 매핑하는 방법은 무엇입니까?

동일한 보기 확인 프로그램을 계속 사용할 수 있지만 접미사를 비어 있도록 설정할 수 있습니다.

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
    p:prefix="/WEB-INF/jsp/" p:suffix="" />

이제 코드는 아래 샘플과 같이 index.html 또는 index.jsp 중 하나를 반환하도록 선택할 수 있습니다.

@RequestMapping(value="jsp", method = RequestMethod.GET )
public String startJsp(){
    return "/test.jsp";
}

@RequestMapping(value="html", method = RequestMethod.GET )
public String startHtml(){
    return "/test.html";
}   

저는 같은 문제에 직면했고 스프링 MVC에서 html 페이지를 로드하기 위해 다양한 솔루션을 시도했습니다.

서버의 web.xml 주석의 1단계 이 두 줄

<!--     <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>
 -->

2단계 - 응용프로그램의 웹 xml에 다음 코드 입력

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

3단계 - 정적 컨트롤러 클래스 생성

@Controller 
public class FrontController {
     @RequestMapping("/landingPage") 
    public String getIndexPage() { 
    return "CompanyInfo"; 

    }

}

Spring 구성 파일의 Step-4 접미사를 .htm.htm으로 변경합니다.

단계-5 페이지 이름을 .htm 파일로 변경하여 WEB-INF에 저장하고 서버를 빌드/시작

localhost:8080/.../landingPage

HTML 파일에 대한 Java 구성(이 경우 index.html):

@Configuration
@EnableWebMvc
public class DispatcherConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry.addResourceHandler("/index.html").addResourceLocations("/index.html");
    }

}

그에 따라 p:vmdk=.jsp" 값을 변경합니다. 그렇지 않으면 사용자 지정 보기 해결 프로그램을 개발할 수 있습니다.

http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/view/UrlBasedViewResolver.html

다음과 같은 작업을 수행하려는 것처럼 들립니다.

  • 정적 HTML 보기
  • AJAX를 제공하는 스프링 컨트롤러

만약 그렇다면, 앞에서 언급한 것처럼, 가장 효율적인 방법은 웹 서버(Spring이 아닌)가 HTML 요청을 정적 리소스로 처리하도록 하는 것입니다.따라서 다음과 같은 기능이 필요합니다.

  1. 모든 .html, .css, .js, .png 등의 요청을 웹 서버의 리소스 처리기로 전달
  2. 다른 모든 요청을 스프링 컨트롤러에 매핑합니다.

...을 달성하기 위한 한 가지 방법이 있습니다.

web.xml - 서블릿을 루트로 매핑(/)

<servlet>
            <servlet-name>sprung</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            ...
<servlet>

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

Spring JavaConfig

public class SpringSprungConfig extends DelegatingWebMvcConfiguration {

    // Delegate resource requests to default servlet
    @Bean
    protected DefaultServletHttpRequestHandler defaultServletHttpRequestHandler() {
        DefaultServletHttpRequestHandler dsrh = new DefaultServletHttpRequestHandler();
        return dsrh;
    }

    //map static resources by extension
    @Bean
    public SimpleUrlHandlerMapping resourceServletMapping() {
        SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();

        //make sure static resources are mapped first since we are using
        //a slightly different approach
        mapping.setOrder(0);
        Properties urlProperties = new Properties();
        urlProperties.put("/**/*.css", "defaultServletHttpRequestHandler");
        urlProperties.put("/**/*.js", "defaultServletHttpRequestHandler");
        urlProperties.put("/**/*.png", "defaultServletHttpRequestHandler");
        urlProperties.put("/**/*.html", "defaultServletHttpRequestHandler");
        urlProperties.put("/**/*.woff", "defaultServletHttpRequestHandler");
        urlProperties.put("/**/*.ico", "defaultServletHttpRequestHandler");
        mapping.setMappings(urlProperties);
        return mapping;
    }

    @Override
    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();

        //controller mappings must be evaluated after the static resource requests
        handlerMapping.setOrder(1);
        handlerMapping.setInterceptors(this.getInterceptors());
        handlerMapping.setPathMatcher(this.getPathMatchConfigurer().getPathMatcher());
        handlerMapping.setRemoveSemicolonContent(false);
        handlerMapping.setUseSuffixPatternMatch(false);
        //set other options here
        return handlerMapping;
    }
}

추가 고려 사항

  • Hide .html extension - 정적 리소스 요청을 위임하는 경우 Spring 범위 밖에 있습니다.URL 다시 쓰기 필터를 조사합니다.
  • 템플릿 작성 - 공통 요소에 대해 모든 HTML 페이지에서 마크업을 복제하지 않을 수 있습니다.HTML을 정적 리소스로 제공하는 경우 서버에서 이 작업을 수행할 수 없습니다.클라이언트 측 *VC 프레임워크를 살펴봅니다.저는 핸들바를 포함한 다양한 템플릿 메커니즘을 가진 YUI의 팬입니다.

스프링부츠를 사용하는 경우 속성을 설정하면 안 됩니다.spring.mvc.view.prefix그리고.spring.mvc.view.suffixapplication.properties 파일에서 대신 빈을 구성합니다.ViewResolver구성 클래스에서.

application.properties

# Configured in @Configuration GuestNav
#spring.mvc.view.prefix=/WEB-INF/views/
#spring.mvc.view.suffix=.jsp
# Live reload
spring.devtools.restart.additional-paths=.
# Better logging
server.tomcat.accesslog.directory=logs
server.tomcat.accesslog.file-date-format=yyyy-MM-dd
server.tomcat.accesslog.prefix=access_log
server.tomcat.accesslog.suffix=.log

주법

@SpringBootApplication
public class WebApp extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(WebApp.class);
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(WebApp.class, args);
    }

}

구성 클래스

@Configuration
@EnableWebMvc
public class DispatcherConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/views/**").addResourceLocations("/views/");
    }

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/notinuse/");
        viewResolver.setSuffix("");
        return viewResolver;
    }

}

컨트롤러 클래스

@Controller
public class GuestNav {

    @GetMapping("/")
    public String home() {
        return "forward:/views/guest/index.html";
    }
}

디렉토리에 파일을 배치해야 합니다./webapp/views/guest/index.html웹 앱 디렉터리가 리소스 디렉터리 외부에 있으므로 주의하십시오.
이러한 방식으로 spring-mvc의 url 패턴을 사용할 수 있지만 정적 컨텍스트를 제공할 수 있습니다.

언급URL : https://stackoverflow.com/questions/15479213/how-to-serve-html-files-with-spring

반응형