获取非servlet类中的上下文路径

时间:2012-05-22 16:00:22

标签: java quartz-scheduler relative-path contextpath

在我的webapp中,我使用Quartz以某个间隔调用某个类中定义的方法,该方法作为参数之一,在我的WebContent目录中获取了一个css文件的路径。我的问题是如何从非servlet类中获取该css文件的路径。

我尝试过的一件事是我调用该方法的类扩展了HttpServlet以便我可以调用

String contextPath = getServletContext().getRealPath("");

但这不起作用,我的应用程序只挂在那一行。 我不想对路径进行硬编码,因为这似乎是不专业的:)

3 个答案:

答案 0 :(得分:3)

您无法从Quartz作业访问servlet上下文,因为作为请求处理管道的一部分不会调用作业。

为什么不将CSS文件路径作为作业的参数,以便它可以通过servlet / web-code调度/调用Quartz作业来传递?有关示例,请参阅the Quartz documentation

答案 1 :(得分:1)

如果将文件放在Web应用程序的WEB-INF / classes目录中,则可以使用getResourceAsStream()访问它。这将适用于WAR文件; getRealPath()不会。

为什么Quartz需要知道.css文件?那应该是纯粹的观点。

答案 2 :(得分:0)

不,我们可以从Quartz作业访问servlet上下文。

@Override
public void contextInitialized(ServletContextEvent sce) {
    try {
        //Create & start the scheduler.
        StdSchedulerFactory factory = new StdSchedulerFactory();
        factory.initialize(sce.getServletContext().getResourceAsStream("/WEB-INF/my_quartz.properties"));
        scheduler = factory.getScheduler();
        //pass the servlet context to the job
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("servletContext", sce.getServletContext());
        // define the job and tie it to our job's class
        JobDetail job = newJob(ImageCheckJob.class).withIdentity("job1", "group1").usingJobData(jobDataMap).build();
        // Trigger the job to run now, and then repeat every 3 seconds
        Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startNow()
              .withSchedule(simpleSchedule().withIntervalInMilliseconds(3000L).repeatForever()).build();
        // Tell quartz to schedule the job using our trigger
        scheduler.scheduleJob(job, trigger);
        // and start it off
        scheduler.start();
    } catch (SchedulerException ex) {
        log.error(null, ex);
    }
}

在Quartz作业中,我们可以获得如下的servlet上下文。

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
    ServletContext servletContext = (ServletContext) context.getMergedJobDataMap().get("servletContext");
    //...
}