Java 在非servlet类中获取上下文路径

Java 在非servlet类中获取上下文路径,java,quartz-scheduler,relative-path,contextpath,Java,Quartz Scheduler,Relative Path,Contextpath,在我的webapp中,我使用Quartz在某个时间间隔调用某个类中定义的方法,该方法作为参数之一,获取指向WebContent目录中css文件的路径。我的问题是如何从非servlet类中获取该css文件的路径 我尝试过的一件事是让调用该方法的类扩展HttpServlet,以便调用 String contextPath = getServletContext().getRealPath(""); 但这不起作用,我的应用程序就挂在这条线上。 我不想硬编码路径,因为这似乎不专业:)您无法从Quart

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

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

String contextPath = getServletContext().getRealPath("");
但这不起作用,我的应用程序就挂在这条线上。
我不想硬编码路径,因为这似乎不专业:)

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


为什么不将CSS文件路径作为作业的参数,以便servlet/web代码调度/调用Quartz作业可以传递它呢?请参阅以获取示例。

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


为什么不将CSS文件路径作为作业的参数,以便servlet/web代码调度/调用Quartz作业可以传递它呢?请参阅以获取示例。

如果将文件放在WEB应用程序的WEB-INF/classes目录中,则可以使用getResourceAsStream()访问该文件。这将与WAR文件一起工作;getRealPath()将不会


为什么Quartz需要了解.css文件?这应该是纯视图。

如果您将文件放在WEB应用程序的WEB-INF/classes目录中,您可以使用getResourceAsStream()访问它。这将与WAR文件一起工作;getRealPath()将不会


为什么Quartz需要了解.css文件?这应该是纯视图。

不,我们可以从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");
    //...
}

不,我们可以从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");
    //...
}

quartz调度的作业是一种将css filepath作为参数之一的方法。当您的代码调度作业时,是否将参数值传递给quartz,位于
JobDetail.setJobDataMap()
?quartz调度的作业是一种将css filepath作为参数之一的方法。当您的代码调度作业时,是否将参数值传递给Quartz,在
JobDetail.setJobDataMap()
中?Quartz不关心.css文件。这是quartz调用的方法,我无法想象为什么。Quartz在服务器端安排任务。css应该是关于视图的。我还是不明白,但我也不需要。祝你好运。Quartz不关心.css文件。这是quartz调用的方法,我无法想象为什么。Quartz在服务器端安排任务。css应该是关于视图的。我还是不明白,但我也不需要。祝你好运