【问题标题】:Spring configuration without any XMLs at all完全没有任何 XML 的 Spring 配置
【发布时间】:2015-03-24 08:31:29
【问题描述】:

我想创建一个完全不使用任何 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.jsp 的内容,我只得到一个 404 错误。

有什么建议吗?

【问题讨论】:

    标签: java spring jsp spring-mvc jakarta-ee


    【解决方案1】:

    变化:

        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;
    }
    

    【讨论】:

      【解决方案2】:

      目前大家都可以访问你所有的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();
      }
      

      通过这 2 项更改,您可以防止所有人访问您的 jsps,并再次处理默认资源。

      我强烈建议使用 Spring Boot,因为这会真正简化您的生活。

      【讨论】:

        【解决方案3】:

        在您的控制器中,该方法应如下所示:

        @RequestMapping(method = RequestMethod.GET)
        public ModelAndView entry() {
            return new ModelAndView("index");
        } 
        

        【讨论】:

        • 没有帮助。字符串也正式支持将字符串作为名称返回,并且请求方法并不是真正强制性的。如果未指定,则应应用所有方法
        • 您可以通过指定 String 条目返回字符串但不能返回页面,因此 ModelAndView 返回类型是绝对必需的
        • resolver.setPrefix("/pages/"); resolver.setSuffix(".jsp");这两行指定应该在哪里搜索 jsp 文件,并且这些文件实际上是 jsp。如果您返回字符串而没有说@ResponseBody spring 应该自己找出它应该是页面的名称,请转到目录 /pages 并添加“.jsp”后缀。我知道它有效,我以前用 xml 配置做过很多次。您可以在这里找到类似的解决方案tutorialspoint.com/spring/spring_web_mvc_framework.htm 另外,就像我之前提到的,您的解决方案仍然无法解决问题
        猜你喜欢
        • 1970-01-01
        • 2014-01-24
        • 1970-01-01
        • 1970-01-01
        • 2020-09-29
        • 2014-06-14
        • 1970-01-01
        • 2015-05-24
        • 1970-01-01
        相关资源
        最近更新 更多