Java 完全不使用任何XML的Spring配置

Java 完全不使用任何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()

我想创建一个完全不使用任何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, "/*");
    }
}
还有我的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配置做过很多次。你也可以在这里找到类似的解决方案,就像我之前提到的,你的解决方案仍然不能解决问题