我有一个Web应用程序,其中有几个servlet,一个servlet对webappBasePath中的init-param ServletConfig进行了假设。我不知道该如何设置,但是较旧的版本(例如,在centos 5主机上的tomcat 5上测试)tomcat5-5.5.23-0jpp.40.el5_9webappBasePath后面附加了'./',而较新的版本似乎没有这样做。 (编辑:在变量中没有附加“ ./”,下面的代码将ServletContext.getRealPath()调用为默认设置“。”,并且不同的tomcat版本处理情况也不同)

我在WEB-INF / web.xml中添加了一个新的servlet:

    <servlet>
        <servlet-name>TKServlet</servlet-name>
        <servlet-class>servlets.TKServlet</servlet-class>

    </servlet>

    <servlet-mapping>
        <servlet-name>TKServlet</servlet-name>
        <url-pattern>/tkservlet</url-pattern>
    </servlet-mapping>


TKServlet.java

package ImageGenerator;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.*;

import java.io.*;

public class TKServlet extends HttpServlet {
    private static final long serialVersionUID = 9830958231344L;

    private static String webappBasePath = ".";

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        if (config.getInitParameter("webappBasePath") != null) {
            webappBasePath = config.getInitParameter("webappBasePath");
            System.err.println("init-param 'webappBasePath' = " + webappBasePath);
        }
        webappBasePath = config.getServletContext()
                             .getRealPath(webappBasePath) + "/";
        System.err.println("getRealPath(webappBasePath) = " + webappBasePath);
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException {
        response.setContentType("text/ascii");
        PrintWriter out = response.getWriter();
        out.println("Here is some response doc.");
        out.println("webappBasePath is: " + webappBasePath);
    }
}


来自tomcat5的日志:http://localhost:8080/myapp/tkservlet

catalina.out:

getRealPath(webappBasePath) = /usr/share/tomcat5/webapps/XSLT_HIQ/./


登录tomcat8.5:

getRealPath(webappBasePath) = /adtech/tomcat/webapps/XSLT_HIQ/


问题:webappBasePath设置在哪里,我该如何修改?

最佳答案

找到了答案:我想,我只是在迷惑自己。如果您有兴趣,请参阅我的回答。

catalina.out日志显示根本没有设置初始化参数webappBasePath:如果已设置,则init-param 'webappBasePath' = <something>日志文件中将包含:catalina.out消息。

需要注意的一件事是,tomcat版本之间ServletContext.getRealPath()的输出是不同的,我想这是我的servlet代码中的错误。

当然,可以通过<init-params>文件中的WEB-INF/web.xml进行设置。

我添加了(在<servlet>标记内):

     <init-param>
        <param-name>webappBasePath</param-name>
        <param-value>/var/tmp/somewebapp/files/./</param-value>
     </init-param>
</servlet>


tomcat 5日志显示

init-param 'webappBasePath' = /var/tmp/somewebapp/files/./
getRealPath(webappBasePath) = /usr/share/tomcat5/webapps/XSLT_HIQ/var/tmp
                                  /somewebapp/files/./


tomcat8.5日志

init-param 'webappBasePath' = /var/tmp/somewebapp/files/./
getRealPath(webappBasePath) = /adtech/tomcat/webapps/XSLT_HIQ/var/tmp
                                  /somewebapp/files//


注意tomcat8.5上的ServletContext.getRealPath()通过删除单个点组件来“标准化”路径。

编辑

较老的tomcat版本,在ApplicationContext中使用以下代码(例如svn tc5.0.x中的示例)

public String getRealPath(String path) {
    // ...
    File file = new File(basePath, path);
    return (file.getAbsolutePath());

}


当较新的版本使用getRealPath中的StandardContext(4319-4349行here

public String getRealPath(String path) {
    if (resources != null) {
        // ...
            WebResource resource = resources.getResource(path);
            String canonicalPath = resource.getCanonicalPath();
            // ...

                return canonicalPath;
            }
    // ...
}


WebResource getCanonicalPath()调用java.io.File#getCanonicalPath()


  删除多余的名称,例如“。”和路径名称中的“ ..”


(从javadocs for File#getCanonicalPath复制)

08-03 15:45