我想创建一个根本不使用任何XML的spring应用程序(没有web.xml,没有context.xml或任何东西)。到目前为止它似乎工作得很好,除了我的视图解析器有一些问题,我无法自己解决。
这是我的WebApplicationInitializer
public class AppConfig implements WebApplicationInitializer {
private AnnotationConfigWebApplicationContext getContext() {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.setConfigLocation("fi.cogniti.service.config");
return context;
}
@Override
public void onStartup(javax.servlet.ServletContext servletContext) throws ServletException {
WebApplicationContext context = getContext();
servletContext.addListener(new ContextLoaderListener(context));
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(
context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");
// Enabling spring security
// servletContext.addFilter("springSecurityFilterChain", new DelegatingFilterProxy("springSecurityFilterChain"))
// .addMappingForUrlPatterns(null, false, "/*");
}
}
和我的弹簧配置
@Configuration
@EnableWebMvc
@ComponentScan("fi.cogniti.service")
public class SpringConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
}
@Bean
public ViewResolver getViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setViewClass(JstlView.class);
resolver.setPrefix("/pages/");
resolver.setSuffix(".jsp");
return resolver;
}
}
最后是我的控制器
@Controller
@RequestMapping("/")
public class HomeController {
@RequestMapping
public String entry() {
return "index";
}
}
index.jsp
位于src/main/webapp/pages/index.jsp
。
因此,如果在我的控制器中我使用注释@ResponseBody
,那么控制器会给我响应" index"因此我知道我的配置至少在某种程度上有效,但是,如果我删除注释希望它会返回index.jsp
的内容,我只会得到404错误。
有什么建议吗?
答案 0 :(得分:0)
更改:
dispatcher.addMapping("/*");
与某些内容不匹配的内容(否则会出现this错误)。例如:
dispatcher.addMapping("*.html");
通过这种方式,http://localhost:8080/.html应该显示jsp(将控制器中的@RequestMapping("/")
更改为'人'更多的东西)
您还应该更改此行,包括WEB-INF
:
resolver.setPrefix("/WEB-INF/pages/");
我不确定WebApplicationInitializer
是否正在执行(请检查this,他们建议使用ServletContextInitializer
,但仍然会产生问题)。
如果是这种情况,则无法使用.addMapping("*.html")
。如果是这种情况,您可以将以下行添加到SpringConfig
以获得相同的结果:
@Bean
public DispatcherServlet dispatcherServlet() {
return new DispatcherServlet();
}
@Bean
public ServletRegistrationBean dispatcherServletRegistration() {
ServletRegistrationBean registration = new ServletRegistrationBean(
dispatcherServlet(), "*.html");
registration
.setName(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);
return registration;
}
答案 1 :(得分:0)
目前所有人都可以访问所有jsp文件,建议将它们放在WEB-INF中而不是顶层。
然后将视图解析器的配置修改为以下内容。
@Bean
public ViewResolver getViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/pages/");
resolver.setSuffix(".jsp");
return resolver;
}
您无需设置viewClass
属性,因为这是您确定的属性。
接下来添加以下内容,让DispatcherServlet
传递无法自行处理的请求。由于您将servlet映射到/
。
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
通过这两项更改,您可以确保所有人都可以访问您的jsps,并再次处理默认资源。
我强烈建议使用Spring Boot,这样可以简化您的生活。
答案 2 :(得分:-1)
在您的控制器中,该方法应如下所示:
@RequestMapping(method = RequestMethod.GET)
public ModelAndView entry() {
return new ModelAndView("index");
}