05.Servlet

 Servlet

 

How servlet works

Client sends the request to the server to get html page it can be a dynamic page or static page. Dynamic page කියන්නේ ඒවා run time එකේදී තමා අවශ්‍ය data process කරලා page එකට bind කරලා හදන්නේ.ඒත් static page එකක් කියන්නේ, කලින්ම හදල තියෙන page එකක්.  එකේ වෙනස්කම් වෙන්නේ නෑ.ඉතින් මෙහෙම එකක් ඉල්ලුවොත් කෙලින්ම ඒ  page එක  server එකට පුළුවන්  client ට යවන්න..ඒත් client ඉල්ලන  page එක static එකක් නෙවෙයිනම් server එකට ඒ request එක යවනවා , web container එක ඒ ඉල්ලන dynamic page එකට හදන්න පුලුවන්නම් එක හදලා response එක විදිහට දෙනවා.හදන්න පුළුවන් කියන එකෙන් කියන්නේ එවන request එකට ගැලපෙන්න  developer ලියල තියනවනම් මෙහෙම request එකකට මේ වගේ page එකක් හදන්න ඕනේ කියන එක.එහෙම ලියල නැත්තම් 404-page not found වගේ error එකක් තමා server එක දෙන්නේ.web container එකක් කියන්නේ එක්කෝ tomcat, weblogic, glassfish, websphere, jbos වගේ එකක්.ඒ කියන  web container එක ඇතුලෙදි වෙන්නේ මෙහෙම එකක් , එකේදී developer ලියනවා මෙහෙම request එකක් අවොත් මොන servlet (java  class එකක් ) එකට call වෙන්න ඕනේ කියලා.එකට කියනවා  deployment descriptor එක කියලා(web.xml) .මේක XML file එකක් .මේකේ servlet class එක මොකද්ද සහ එක identify කරගන්න පාවිච්චි වන නම සහ මොන url එක අවොත්ද එකට map වෙන්නේ කියන විස්තර ටික තමා  ලියන්නේ .Servlet එකක් කියන්නේ normal java class එකක්ම තමා..එට් විශේෂත්වය වෙන්නේ , එක http class එක extend කරගෙන තම හදන්නේ.ඒ http class එකේ තමා ඔය request handle කරන්න ඕනේ ඒවා තියෙන්න.ඒ කියනේ request එක identify කරගන්න ඒ request එක process කිරීම , e request එකට අදාලව බලාපොරොත්තු වන  response එක යැවීම වගේ ඒවා තමා.ඒ යවන response  එක විවිද විදිහට යවන්න පුළුවන් .එක්කෝ  HTML page or HTML div එකක් විදිහට , නැත්තම් XML format එකෙන් , එහෙමත් නැත්තම් JSON  කියන format එකෙන්.එත්  page එකක් ඉල්ලපු වේලාවකදී ඒ  page එක html page එක response object එකක් කියන format එකෙන්  server එකෙන් client machine එකට යවනවා. ඒක client machine එකේ browser එකෙන් display කරගන්නවා .

ඉතාකොට මේ ටික කෙටියෙන් කිවුවොත්  client එවනවා request එකක්  මේ page එක ඕනි කියලා.ඉතින් server එක බලනවා මේක  static page එකක්ද කියලා.ඔව් නම් එක server එක client වෙත යවනවා .නැත්තන් එය static එකක්නම් එක  යවනවා web container එකට. එකේ තියනවා deployment descriptor කියන එක. එකෙන් අදාළ servlet එකට map කරගන්නවා.ඊට පස්සේ එකේදී response එක generate කරලා server එක client ට යවනවා .එත් මේකෙදි deployment descriptor එක XML format එකෙන් තමා තියෙන්නේ .නමුත් java වගේ language එකක් XML වගේ language එකක් සමග බාවිතා කරද්දී කරදර නිසා  servlet 3.0 වලින් පස්සේ annotation based configurations හදුන්වලා දුන්නා.ඉතින් XML එක වෙනුවට annotation පාවිච්චි කරලා දැන්  mapping part එක කරන්නත් පුළුවන්.

<servlet-name>TestServlet</servlet-name>
<servlet-class>com.lhu.one.TestServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>


@WebServlet(name = "TestServlet", urlPatterns = {"/TestServlet"})
public class TestServlet extends HttpServlet {}

@WebServlet(name = "TestServlet", urlPatterns = {"/TestServlet"})
public class TestServlet extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
out.println("<html><head><title></title></head>");
out.println("<body> <h1>Hello World</h1> </body>");
out.println("</html>");
}
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response){
processRequest(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response){
processRequest(request, response);
}

}


In the spring all requests are redirect to DispatcherServlet. That configuration is done in web.xml. Spring is collection of controllers but one controller can handle multiple URLs. Within the dispatcher servlet we have to configure which controller should have been called for which URLs.

web.xml

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>


Servlet

Web page ගැන බලද්දී…web server එකෙන් web page එකක් ඉල්ලනවා..එක තියවන්ම් client  ට දෙනවා නැත්තන් error message  එකක්  web server එකෙන් client  return කරනවා…but web server එක වැඩ කරන්නේ html එක්ක. ඒවගේ logic ලියන්න බෑ.එහෙනම් logic ලියන්න පුළුවන් language එකක් පාවිච්චි කරන්න වෙනවා dynamic web pages හදන්න නම්(number දෙකක් add කරනවා , data base එකක් එක්ක වැඩ කරනවා  වගේ ඒවාට) .එකට  අපිට server side language එකක් හා  ක්‍රමයක් පාවිච්චි කරනන් වෙනවා….එක නිසා තමයි  servlet ඕනේ වෙන්නේ . Servlet යනු client එවන request එකක් අරන්ගෙන එක process කරලා (dynamic data generate කරලා web page එකට bind කරනවා) response දෙන්න පුළුවන් java class එකකි.


අපි request කරනවා server එකෙන් මොකක් හරි resource එකක් ඕනේ කියලා.ඒක  image එකක් text එකක් html page/div  එකක් හෝ වෙනත් data  set  එකක් වෙන්නත් පුලුවන්.JSON ,XML වැනි format එකකින්  server එකෙන් response එවන්නවා.server එකට request  කරද්දී යොදාගන්න URL එකත් එක්ක parameter එහෙම pass කරගන්න පුළුවන් .Response එක resource එකක් වගේම status code එකක්ද වෙන්න පුළුවන්.

URL- Uniform Resource Locater

200-request is accepted and it is getting ready.

404-we are accessing a page which is not available.






Client ගෙන් එන request එක web server එකට තමා යන්නේ.page එක dynamic එකක් නම් request එක web container ට යවනවා.එක JVM එකක්.ඊට පස්සේ අදාළ servlet එකට යවලා page එක generate කරනවා .එහිදී ගොඩාක් request එකම servlet එකකට අවොත් එක ප්‍රශ්නයක් වෙනවා.ඒ නිසා ඒවා handle කරන්න සිදුවෙනවා server එකට. ඒකට web container එක, එක  එක request එකකට වෙන වෙනම threat හදලා multiple thread run කරවනව  හැම request එකක්ම parallel run වෙන විදිහට..මෙහිදී servlet එක execute වෙන්න ඕනේ නම් servlet හි service method එකට call කල යුතු අතර පසුව එය doGet or DoPost method වලට call කරලා තමා execute වෙන්නේ.ඊට පස්සේ එන response එක  web server හරහා client ට යවනවා

Web container ගෙන් සුදුවන කාර්යන් කීපයක් පහතින් දැක්වේ…….

01.   Communication support

Multiple thread වලට එකෙනේකා අතර communicate කිරීමේ හැකියාව ලබාදෙනවා.

02.   Life cycle Management

Servlet එකක් හදන්න ඕනෙනම් init method එකට ගිහිල්ලා service method එක හරහා distry method එකෙන් ඒක ඉවර කරනවා.. Creating and distry the servlet.

03.   Multi-threading support

04.   Security

Servlet largely use කරනවා ඒවගේ තියන  security feature නිසා එක provide කරන්නෙත් web container තමයි.

05.   JSP support








අපි get method හරහා data යවන විට servlet එක ඒ  data URL එකෙන් ගන්නවා නමුත් post එකේදී URL  එකත් එක්ක ඒ  data යවන්නේ නැ.අපි data send කරන විට එක කොහේ හරි local storage එකක තියාගන්නවා..එකෙන් තමා post method එකේදී data ගන්නේ ඒවා තමා cookies කියන්නේ .Get එකේදී කෙලින්ම  data URL එකෙන් ගන්න හින්ද speed වන නමුත් security නෑ..එත් post එකේ secure උනාට cookies වලින් data ගන්න one නිසා get එකට වඩා slow වෙනවා.

Get request එකකට response කරන්න doGet() method එකක්ද Post request එකකට response කරන්න doPost() method එකක්ද තියනවා servlet එකක නමුත් user ට ඕන method එකක් පාවිච්චි කරන්න නිදහස දෙන්නනම් අපිට ඒ  method දෙකම override කරන්න වෙනවා ..සහ කරන්නේ එකම වැඩේනම්  එකම code එකේ ඒ  method දෙකම repeat වෙනවා ..එකට තමා processRequest() කියලා වෙනම method එකක් හදලා එම method එකේ  code …. අර method 2 ඇතුළේදී මේක call කරන්නේ .

Servlet එක refresh වෙද්දී ඒ ගාන count වන code එක..

public class One extends HttpServlet {
int i;
public void init(){
i=0;
}
protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println(i);
i++;
}
}

අපි servlet එකකට call කරන්නේ අපිට මොකක් හරි  service එකක් one උනාම.

මෙහිදී අපි ඉල්ලන දේ ඒ servlet එකට විතරක් කරලා දෙන්න පුළුවන් නම් එයා ඒ වැඩේ කරලා අපිට  response එක දෙනවා

අනෙත් එක තමා  එය දන්නේ  නෑ ඒ  වැඩේ කරන්න ඒත් වෙන  servlet එකකට කතා කරලා wade කරනවා. ඒක එයා කළා වගේ client ට දෙනවා.Client හිටන්නේ පලවෙනි servlet එකම  තමා ඒ වැඩේ කලේ කියලා.

අනෙත් එක තමා  servlet එක දන්නේ නෑ වැඩේ කරන්න හැබැයි දන්නවනම් ඒ වැඩේ කරවගන්න පුළුවන් වෙනත් servlet එකක්, එයා එක client ට  response එකක් විදිහට දෙනවා ඒ  servlet එකට යන්න කියලා ..ඉතාකොට  client ඒ දෙවැනි servlet එකට ගිහින් වැඩේ කරවගන්නවා.

Calling another servlet from a servlet.

RequestDispatcher rd = request.getRequestDispatcher("Two");
rd.forward(request, response)

මේකෙදි එකම request object එක දෙවැනි servlet එකට pass වෙන නිසා client එවන data අනෙත් servlet එකේදී පාවිච්චි කරන්න පුළුවන්. එම නිසා ප්‍රශ්නයක් වෙන්නේ නෑ.

response.sendRedirect("Two?t1="+st); 

මේ වෙලවෙදී පලවෙනි sevlet එක ඒ  request object එක ගත්තද, නැවත client ට  කියනවා එය කියන servlet එකට යන්න කියලා.ඉතාකොට client අයෙමත් අලුත් request එකක් හදලා තමා දෙවැනි  එකට request එකක් යවන්නේ මේ අවස්ථවෙදී client ගේ කලින් data නෑ ඒ නිසා ඒ  data තියාගන්න different data scope එකක් පාවිච්චි කරන්න වෙනවා…(request, session, cookie). 

Request එකකින් request එකකට data තියාගන්න session, cookie බාවිතා කරනවා.

තව url එකත් එක්ක set කරලත් data යවන්නත්  පුළුවන්.උඩ example එක වගේ.(cookie-bus ticket example එක .

<form action="One" method="get">
Enter your 1st Number : <input type="text" name="n1"><br>
Enter your 2nd Number : <input type="text" name="n2"><br>
Enter your Name : <input type="text" name="name"><br>
<input type="submit" value="login">
</form>

///////////////////////////////////////////////////////////////////////////////////////////////////////

@WebServlet(name = "One", urlPatterns = {"/One"})
public class One extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();

/* RequestDispatcher rd = request.getRequestDispatcher("Two");
rd.forward(request, response);
System.out.println("com.lhu.sevlet.One.doGet()");*/

String st = (String) request.getParameter("name");
HttpSession session = request.getSession();
session.setAttribute("Name_1", st);
session.setAttribute("Name_1", "st");
out.print("Name is : "+st);
Cookie cookie = new Cookie("c1", st);
//Cookie cookie = new Cookie("c1", "st");
response.addCookie(cookie);
response.sendRedirect("Two?t1="+st);
}
}

///////////////////////////////////////////////////////////////////////////////////////////////////////

@WebServlet(name = "Two", urlPatterns = {"/Two"})
public class Two extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

PrintWriter out = response.getWriter();
out.print("inside second Servlet");
System.out.println("com.lhu.sevlet.Two.doGet()");

HttpSession session = request.getSession();
String st = (String) session.getAttribute("Name_1");
out.println("inside second Servlet : " + st);
//cookie begin
Cookie cookies[] = request.getCookies();
for (Cookie c : cookies) {
out.println(c.getValue());
if (c.getName().equals("c1")) {
st = c.getValue();
}
}
out.println("Cookie : " + st);
//cookie end

//Url ReWriting ?Problem-data sucure wene na url elat ekka yawanna one nisa/ get method ekat ekka witharai wadal?
String str = (String) session.getAttribute("t1");
out.println("Url ReWriting : " + st);

}
}

///////////////////////////////////////////////////////////////////////////////////////////////////////

Servlet Configure – ServletContext and ServletConfig

<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>

<init-param>
<param-name>n1</param-name>
<param-value>Value</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
<context-param>
<param-name>n1</param-name>
<param-value>Value</param-value>
</context-param>


Within class

ServletContext ctx = getServletContext();
String str = ctx.getInitParameter("n1");

ServletConfig ctx = getServletConfig();
String str = ctx.getInitParameter("n1");


ServletContext object එකක්,ඒක හැම servlet එකකටම share වෙනවා..Different configuration for different servlet නම් තමා ServletConfig object ඕනේ වෙන්නේ.






x

Comments

Popular posts from this blog

02. Spring – Creating spring project clone it with GIT step by step.

02.What is MicroService?

06.Mongo DB - Query part 2 (Aggregation)