Весна MVC Annot. + Jetty 9 + View Resolvers - не удается найти страницу jsp
Этот вопрос был задан ранее однако ответы, которые были даны, либо не сработали для меня, либо ответы полностью обошли вопрос в пользу другого базового примера.
Я пытаюсь использовать простой базовый пример сервлета Spring MVC, встроенного в экземпляр Jetty. Мои контроллеры принимают запросы страниц и возвращают правильное имя представления. Это когда страница jsp ищется, что терпит неудачу. Проблема, я полагаю, заключается в том, что Сопоставления сервлетов, основанные на других ответах, которые я видел, но я не вижу решения в моей ситуации.Настройка Сервера Jetty:
public JettyServer(int port) throws JettyServerException {
webServerPort = port;
webServer = new Server(webServerPort);
webServer.setStopAtShutdown(true);
try {
webServer.setHandler(getServletContextHandler(getContext()));
} catch (IOException e) {
throw new JettyServerException("Cannot instantiate JettyServer instance", e);
}
}
private ServletContextHandler getServletContextHandler(WebApplicationContext context) throws IOException {
ServletContextHandler contextHandler = new ServletContextHandler();
contextHandler.setContextPath("/");
contextHandler.addServlet(new ServletHolder(new DispatcherServlet(context)), "/");
contextHandler.addEventListener(new ContextLoaderListener(context));
contextHandler.setResourceBase(new ClassPathResource("webapp").getURI().toString());
return contextHandler;
}
private WebApplicationContext getContext() {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.setConfigLocation("com.company.webapptemplate.config");
return context;
}
Класс web App config, найденный в пакете com.company.webapptemplate.config
:
@Configuration
@EnableWebMvc
@ComponentScan("com.company.webapptemplate.controller")
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Bean
public UrlBasedViewResolver setupViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setViewClass(JstlView.class);
return resolver;
}
}
Код контроллера:
@Controller
@RequestMapping("/")
public class ApplicationController {
@RequestMapping(method = RequestMethod.GET)
public String welcome(ModelMap model) {
return "index";
}
}
Не-java классы материал под target/classes
после запуска Maven / IntelliJ сборки:
|____webapp
| |____WEB-INF
| | |____views
| | | |____index.jsp
| | |____web.xml (unused)
Ответ при указании моего браузера на localhost: 8080 после запуска приложения в IntelliJ:
Problem accessing /WEB-INF/views/index.jsp. Reason:
Not Found
И дымящийся пистолет в бревнах, с которым я не знаю, что делать:
2014-09-11 23:12:54 DEBUG org.springframework.web.servlet.handler.AbstractHandlerMethodMapping:297 - Looking up handler method for path /WEB-INF/views/index.jsp 2014-09-11 23:12:54 DEBUG org.springframework.web.servlet.handler.AbstractHandlerMethodMapping:305 - Did not find handler method for [/WEB-INF/views/index.jsp] 2014-09-11 23:12:54 TRACE org.springframework.web.servlet.DispatcherServlet:1101 - Testing handler map [org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@5ddbd0c7] in DispatcherServlet with name 'org.springframework.web.servlet.DispatcherServlet-44175c06' 2014-09-11 23:12:54 TRACE org.springframework.web.servlet.handler.AbstractUrlHandlerMapping:127 - No handler mapping found for [/WEB-INF/views/index.jsp] 2014-09-11 23:12:54 TRACE org.springframework.web.servlet.DispatcherServlet:1101 - Testing handler map [org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping@a67e8f5] in DispatcherServlet with name 'org.springframework.web.servlet.DispatcherServlet-44175c06' 2014-09-11 23:12:54 TRACE org.springframework.web.servlet.DispatcherServlet:1101 - Testing handler map [org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping@2bef3229] in DispatcherServlet with name 'org.springframework.web.servlet.DispatcherServlet-44175c06' 2014-09-11 23:12:54 TRACE org.springframework.web.servlet.DispatcherServlet:1101 - Testing handler map [org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping@64c63847] in DispatcherServlet with name 'org.springframework.web.servlet.DispatcherServlet-44175c06' 2014-09-11 23:12:54 WARN org.springframework.web.servlet.DispatcherServlet:1120 - No mapping found for HTTP request with URI [/WEB-INF/views/index.jsp] in DispatcherServlet with name 'org.springframework.web.servlet.DispatcherServlet-44175c06'Если кто-нибудь скажет мне, какую часть головоломки я упустил, я буду очень признателен.
Спасибо.
1 ответ:
Комментарий Сотириоса подтолкнул меня вперед - как получить сервлет обработки Jsp во встроенную Пристань....
В
getServletContextHandler
я изменил экземпляр contextHandler, чтобы теперь он былWebAppContext
. К этому применяются все те же методы.Затем я создал этот метод, чтобы взять возвращенный WebAppContext и настроить обработку Jsp (фрагмент взят отсюда : https://github.com/jetty-project/embedded-jetty-jsp/blob/master/src/main/java/org/eclipse/jetty/demo/Main.java)
private void setupJspHandler(WebAppContext context) { //Ensure the jsp engine is initialized correctly JettyJasperInitializer sci = new JettyJasperInitializer(); ServletContainerInitializersStarter sciStarter = new ServletContainerInitializersStarter(context); ContainerInitializer initializer = new ContainerInitializer(sci, null); List<ContainerInitializer> initializers = new ArrayList<ContainerInitializer>(); initializers.add(initializer); context.setAttribute("org.eclipse.jetty.containerInitializers", initializers); context.addBean(sciStarter, true); // Set Classloader of Context to be sane (needed for JSTL) // JSP requires a non-System classloader, this simply wraps the // embedded System classloader in a way that makes it suitable // for JSP to use ClassLoader jspClassLoader = new URLClassLoader(new URL[0], this.getClass().getClassLoader()); context.setClassLoader(jspClassLoader); // Add JSP Servlet (must be named "jsp") ServletHolder holderJsp = new ServletHolder("jsp",JspServlet.class); holderJsp.setInitOrder(0); holderJsp.setInitParameter("logVerbosityLevel","INFO"); holderJsp.setInitParameter("fork","false"); holderJsp.setInitParameter("xpoweredBy","false"); holderJsp.setInitParameter("compilerTargetVM","1.7"); holderJsp.setInitParameter("compilerSourceVM","1.7"); holderJsp.setInitParameter("keepgenerated","true"); context.addServlet(holderJsp, "*.jsp"); }
I импортировал в мой maven pom следующее:
<dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-jsp</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>apache-jsp</artifactId> <version>${jetty.version}</version> </dependency>
А также мне пришлось отказаться от ведения журнала, поскольку запуск инициализатора сервлета сбросил ведение журнала для сканирования WebApplicationInitializer, поскольку он проверил весь путь к классу, хотя другие вопросы и страницы, похоже, дают некоторые подсказки о том, как с этим справиться, например....
Https://jira.codehaus.org/browse/JETTY-1503
Теперь она работает как красавица".
Спасибо