如何在eclipse动态web项目中设置资源目录?

How to set resources directory in eclipse dynamic web project?

我想构建一个使用最少库的 Web 项目。所以我所做的只是在下面描述

我做了 2 个配置 类 和初始化程序,它看起来像...

RootConfig.java 打算替换 'root-context.xml'...

@Configuration
public class RootConfig {

    @Value(value="${jdbc.driverClassName}")
    private String jdbcDriverClassName;

    @Value(value="${jdbc.url}")
    private String jdbcUrl;

    @Value(value="${jdbc.username}")
    private String jdbcUsername;

    @Value(value="${jdbc.password}")
    private String jdbcPassword;

    private static final String RESOURCE_LOCATION = "resources";

    @Bean
    public static PropertyPlaceholderConfigurer propertyPlaceholder() {
        PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        Resource[] resources = new ClassPathResource[]{ 
                new ClassPathResource(RESOURCE_LOCATION + File.separator + "properties"
                        + File.separator + "jdbc" + File.separator + "jdbc.properties")
        };
        ppc.setLocations(resources);
        return ppc;
    }

    @Bean
    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(this.jdbcDriverClassName);
        dataSource.setUrl(this.jdbcUrl);
        dataSource.setUsername(this.jdbcUsername);
        dataSource.setPassword(this.jdbcPassword);
        return dataSource;
    }
};

这是 ServletConfig.java,它应该是 'servlet-context.xml'...

的替代品
@Configuration
@EnableWebMvc
@EnableAsync
@ComponentScan(
    basePackages= {
            "com.gosports.api.controller"
            , "com.gosports.common.controller"
            , "com.gosports.test.controller"
    }
    , excludeFilters=@ComponentScan.Filter(Configuration.class)
)
public class ServletConfig extends WebMvcConfigurerAdapter {

    @Bean
    public ViewResolver viewResolver () {
        InternalResourceViewResolver vResolver = new InternalResourceViewResolver();
        vResolver.setPrefix("/WEB-INF/views/");
        vResolver.setSuffix(".jsp");
        return vResolver;
    }
}

最后,我的初始化程序...

public class WASInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext arg0) throws ServletException {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(RootConfig.class);
        context.register(ServletConfig.class);

        context.setServletContext(arg0);
        Dynamic servlet = arg0.addServlet("dispatcher", new DispatcherServlet(context));
        servlet.addMapping("/");
        servlet.setLoadOnStartup(1);
    }
};

自从我将我的 'jdbc.properties' 文件放入 /{project_location}/src/resources/properties/ 后它就起作用了。

但是我想做的是把这个文件放在/WEB-INF/resources/properties/。 考虑到分配,我不能在代码中使用绝对路径。

我需要从项目服务器引用相关位置。有一些方法可以使用 HttpServletRequestServletContext 找到该目录,但我不能那样做,因为那些部分 - propertyPlaceholder() 部分 - 是静态方法。

有什么好的例子或解决方案吗? 我真的不想使用 Spring 模板或 xml。 有没有可能我只是想用 java 个文件来做?

谢谢你的回答:D

您可以获得 Thread#getContextClassLoader() 返回的类加载器。

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

/WEB-INF 文件夹不在类路径的根目录中,而是它的 /WEB-INF/classes 文件夹,您需要从中加载相对于的属性文件。

classLoader.getResourceAsStream("/jdbc.properties");

或者您可以将它们阅读为始终有效的资源。

AppServiceClass.class.getClassLoader().getResourceAsStream("/jdbc.properties");

首先,您不应再使用 PropertyPlaceholderConfigurer,而应使用 PropertySOurcesPlaceholderConfigurer。接下来不要自己加载文件,只需在 class 上使用 @PropertySource。将文件放在 src/main/resources 中,然后 Maven 会将其添加到 class 路径中。

@Configuration
@PropertySource("classpath:/properties/jdbc/jdbc.properties")
public class RootConfig {

    @Bean
    public static PropertySources PlaceholderConfigurer propertyPlaceholder() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

这假设您的所有属性都在您创建的目录结构中的 src/main/resources 中。

感谢您的回答:D

但也许我的解释还不够,所以我必须找到出路。以下是我为动态 Web 项目设置资源文件夹的解决方案。

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    // TODO Auto-generated method stub
    //super.addResourceHandlers(registry);
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/").setCachePeriod(31556926);;
}   

坦率地说,直到 addResourceLocations,我才明白,但不了解 setCachePeriod。这是我一直在寻找的解决方案。