Java 完全不使用任何XML的Spring配置
我想创建一个完全不使用任何xml的spring应用程序(不使用web.xml、context.xml或任何东西)。到目前为止,它似乎工作得很好,只是我的视图解析器有一些问题,我无法自己解决 这是我的WebApplicationInitializerJava 完全不使用任何XML的Spring配置,java,spring,jsp,spring-mvc,jakarta-ee,Java,Spring,Jsp,Spring Mvc,Jakarta Ee,我想创建一个完全不使用任何xml的spring应用程序(不使用web.xml、context.xml或任何东西)。到目前为止,它似乎工作得很好,只是我的视图解析器有一些问题,我无法自己解决 这是我的WebApplicationInitializer public class AppConfig implements WebApplicationInitializer { private AnnotationConfigWebApplicationContext getContext()
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, "/*");
}
}
还有我的spring配置
@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错误
有什么建议吗?在控制器中,该方法应如下所示:
@RequestMapping(method = RequestMethod.GET)
public ModelAndView entry() {
return new ModelAndView("index");
}
更改:
dispatcher.addMapping("/*");
与所有内容不匹配的内容(否则会出现错误)。例如:
dispatcher.addMapping("*.html");
这样,应该显示jsp(将控制器中的@RequestMapping(“/”
)更改为更“人性化”的内容)
您还应更改此行,包括WEB-INF
:
resolver.setPrefix("/WEB-INF/pages/");
我不确定WebApplicationInitializer
是否正在执行(检查,他们建议在哪里使用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;
}
目前,所有人都可以访问所有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();
}
通过这两个更改,您可以确保JSP不被所有人访问,并使默认资源再次得到处理
我强烈建议您使用Spring Boot,因为这样可以简化您的生活 没用。字符串和请求方法也正式支持将字符串作为名称返回,但实际上并不是强制性的。如果未指定,则应应用所有方法您可以通过指定字符串条目返回字符串,但不能返回页面,因此ModelAndView返回类型绝对为mandatoryresolver.setPrefix(“/pages/”);resolver.setSuffix(“.jsp”);这两行指定了搜索jsp文件的位置,以及这些文件实际上是jsp。如果返回字符串时没有说@ResponseBody spring应该自己算出它应该是页面的名称,那么转到directory/pages并添加“.jsp”后缀。我知道它是有效的,我以前用xml配置做过很多次。你也可以在这里找到类似的解决方案,就像我之前提到的,你的解决方案仍然不能解决问题