Servlet & JSP – 07 – ServletContext

Merhaba Arkadaslar,
Bir onceki yazida ServletConfig ve metotlarini inceleik. Bu bolumde ise ServletContext arabiriminden ve metotlarindan bahsedecegiz.

ServletContext

Onceki yazida ServletConfig yardimi ile servletin init parametrelerine ulasmistik. Peki bu init parametreler sadece bir servlet icin degil tum uygulamamiz icin olamaz mi ? Tabi ki olabilir, bu init parametrelere de context init parameter denilir.

Context init parametreleri ayni servlet init parametreleri gibidir sadece tum servlet ve jsp dosyalari bu parametrelere ulasabilir.

Context init parametlerine ulasabilecegimiz metotlarla birlikte ServletContext icerisinde bir cok metot yer almaktadir. Bu bolumde bu metotlarin bir kismini inceleyecegiz.

public String getInitParameter(String name);
public Enumeration<String> getInitParameterNames();
public Object getAttribute(String name);
public Enumeration<String> getAttributeNames();
public void setAttribute(String name, Object object);
public void removeAttribute(String name);
public int getMajorVersion();
public String getServerInfo();
public String getRealPath(String path);
public String getServletContextName();
public String getContextPath();
public InputStream getResourceAsStream(String path);
public RequestDispatcher getRequestDispatcher(String path);

Her servlet icin bir ServletConfig objesi vardir.
Tum proje/wepapp icin sadece bir ServletContext objesi vardir.

Eger dagitik/distributed bir uygulamamiz varsa bu durumda her JVM icin bir ServletContext ve her JVMdeki ilgili Servlet objesi icin de bir ServletConfig objesi olacaktir.

Adim-1
Container, deployment descriptor(web.xml) dosyasini okur.

Adim-2
Container, her <context-param> etiketine karsilik bir name/value (isim/deger) cifti olusturur.

Adim-3
Container, ServletContext instance/ornegi/objesi olusturur.

Adim-4
ServletContext, bu name/value ciftlerine ulasmak icin referansa sahiptir.

Adim-5
Tum Servletler ve JSP dosyalari bu ServletContext’e ulasabilir.

servlet context

Context parametrelerini anlayabilmek icin kucuk bir uygulama yapalim.

Context Parameter vs Servlet Init Parameter

Yeni bir paket ve sinif olusturdum;
_04_ServletContext
HelloServletContext

web.xml
Deployment descriptor, yani web.xml dosyamiza yeni sinifimizin tanimlarini ve 2 context-param tanimini yapalim. Ayrica bu servletimiz icin servlet init parametreleri de ekleyelim.

	<servlet>
		<servlet-name>HelloServletContext</servlet-name>
		<servlet-class>_04_ServletContext.HelloServletContext</servlet-class>
		<init-param>
			<param-name>name</param-name>
			<param-value>Levent</param-value>
		</init-param>

		<init-param>
			<param-name>surname</param-name>
			<param-value>Erguder</param-value>
		</init-param>
	</servlet>

	<servlet-mapping>
		<servlet-name>HelloServletContext</servlet-name>
		<url-pattern>/helloservletcontext</url-pattern>
	</servlet-mapping>

	<context-param>
		<param-name>email</param-name>
		<param-value>erguder.levent@gmail.com</param-value>
	</context-param>

	<context-param>
		<param-name>address</param-name>
		<param-value>Istanbul</param-value>
	</context-param>


HelloServletContext.java

package _04_ServletContext;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServletContext extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		ServletContext context = getServletContext();
		ServletConfig config = getServletConfig();

		String email = context.getInitParameter("email");
		String address = config.getServletContext().getInitParameter("address");
		String name = config.getInitParameter("name");
		String surname = config.getInitParameter("surname");

		PrintWriter pw = resp.getWriter();

		pw.print("<html><body>");
		pw.print(name + "  " + surname + "<br>");
		pw.print(email + "<br>");
		pw.print(address + "<br>");
		pw.print("</body></html>");

		System.out.println("Servlet Init Parameteres Names");
		Enumeration<String> servletInitParams = config.getInitParameterNames();
		while (servletInitParams.hasMoreElements()) {
			System.out.println(servletInitParams.nextElement());
		}

		System.out.println("Context Init Parameters Names");
		Enumeration<String> contextInitParams = context.getInitParameterNames();
		while (contextInitParams.hasMoreElements()) {
			System.out.println(contextInitParams.nextElement());
		}

	}

}

Kodlari inceleyecek olursak ;

getServletContext metodu bize ServletContext objesini dondurecektir , bu metot GenericServlet sinifinda yer almaktadir.

    @Override
    public ServletContext getServletContext() {
        return getServletConfig().getServletContext();
    }

getInitParameter() metodu ile context init parametrelerine ulasabiliriz. Burada metodumuza arguman olarak “email” ve “address” String literallerini verdik. Ilgili context init paremetlerine ulasabilmek icin birebir eslemesi gerekmektedir aksi takdirde null deger donecektir.

ServletConfig uzerinden de getServletContext() metodunu cagirarak ServletContext ‘e ulasabiliyoruz.

config.getServletContext().getInitParameter("address");

Bir onceki ornegimizde yaptigimiz gibi yine ServletConfig uzerinden servletimiz icin tanimladigimiz init parametrelerine ulastik.

context init parametrelerinin <servlet> etiketleri disinda olduguna dikkat edelim. Servletin kendi init parametreleri ise <servlet> etiketi icerisinde olmalidir.

HelloServletContext sinifimizi calistirdigimizda ;

running servlet context

Eclipste’te Console da ise servlet init parametre isimleri ve context init paremetreleri yazdirdir;

Servlet Init Parameteres Names
name
surname
Context Init Parameters Names
address
email

Servlet init parametleri ile context init parametlerini birbirine karistirmayalim. Bu parametrelere ulasmak icin ayni metot ismini kullandigimiza dikkat edelim.

getInitParameter();

Context init parametrelerinin <context-param> etiketini servlet init parametrelerinin ise <init-param> etiketini kullandigina dikkat edelim.

Yine context init parametreleri servlet taniminin disinda olurken ve boylece tum uygulama tarafindan ulasilabilirkern, servlet init parametreleri servlet taniminin icerisinde olmaktadir ve sadece bu servlet tarafindan erisilebilir.

Su uc sekilde de ServletContext objesi ile context init parametrelerine ulasabiliriz.

getServletConfig().getServletContext().getInitParameter();
this.getServletContext().getInitParameter();
getServletContext().getInitParameter().getInitParameter();

Resources

ServletContext arabirimi projemizdeki dosyalara direkt erisim saglayacak 2 metot tanimlar. Bu dosyalar txt , properties , pdf gibi formatlarda olabilir.

   public URL getResource(String path) throws MalformedURLException;
   public InputStream getResourceAsStream(String path);

getResourceAsStream metodu icin ornek bir uygulama yapalim ;

web.xml

 <servlet>
     <servlet-name>ResourceServletContext</servlet-name>
     <servlet-class>_04_ServletContext.ResourceServletContext</servlet-class>
 </servlet>

 <servlet-mapping>
     <servlet-name>ResourceServletContext</servlet-name>
     <url-pattern>/resourceservletcontext</url-pattern>
 </servlet-mapping>

ResourceServletContext.java

package _04_ServletContext;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ResourceServletContext extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		ServletContext context = getServletContext();

		// InputStream is =
		// context.getResourceAsStream("/properties/myproperties.properties");
		InputStream inputStream = context.getResourceAsStream("/WEB-INF/myproperties.properties");

		Properties props = new Properties();
		props.load(inputStream);

		System.out.println(props.get("name"));
		System.out.println(props.get("surname"));

		InputStream inputStream2 = context.getResourceAsStream("/test.txt");
		int content;
		ServletOutputStream os = resp.getOutputStream();
		while ((content = inputStream2.read()) != -1) {
			System.out.print((char) content);
			os.write(content);
			// //write metodu ile browser'a veri yazabiliriz.
		}

		System.out.println();

		URL url = context.getResource("/test.txt");
		InputStream inputStream3 = url.openStream();

		int content2;
		while ((content2 = inputStream3.read()) != -1) {
			System.out.print((char) content2);
		}
	}
}

getResourceAsStream metodu baslangic olarak WebContent dizinini baz alir. myproperties.properties sosyasiWebContent/properties dizini altinda yer almaktadir. Ayni dosya WEB-INF altinda yer alirsa /WEB-INF/myproperties.properties seklinde ulasabiliriz.
test.txt dosyamiz direkt olarak WebContent klasoru altinda dolayisiyla /test.txt seklinde ulasabiliriz.

getResourceAsStream() metodu ;
virtual path bilgisini verdigimiz dosyayi InputStream objesi seklinde dondurecektir.
test.txt dosyamiz icerisinde www.injavawetrust.com yazmaktadir. Bu icerigi tarayicimizda write metodu ile yazacagiz.

getResource metodu geri java.net.URL objesi dondurmektedir. Bu sinifta yer alan openStream metodu yardimi ile dosya icerigini okuyabiliriz.

myproperties.properties

name=levent
surname=erguder

getOutputStream() metodu getWriter() metoduna benzer. Bu metot binary datayi okumak/yazmak icin uygundur.
getWriter() ve getOutputStream() metotlari ayni anda ayni servlette kullanilamazlar aksi durumda calisma zamaninda hata ile karsilasiriz.

More ServletContext Methods

ServletContext in sahip oldugu bir kac metodu daha inceleyelim ve bu bolumu bitirelim. Ilerleyen bolumlerde tekrar farkli metotlarini inceleme sansimiz olacak.

Olusturdugumuz yeni sinifin adi MoreServletContext

	<servlet>
		<servlet-name>MoreServletContext</servlet-name>
		<servlet-class>_04_ServletContext.MoreServletContext</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>MoreServletContext</servlet-name>
		<url-pattern>/moreservletcontext</url-pattern>
	</servlet-mapping>


MoreServletContext.java

package _04_ServletContext;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MoreServletContext extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		ServletContext context = getServletContext();

		System.out.println(context.getRealPath("/test.txt"));
		System.out.println(context.getContextPath());
		System.out.println(context.getServletContextName());
	}
}


getRealPath()
metodu ;
verilen virtual pathe karsilik bize real path bilgisini donecektir.
/test.txt , /helloservletcontext bilgilerine karsilik real path bilgisini elde ederiz.

getContextPath() metodu;
Projemizin context path bilgisini bize dondurecektir.

getServletContextName() metodu;
Projemizin context adini bize dondurecektir.

MoreServletContext sinifimizi calistirdigimizda ;

Eclipste Console’da

/home/levent/Java/Tomcat/apache-tomcat-7.0.52/webapps/injavawetrust/test.txt
/injavawetrust
injavawetrust

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *