Java 在非servlet类中获取上下文路径
在我的webapp中,我使用Quartz在某个时间间隔调用某个类中定义的方法,该方法作为参数之一,获取指向WebContent目录中css文件的路径。我的问题是如何从非servlet类中获取该css文件的路径 我尝试过的一件事是让调用该方法的类扩展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
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应该是关于视图的。我还是不明白,但我也不需要。祝你好运