I’m just wondering whether to keep some of my variables in Constants class or keep it in web.xml
Say, I want to keep a variable of Facebook graph API prefix or api_key
, client_id
From my understand, the difference between Constants.java and web.xml is web.xml is easier to rewrite on compile using ant.
So, you can replace your variables in web.xml according to what environment you are building you app for. (client_id
varies by development environment/production environment, for example)
If I understand it right, then Facebook graph API prefix should be kept in Constants.java (because it always is “https://graph.facebook.com/”) and api_key
, client_id
should be kept in web.xml?
What’s the proper way to use them?
In your scenario, these values are best kept in properties file. Create a properties file in classpath and read it at your application startup to instantiate the values. Or you can read them fresh for each request, if they tends to change. Java provides very easy way for reading/writing properties file with Properties
class.
You can also externalize the properties file if you want. i.e. put them into user home directory to make them completely independent. Think of it, when you change the value and the running application takes the new value without re-build or even re-deployment.
1
Well it really depends on how really “constant” they are:
-
if they’re true constants that never ever change, not when you change the deployment environment (integration, production, etc.), not when you deploy it at your client’s side, than it’s perfectly sensible to keep them as Java constants (final fields) in some Java class.
-
if they change with environment, having them as Java constants is obviously bad. Putting them in web.xml is somewhat better, but you’ll still have to change something in your project to redeploy to a different environment. What I like to do in these situations is pass the values as system properties. Your app should have a generic “Config” class which is able to recuperate the value of a system property given it’s name (via
System.getProperty("propName")
) and then configure my environment with specific values for those properties (via .bashrc, or via Web App Server start-up arguments).
1