I'm trying to add the following behaviour to my jersey service:
Load/Parse some files from the WEB-INF folder
Store it in a singleton for quick access through the application's life.
Right now the solution that I have working is:
Get the ServletContext for a ressource request
For each request which needs to access the files, call this method getSomething(criteria, servletContext)
I have to pass the servletContext around so that I may use it to load the ressource using method getRessourceAsStream() as otherwise, I cant get the right path. This is my main pain point.
I'd like to be able to make the server automatically do this once the server is ready in the application server but I'm unable to find where exactly this could be done. This would eliminate the need for me to always pass the servletContext around and would allow me to use that singleton in some of my custom deserializers and would make the code that uses this singleton cleaner.
Any time you find yourself wanting to do some work on startup in a Servlet application, use a ServletContextListener, specifically the contextInitialized(ServletContextEvent) method.
Related
In eclipse, everytime new servlet is created, it will not be automatically registered in web.xml. But why is that so ? I mean, from what I have read, DD is very efficient, for example, when we ever want to change something in our web app, like changing url pattern of servlet, we don't have to find the class, the container will handle it by its own. Should i register every servlet that i create in DD ?
Yes every servlet needs to be registered and mapped. Nowadays you can also do it via the #Servlet annotation.
I have embedded Jetty container inside my main server and I also use Jersey 2.5 for handling REST resources.
everything seems to work well and now I would like to pass my server's context class into each of my REST resources.
I'm having hard time understanding how to do that...
If someone can provide full code example - it could be awesome!
Many thanks
What exactly do you mean when you say you have a Jetty container inside your "main server"? Are you programmatically executing Jetty within the application? Also, when you say "context" are you referring to the ServletContext?
Is it possible to change the init parameters so that the servlet is created at a different path? I need to create a servlet at a certain path. Furthermore, would it be possible to artificially pass the path inside the init parameters?
As already shown in other answers, the servlet mapping is not controlled by the servlet, therefore you can't change that from within a servlet instance.
However, you can work around this by introducing a level of indirection (something like a "dispatcher" servlet): map your servlet to a wildcard pattern (like /app/*) and inside your servlet decide the actual action based on the request url path: /app/X will trigger some X action, while /app/Y will trigger Y.
Lots of web frameworks will provide the full functionality out of the box: you can have a look at Spring MVC's DispatcherServlet and its HandlerMapping concept, for instance.
Servlets aren't created at a certain path. They are Java objects that the servlet container Java application creates. If you are running Tomcat, for example, your application will run from the /webapps directory. The most you can do is change the Tomcat configuration to run it from some other path, but you'll have to do this before actually starting the application.
Short answer - you can't change anything related to servlet path mapping in init, since servlet container has already read mapping from web.xml.
Longer answer - you may want to look at servlet loader in Tomcat for example, perhaps it's possible to either invoke it's methods through JMX or do something else.
If you just want to have several mappings and choose which one to serve depending on configuration - use Servlet Filter
Is there any way to get access to the ServletContext from a method without passing the ServletContext as an argument?
I need to have a generic Configuration class that can work on several environments and load the config in a way depending on the environment.
For example, when in a web app, i need to get the configuration from either web.xml or a config file stored in WEB-INF.
But in order to know if the app is running in a web app i need to gain access to the ServletContext somehow.
Any ideas?
Have a class that holds servlet context as static field initilize it from ServletContextListener
I want to use the Model-View-Controller template while writing my Web App. The problem is, the Model part of the code has already been written in Swing. The Model code also must require the container to call its main method before any interaction with its servlets. So is there a way for me to specify the location of the main method in the Deployment Descriptor so that the container calls the main method and compiles the code, and then, keeps it running for the entire duration the server is running without in any way restarting or recompiling the model class in between.
Try looking into load-on-startup parameter of servlet in Deployment Descriptor (DD). Precisely, it will load that particular servlet on server start-up.
Moreover, you should read about request lifecycle, request/session/application context. And you must look into JSP (or any other popular technology) for creating V of MVC. How URL mapping works.
Main method is basically work as an entry point in our application. Whereas in web application there is no particular entry point. Or if there is you can think of a welcome page. You might also want to look into welcome-file-list parameter of DD.
Cheers.
To run initialization when a web app is loaded, you can either use the servlet's init method or a ServletContextListener. You can call the main method from either of those yourself.