如何在Java中向Servlet上下文添加别名? [英] How do I add aliases to a Servlet Context in java?

查看:0
本文介绍了如何在Java中向Servlet上下文添加别名?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个在Tomcat下运行的Servlet。 我需要提供一些文件,我想我们可以将它们称为半静态(偶尔会发生变化……它们由应用程序的另一部分更新)从外部(到Web应用程序)目录。 通过将以下代码添加到META-INF目录中的我的Conext.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文档,但我找不到它有多大帮助。 非常感谢您的帮助。


(来源:choicecomp.com)

Tomcat7

以下是我根据不同操作系统动态设置推荐答案上下文别名的工作代码。您当然可以改进

public class ContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
    ServletContext context = sce.getServletContext();

    // tomcat 7.x
    try {
        MBeanServer mBeanServer = MBeanServerFactory.findMBeanServer(null).get(0);
        ObjectName name = new ObjectName("Catalina", "type", "Server");
        Object server = mBeanServer.getAttribute(name, "managedResource");

        Object service = server.getClass().getMethod("findService", String.class).invoke(server, "Catalina");  //StandardService[Catalina]
        Object connectors = service.getClass().getMethod("findConnectors").invoke(service);
        Object engine = service.getClass().getMethod("getContainer").invoke(service);  //StandardEngine[Catalina]
        Object host = Array.get(engine.getClass().getMethod("findChildren").invoke(engine), 0);  //StandardHost[Catalina]
        Object stdContext = Array.get(host.getClass().getMethod("findChildren").invoke(host), 0);  //StandardContext[Catalina]
        Object mapper = stdContext.getClass().getMethod("getMapper").invoke(stdContext);
        //just a clean up step(remove the host)
        Field f1 = mapper.getClass().getDeclaredField("context");
        f1.setAccessible(true);
        Object ct = f1.get(mapper);

        Field f2 = ct.getClass().getDeclaredField("resources");
        f2.setAccessible(true);
        Object rs = f2.get(ct);

        Field f3 = rs.getClass().getDeclaredField("dirContext");
        f3.setAccessible(true);
        Object dc = f3.get(rs);

        mapper.getClass().getMethod("removeHost",String.class).invoke(mapper, host.getClass().getMethod("getName").invoke(host));
        //add the host back with all required aliases
        switch (OsCheck.getOperatingSystemType()) {
            case Windows:
                dc.getClass().getMethod("setAliases",String.class).invoke(dc,"/img/avatars=" + winAvatarAlias);
                break;
            default:
                dc.getClass().getMethod("setAliases",String.class).invoke(dc,"/img/avatars=" + linuxAvatarAlias);
                break;
        }
        String ports = "";
        for (Object o :(Object[]) connectors ) {
            ports = ports + (Integer)o.getClass().getMethod("getPort").invoke(o) + " ";
        }
        log.info("Tomcat 7.x detected, service {}, engine {}, host {}, stdContext {}, server port: {}",
                service.getClass().getMethod("getName").invoke(service),
                engine.getClass().getMethod("getName").invoke(engine),
                host.getClass().getMethod("getName").invoke(host),
                stdContext.getClass().getMethod("getDisplayName").invoke(stdContext),
                ports);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

这篇关于如何在Java中向Servlet上下文添加别名?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆