1

这里有人知道如何在tomcat服务器上加载文件吗?我们正在使用:Maven、JSF 2、Spring 3、Tomcat 7

我有以下项目结构:

结构体

我想加载 page.xml 文件!

我想过在服务器的 server.xml 中的 GlobalNamingResource 中设置一个环境变量。但是如何在我的 WebApp 中访问这个变量呢?

或者我可以使用 ContextClassLoader,但如果我想加载该文件,我总是会返回 null。

问题是,我不能使用 FacesContext,因为如果我调用 FacesContext.getCurrentInstance(); 会返回 null;

目前,我必须对路径进行硬编码才能使其工作。但是如果我想在 Eclipse 中测试它或者将它部署在服务器上,我总是必须更改这条路径。

@PostConstruct
public void loadMenu() {
             List<Page> pageCollection = new ArrayList<Page>();
    Page page = null;

    File xmlFile = new File(
            "C:\\Program Files\\Apache Software Foundation\\Tomcat 7.0\\webapps\\rainstar2-webapp\\WEB-INF\\classes\\at\\beko\\rainstar2\\page.xml");

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    try {
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document xmlDoc = db.parse(xmlFile);
        xmlDoc.getDocumentElement().normalize();

        NodeList pages = xmlDoc.getElementsByTagName("page");
        int size = pages.getLength();
        Node pageNode = null;

        for (int i = 0; i < size; i++) {
            pageNode = pages.item(i);
            NamedNodeMap attr = pageNode.getAttributes();
            page = new Page();
            page.setLabel(attr.getNamedItem("key").getNodeValue()
                    .toString());
            page.setRedirect(Boolean.valueOf(attr.getNamedItem("redirect")
                    .getNodeValue().toString()));
            page.setNavigationName(attr.getNamedItem("url").getNodeValue()
                    .toString());
            page.addRole(attr.getNamedItem("role").getNodeValue()
                    .toString());
            pageCollection.add(page);
        }
    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
4

2 回答 2

1

使用 JSF,您可以使用ResourceHandler。它适用于/webapp/resources. 我不完全确定下的资源/main

    FacesContext currentContext = FacesContext.getCurrentInstance();
    ResourceHandler resourceHandler = currentContext.getApplication()
            .getResourceHandler();
    Resource resource = resourceHandler.createResource(fileName, libraryName);

是 下的文件夹的libraryName名称/webapp/resources

编辑:不依赖 JSF,您可以使用旧的ClassLoader

     InputStream inputStream = this.getClass().getClassLoader()  
             .getResourceAsStream("/path/to/file/from/.war_as_root/fileName");  

请注意,该路径是相对于您打包的 .war 根目录的路径

于 2012-05-31T07:33:31.237 回答
0

好的,我的解决方案是。

我将 page.xml 放入 web-inf。

ClassLoader loader = Thread.currentThread().getContextClassLoader();
    URL url = loader.getResource("..\\page.xml");
    File xmlFile = null;
    try {
        xmlFile = new File(url.toURI());
    } catch (URISyntaxException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

在此处输入图像描述

于 2012-05-31T08:22:22.217 回答