我想加载存储在:
中的xsd文件/WEB-INF/myxsd.xsd
我将在我的控制器动作中引用它,不知道该怎么做。
另外,既然我会一直引用这个,那么我可以加载一次而不是按照请求加载吗?
public String create() {
// load xsd file here
}
您使用相对路径还是完整路径?
更新
我已经有了这个代码需要xsd文件,我将根据模式进行验证。
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(schemaFile);
我需要帮助初始化schemaFile,似乎newSchema有一些重载(文件,URI等),但是这是一个本地文件所以正确的文件是有意义的吗?
Validator validator = schema.newValidator();
我需要帮助从my / Web-inf /文件夹加载此xsd文件。
答案 0 :(得分:2)
ServletContext有一个方法getRealPath()。因此,servletContext.getRealPath(" WEB-INF")将为您提供WEB-INF目录的绝对路径。 击>
使用ServletContext#getResourceAsStream()。
要为每个请求加载一次,您可以创建一个字段并加载它。
但更好的方法是将其作为具有生命周期监听器的上下文属性加载。
答案 1 :(得分:1)
恕我直言,Spring的做法是将SchemaFactory
和Resource
注入控制器并仅初始化一次Schema。注:根据{{3}} Schema
是线程安全的。
public class MyController ... implements InitializingBean {
private SchemaFactory schemaFactory;
private Schema schema;
private Resource schemaResource;
public void setSchemaFactory(SchemaFactory schemaFactory) {
this.schemaFactory = schemaFactory;
}
public void setSchemaResource(Resource schemaResource) {
this.schemaResource = schemaResource;
}
public void afterPropertiesSet() throws Exception {
Source xsdSource = new StreamSource(schemaResource.getInputStream());
schema = schemaFactory.newSchema(xsdSource);
}
public void create() {
// use schema
}
}
春天配置:
<bean id="schemaFactory"
class="javax.xml.validation.SchemaFactory"
factory-method="newInstance">
<constructor-arg>
<util:constant static-field="javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI"/>
</constructor-arg>
</bean>
<bean id="myController" class="...MyController">
<property name="schemaFactory" ref="schemaFactory" />
<property name="resource" value="/WEB-INF/myxsd.xsd" />
</bean>