Spring MVC ViewResolver не отображает файлы HTML
Я не могу получить spring mvc для разрешения .html файлов вида.
У меня есть следующая структура папок вида:
WEB-INF
`-views
|- home.jsp
`- home.html
У меня есть простой метод hello world controller, который просто печатает сообщение
и возвращает имя вида "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 в браузере и следующие в консоли:
ПРЕДУПРЕЖДЕНИЕ. Нет сопоставления для HTTP-запроса с URI [/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";
}
Spring config:
<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
Проверьте это для сопоставления html файлов в Spring mvc (Подробный шаг приведен в ответе):
Какой Spring просмотр разрешающего устройства играет с угловыми символами?
В простом:
Чтобы использовать статический ресурс (html, css, img, js) в spring, используйте структуру каталогов, которая выглядит следующим образом:
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
Это связано с тем, что обычные шаблоны uri стиля *.jsp
обрабатываются контейнером сервлета и в этом конкретном экземпляре *.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>
i.e сервлет ssp обрабатывает расширение *.jsp, *.jspx.
Таким образом, потенциальное исправление будет заключаться в добавлении .html для обработки обработчиком jsp, как в этой ссылке:
Использование файлов .html как JSP
или даже лучше, оставьте расширение как .jsp и вместо этого используйте .html в качестве шаблона контроллера?
Ответ 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 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 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
//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