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.html
index.jsp
내 서버는 이제 페이지를 올바르게 처리합니다.
감사해요.
" " " 을 입니다.suffix=".jsp"
는 ViewResolver를 추가합니다..jsp
메서드에서 반환되는 보기 이름의 끝으로 이동합니다.
을 달았기 에.InternalResourceViewResolver
그러면 나머지 응용 프로그램 구성에 따라 다른 ViewResolver가 등록되지 않을 수 있습니다.지금은 아무 것도 작동하지 않습니다.
때부터.html
파일은 정적이며 서블릿에 의한 처리가 필요하지 않으므로 매핑을 사용하는 것이 더 효율적이고 간단합니다.이를 위해서는 Spring 3.0.4+가 필요합니다.
예:
<mvc:resources mapping="/static/**" location="/static/" />
다음으로 시작하는 모든 요청을 통과할 수 있습니다./static/
에▁webapp/static/
디렉토리입니다.
그래서 넣음으로써.index.html
webapp/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
세 일이
- 모델에서 모든 모델 매개 변수를 가져옵니다(컨트롤러 핸들러 방법에 따라 다름).
"public ModelAndView doSomething() { return new ModelAndView("home") }"
) - 이러한 모델 매개 변수를 요청 특성으로 노출(JspServlet에서 읽을 수 있도록)
- 요청을 JspServlet으로 전달합니다.
RequestDispatcher
는 각 *. Tomcat의이므로)으로 되어야 함을 있습니다. *.jsp는 JspServlet의 JspServlet 파일입니다.
단순히 보기 이름을 home.html Tomcat으로 변경하면 요청을 처리하는 방법을 알 수 없습니다.이는 *.html 요청을 처리하는 서블릿이 없기 때문입니다.
해결책
해결 방법.가장 확실한 솔루션은 세 가지입니다.
- html을 리소스 파일로 노출
- JspServlet에 *.html 요청도 처리하도록 지시합니다.
- 직접 서블릿을 작성합니다(또는 기존의 다른 서블릿 요청에 *.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" 값을 변경합니다. 그렇지 않으면 사용자 지정 보기 해결 프로그램을 개발할 수 있습니다.
다음과 같은 작업을 수행하려는 것처럼 들립니다.
- 정적 HTML 보기
- AJAX를 제공하는 스프링 컨트롤러
만약 그렇다면, 앞에서 언급한 것처럼, 가장 효율적인 방법은 웹 서버(Spring이 아닌)가 HTML 요청을 정적 리소스로 처리하도록 하는 것입니다.따라서 다음과 같은 기능이 필요합니다.
- 모든 .html, .css, .js, .png 등의 요청을 웹 서버의 리소스 처리기로 전달
- 다른 모든 요청을 스프링 컨트롤러에 매핑합니다.
...을 달성하기 위한 한 가지 방법이 있습니다.
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.suffix
application.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
'it-source' 카테고리의 다른 글
개체를 쓰는 동안 Git이 중단됨 (0) | 2023.09.03 |
---|---|
MariaDB(마스터)에서 MySQL 5.6(슬레이브)로의 복제 (0) | 2023.09.03 |
상위 폴더가 없는 경우 파일을 쓰는 방법은 무엇입니까? (0) | 2023.08.29 |
닫힌 후에도 Bootstrap Modals가 본문에 패딩 권한을 계속 추가합니다. (0) | 2023.08.29 |
jQuery/Javascript를 사용하여 페이지 새로 고침을 금지합니다. (0) | 2023.08.29 |