We help IT Professionals succeed at work.

Check out our new AWS podcast with Certified Expert, Phil Phillips! Listen to "How to Execute a Seamless AWS Migration" on EE or on your favorite podcast platform. Listen Now

x

How to retrieve parameters from web.xml  from a non HttpServlet class

prain
prain asked
on
Medium Priority
565 Views
Last Modified: 2012-08-13
Hello,
I have a supporting java POJO class that helps process some infor for a HttpServlet class.
If I have some environment parameters defined in the web.xml like this..

 <context-param>
      <param_name>Param1</param_name>
      <param-value>The actual value</param-value>
      <description> Again, some description </description>
    </context-param>

So how do I retrieve Param1, "The actual value" and "Again, some description" into three variables in my non HttpServlet class?
Comment
Watch Question

student
CERTIFIED EXPERT
Commented:
Unlock this solution with a free trial preview.
(No credit card required)
Get Preview
CERTIFIED EXPERT
Top Expert 2007

Commented:
Usually I pass the ServletContext to the class when I need the class to do something.  Or create a special class which reads web.xml parameters and provides them to the classes.  But I like rrz's approach, too.
rrzstudent
CERTIFIED EXPERT

Commented:
@mrcoffee
>Usually I pass the ServletContext to the class
In that case, why not pass the param values ?
>Or create a special class which reads web.xml parameters
Are you suggesting that the class parse the web.xml file ?  What with JAXP ?

Author

Commented:
Hello rrz@871311,
Sorry I am coming back to this problem late. Anyways I have two unclear questions:

1. well I understand all your work except for how the outside POJO (your last two lines) would know the ServletContext that was filled by the AppContextServlet.
I think my POJO (user of XML params) class need to know the ref of the Servlet (AppContextServlet) that loaded the web.xml params. If so how does my POJO (user of xml params) know to get the ref to that AppContextServlet?. Can you please clear this out?

2. Also in your
   String value1 = application.getInitParameter("Param1");
   why "Param1" ? should'nt that be "param_name" ?  (if you please look at mt original web.xml?)

thanks for the input.

prain

 
CERTIFIED EXPERT
Top Expert 2007

Commented:
>>1. well I understand all your work except for how the outside POJO (your last two lines) would know the ServletContext that was filled by the AppContextServlet.

AppContextServlet is the servlet rrz provided the code for.  It is loaded by the webapp, and gets the context parameters at that time.  So when your POJO calls AppContextServlet.getContext() it gets the values loaded when AppContentServlet was init'd.  AppContextServlet class needs to be imported into your POJO -- is that what you didn't understand?  Use the import statement.

>>   why "Param1" ? should'nt that be "param_name" ?  (if you please look at mt original web.xml?)

You explicitly named the parameter "Param1" in your question, which is why rrz used that.

Author

Commented:
AppContextServlet.getContext()

AppContextServlet does not have a getContext().

only the AppContextHolder has getContext().

Author

Commented:
And also I cannot agree with "Parm1".  "Param1" is the actual value of entry "param_name".
So the "Key" is "param_name" and value is "Param1". So I think  the call to the method shold be

String value1 = application.getInitParameter("param_name");

Cottect me if I wrong.

well, I am still not convinced how you would access the ServletContext from totally outside POJO. A ful example combined to the one you have shown will be helpful. I am specially confuded with the two lines

ServletContext application = AppContextHolder.getContext();
String value1 = application.getInitParameter("Param1");

Considering that these two lines are in a complete outside POJO.

CERTIFIED EXPERT
Top Expert 2007
Commented:
Unlock this solution with a free trial preview.
(No credit card required)
Get Preview

Author

Commented:
OK. The "Parm1" part I understand. Thank you for clarifying that.

OK now lets look at rrz's code. He says the last two lines are completely outside the Servlet class (AppContextServlet) . In fact AppContextHolder who is giving out the context via the getContext() is a totally independent class and an instance of that is getting "Filled" by the AppContexServlet. So far it is good.

So now truning into the two lines rrz wrote
ServletContext application = AppContextHolder.getContext();
String value1 = application.getInitParameter("Param1");

The above two lines are put into a POJO like this

Class MyTest{
public void testWebXMlreader()
{
ServletContext application = AppContextHolder.getContext();
String value1 = application.getInitParameter("Param1");
}
}
So now , how does this method (in class MyTest) know the AppContextHolder object that was filled by the AppContextServlet?  There is no syntax error. But my guess is that I will return null as the Param1 vlaue ,as there is no connection between the MyTest and AppContextServlet at this moment instantiated by the TomCat container. I think something (missing link) is missing.

What I think is that a reference to AppContextHolder instance that WAS FILLED by the AppContextServlet must be passed to the client (MyTest) somehow to get this working.

JMO.
prain

CERTIFIED EXPERT
Top Expert 2007

Commented:
You use the import statement.  In Java, classes are imported.

So you put something like -- depending on the class path for the AppContextServlet:

import com.mycompany.myapp.AppContextServlet;

at the top of your POJO code.
rrzstudent
CERTIFIED EXPERT

Commented:
Thank you, mrcoffee, for helping explain my code.  
>1.  
Tomcat(or whatever web server you are using) will load the Servlet when it starts your web app. We told it to do by including
<load-on-startup/>
within the <servlet> element which we placed in  the web app's web.xml file.  
When the Servlet is loaded its init method is called by Tomcat. In its init method the Servlet will set the context into the AppContextHolder class using a static method
AppContextHolder.set(config.getServletContext());  
Your POJO doesn't need to know anything about the instance of AppContextServlet.  Your POJO will ask the AppContextHolder  for the ServletContext object.  
ServletContext application = AppContextHolder.getContext();  

>In fact AppContextHolder who is giving out the context via the getContext() is a totally independent class and an instance of that is getting "Filled" by the AppContexServlet. So far it is good.  
Yes, the Servlet sets the context into AppContextHolder. But there is no instance. It just uses a static method and the class object.  

>as there is no connection between the MyTest and AppContextServlet  
There doesn't need to be.  

>What I think is that a reference to AppContextHolder instance that WAS FILLED by the AppContextServlet must be passed to the client (MyTest) somehow to get this working.  
No instance needed, just uses a static method.  The easiest way to make it work is to put the AppContextHolder class into the same package as your MyTest class.  
package test; // same as AppContextHolder
Class MyTest{
public void testWebXMlreader()
{
ServletContext application = AppContextHolder.getContext();
String value1 = application.getInitParameter("Param1");
}
}

Or alternatively, as mrcoffee said, use import statement.
>import com.mycompany.myapp.AppContextServlet;
No! not the Servlet .  
import com.mycompany.myapp.AppContextHolder;
rrzstudent
CERTIFIED EXPERT

Commented:
>and "Again, some description" into three variables in my non HttpServlet class?  
I don't know how to get the description.
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a free trial preview!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.