servlets - 如何在 java 中向 Servlet 上下文添加别名?

标签 servlets static context.xml aliases

我有一个在 Tomcat 下运行的 servlet。 我需要提供一些文件,我想我们可以将它们从外部(到 WEB-APP)目录称为半静态(偶尔会改变......它们由应用程序的另一部分更新)。 我已成功通过将以下内容添加到 META-INF 目录中的 context.xml 来做到这一点

<Context aliases="/working_dir=c:/apache_tomcat_working_dir" ></Context>

这工作正常,在我的 HTML 中我将该文件称为

<img src="/myWebbApp/working_dir/fixpermin_zoom.png">

以及在我的 WEB-INF 内的 web.xml 中 我让默认服务器处理 png 文件如下

<!-- use default for static serving of png's, js and css, also ico -->
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
</servlet-mapping>

所以这工作正常。但我想从 java 代码内部设置外部目录,而不是通过编辑 context.xml 文件。

现在,在 servlet 的 init() 方法中,我可以获得 ServletContext。

    ServletContext sc =  getServletContext();

如果我在调试器中检查此变量 sc,我可以看到别名字符串几个级别的深度,请参阅附图。如何以编程方式获取此别名字符串? 我已经检查了 ServletContext 文档,但我发现它不是很有帮助。 非常感谢任何帮助。

debug view of serveletcontext
(来源:choicecomp.com)

最佳答案

正如您在调试器中看到的,您的上下文是 Tomcat 的上下文对象org.apache.catalina.core.StandardContext

您可以在 Tomcat 6 及更低版本中尝试以下步骤:

    StandardEngine engine = (StandardEngine) ServerFactory.getServer().findService("Catalina").getContainer();
    StandardContext context = (StandardContext) engine.findChild(engine.getDefaultHost()).findChild(getServletContext().getContextPath());
    Mapper mapper = context.getMapper();

现在您可以使用 Mapper 类的 addHostAlias(String HostName, String alias) 方法添加主机别名。

    mapper.addHostAlias(engine.getDefaultHost(), "myAlias");

这是 Tomcat 7 的代码片段:

    MBeanServer mBeanServer = MBeanServerFactory.findMBeanServer(null).get(0);
    ObjectName name = new ObjectName("Catalina", "type", "Server");
    Server server = (Server) mBeanServer.getAttribute(name, "managedResource");
    StandardEngine engine = (StandardEngine) server.findService("Catalina").getContainer();
    StandardContext context = (StandardContext) engine.findChild(engine.getDefaultHost()).findChild(getServletContext().getContextPath());
    Mapper mapper = context.getMapper();
    mapper.addHostAlias(engine.getDefaultHost(), "myAlias");

如果映射器中没有主机,请尝试以下操作:

    MBeanServer mBeanServer = MBeanServerFactory.findMBeanServer(null).get(0);
    ObjectName name = new ObjectName("Catalina", "type", "Server");
    Server server = (Server) mBeanServer.getAttribute(name, "managedResource");
    StandardEngine engine = (StandardEngine) server.findService("Catalina").getContainer();
    StandardContext context = (StandardContext) engine.findChild(engine.getDefaultHost()).findChild(getServletContext().getContextPath());
    Mapper mapper = context.getMapper();
    //just a clean up step(remove the host)
    mapper.removeHost(engine.getDefaultHost());
    //add the host back with all required aliases 
    mapper.addHost(engine.getDefaultHost(), new String[]{"myAlias"}, engine.getDefaultHost());

希望这有帮助!

关于servlets - 如何在 java 中向 Servlet 上下文添加别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12715331/

相关文章:

java - 无法在 jQuery 中使用 $post 将数据发送到 servlet

java - 将 java.util.Map 从 jsp 传递到 servlet

javascript - ajax调用servlet时不会调用成功回调函数

java - 如何从 HttpServlet 调用 RemoteServiceServlet 中的方法?

oop - 我应该使这些方法成为非静态的吗

c - "static"在C中是什么意思?

c# - 有没有办法在 C# 的子类中强制存在静态成员?

java - 有什么办法可以在运行时将字符串存储在 context.xml 中?

Tomcat 和上下文路径

java - 将具有自定义领域的 Web 应用程序部署到 Tomcat 6 后出现 HTTP 状态 404