Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设置JSP/Tomcat/Windows的目录权限_Java_Windows_Jsp_Tomcat_Permissions - Fatal编程技术网

Java 设置JSP/Tomcat/Windows的目录权限

Java 设置JSP/Tomcat/Windows的目录权限,java,windows,jsp,tomcat,permissions,Java,Windows,Jsp,Tomcat,Permissions,我有一个web应用程序,它包含一些以前在Linux机器上运行的JSP。我需要在运行Tomcat 5.5.29的Windows XP SP3机器上运行此程序。现在,除了这一项外,大部分功能都正常工作:该应用程序能够将配置文件写入其Windows目录(即C:\Program Files\Apache\Tomcat\webapps\myapp)。但当它尝试这样做时,应用程序无法打开FileOutputStream(返回null)。如果我去掉路径说明符,让它打开文件,它就会在Tomcat目录中成功地打开

我有一个web应用程序,它包含一些以前在Linux机器上运行的JSP。我需要在运行Tomcat 5.5.29的Windows XP SP3机器上运行此程序。现在,除了这一项外,大部分功能都正常工作:该应用程序能够将配置文件写入其Windows目录(即C:\Program Files\Apache\Tomcat\webapps\myapp)。但当它尝试这样做时,应用程序无法打开FileOutputStream(返回null)。如果我去掉路径说明符,让它打开文件,它就会在Tomcat目录中成功地打开它

第一行失败,但第二行成功:

//  outputFile2 = new PrintWriter(new FileOutputStream(basePathName + "programAll.txt", false));
    outputFile2 = new PrintWriter(new FileOutputStream("programAll.txt", false));
以下是创建basePathName的代码:

    String basePathName = getBaseFilePath();  
    ...
    public String getBaseFilePath()
            {
            String curDir = System.getProperty("catalina.home");  
            curDir = curDir + "/webapps/pubmed/"; 
            curDir = "file:///" + formatPathNameForOS(curDir);
            return curDir;
            }

   public String formatPathNameForOS(String pathName)
        {
        if (codeIsOnWindows())
            {
            pathName = pathName.replace('/','\\');
            }
        else
            {
            pathName = pathName.replace('\\','/');
            }
        return pathName;
    }
以下是异常消息:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:460)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:321)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:257)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
root cause

java.lang.NullPointerException
    org.apache.jsp.updateMemberLists_jsp._jspService(updateMemberLists_jsp.java:1492)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:321)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:257)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
以下是堆栈跟踪:

Aug 6, 2010 1:20:39 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
    at org.apache.jsp.updateMemberLists_jsp._jspService(updateMemberLists_jsp.java:1492)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:321)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:257)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    at org.globus.tomcat.coyote.valves.HTTPSValve55.invoke(HTTPSValve55.java:45)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873)
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    at java.lang.Thread.run(Thread.java:595)
我已经查看了updateMembersLists_jsp.java,下面是出现空指针的部分:

//create a file to write to the output
PrintWriter outputFile2 = null;
try
    {
    outputFile2 = new PrintWriter(new FileOutputStream(basePathName + "programAll.txt", false));
//  outputFile2 = new PrintWriter(new FileOutputStream("programAll.txt", false));
    }
    catch (FileNotFoundException e)
        {
        out.write("<p><font color='red'>Error Saving</font></p>");
        }
outputFile2.print(output);  // THIS IS LINE 1492 -- NULL POINTER
outputFile2.close();
这似乎没有任何效果。运行tomcat的Windows用户对pubmed目录具有读/写权限。除了这个webapp将文件写入自己的目录似乎有问题之外,我还缺少什么


Sean

您不应该在Java IO中使用相对路径。路径将成为相对于当前工作目录的路径,这取决于您如何启动webserver/webapplication。例如,在Eclipse中启动Tomcat时,它可能是Eclipse项目目录。从CMD启动Tomcat时,它可能是CMD中当前打开的文件夹。当Tomcat作为服务启动时,它可能是Tomcat的
/bin
文件夹。要自行确定,请执行以下操作:

System.out.println(new File("programAll.txt").getAbsolutePath()); 
你会发现这和你想象的完全不同

您需要指定绝对路径。您可以使用将webcontent相对路径转换为绝对磁盘文件系统路径

String relativeWebPath = "programAll.txt";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
output = new FileOutputStream(absoluteDiskPath);
// ...
该方法在每个servlet中都可用



也就是说,您是否考虑到,每当您重新部署/重新启动webapp/服务器时,webcontent中所有修改的文件都将被擦除/覆盖?如果您想拥有更持久的存储空间,我强烈建议您将其存储在webcontent之外(当然是绝对路径,例如
/var/webapp/files
等等)。

尝试以下方式获取路径:

String path = getServletContext().getRealPath("/");

这将把您的路径(到您的webapp)转换为磁盘上的实际路径。

问得好。它是file:///C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\pubmed\抱歉,还有一个问题:您是如何获得它的?原始问题经过编辑,包括如何获得basePathName。我添加了您描述的getServletContext代码,它返回的路径与我一直使用的路径相同。因此,虽然我现在更了解相对路径的细微差别,但我不认为这是我遇到的问题。我在上面的注释中列出的basePathName字符串不是绝对的吗?哦,我明白了。您能否更新您的问题以包含完整的异常消息和跟踪?我认为你说它返回空值有点含糊不清。从字面上看,情况并非如此。部分
新文件输出流(路径)
只能返回一个完整的实例或抛出一个异常,而不是null。@BalusC没错,这就是我所想的,我认为basePathname是null OK,问题用msg和trace更新。哦,天哪,这没有多大帮助。你写得很生硬。你确定什么是空的吗?如果是,请在代码中指出。如果没有,您现在应该在编辑器中打开服务器生成的
updateMemberLists_jsp.java
文件,并转到第1492行,告诉我们什么是null。至少,这似乎还不是权限问题。它似乎返回与我上面列出的绝对路径相同的路径。@如果您提到的路径是URL(文件:/URL),getRealPath(“/”)将不会返回类似字符串的URL。有两个选项可供尝试:1)将路径更改为正确的URL(使用前斜杠)并查看;或2)使用从getRealPath()获得的路径。同样像Balus提到的,任何日志/堆栈跟踪都会很有用,因为它可以工作!把getRealPath放进去就成功了。我想当我第一次尝试这个的时候,斜线是错误的。多谢各位--
String path = getServletContext().getRealPath("/");