如何在eclipse动态web项目中设置资源目录?
How to set resources directory in eclipse dynamic web project?
我想构建一个使用最少库的 Web 项目。所以我所做的只是在下面描述
- 在 Eclipse(Luna) 中创建动态 Web 项目
- 配置为 Maven 项目
- 并在 pom.xml
中导入一些库
- 实施
WebApplicationInitializer
我做了 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/
。
考虑到分配,我不能在代码中使用绝对路径。
我需要从项目服务器引用相关位置。有一些方法可以使用 HttpServletRequest
和 ServletContext
找到该目录,但我不能那样做,因为那些部分 - 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
。这是我一直在寻找的解决方案。
我想构建一个使用最少库的 Web 项目。所以我所做的只是在下面描述
- 在 Eclipse(Luna) 中创建动态 Web 项目
- 配置为 Maven 项目
- 并在 pom.xml 中导入一些库
- 实施
WebApplicationInitializer
我做了 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/
。
考虑到分配,我不能在代码中使用绝对路径。
我需要从项目服务器引用相关位置。有一些方法可以使用 HttpServletRequest
和 ServletContext
找到该目录,但我不能那样做,因为那些部分 - 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
。这是我一直在寻找的解决方案。