You are on page 1of 17

VEŽBE 07 – SERVLETI, UVOD U MVC

SERVLETI

 Izvršavaju logiku na serverskoj strani

 Obrađuju zahteve i mogu da kreiraju odgovor u vidu kompletnih html stranica

 Kreiraju se u okviru dinamičkog projekta u okviru src dela

1
Prosleđivanje odgovora i redirekcija iz servleta
 Servlet može da prosledi obradu drugom servletu ili da kreirani odgovor prosledi na jsp
stranicu

// prosledjivanje svih parametara i kreiranih atributa na index.jsp

request.getRequestDispatcher("index.jsp").forward(request, response);

// redirekcija bez prosledjivanja na index.jsp

response.sendRedirect("index.jsp");

POREĐENJE SERVLETI - JSP

Pomoću servleta se mogu uraditi iste stvari kao i pomoću JSP.

JSP: prednosti

 pisanje samog HTML koda

 čitanje i održavanje HTML koda

JSP: mane

 implementacija kontrolne logike

 mešanje dizajna i kontrolne logike

Servleti: prednosti

 za kontrolnu logiku

 kompletna java podrška

 dinamički se kreira prilikom poziva, ogromna prednost na nivou sigurnosti

Servleti: mane

 kreiranje stranica na primitivan način, preko printWriter-a, ne koristi se više

2
KREIRANJE: Nakon kreiranja Servleta dobija se sledeći kod:
public class TEST extends HttpServlet {
private static final long serialVersionUID = 1L;

public TEST() {
super();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response)


throws ServletException, IOException {
// ovde se resava problematika GET metode
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)


throws ServletException, IOException {
// ovde se resava problematika POST metode

}
}
 Dve osnovne metode su doGet , doPost sa parametrima
HttpServletRequest request, HttpServletResponse response

o Request se koristi za prikupljanje prosleđenih parametara sa forme


o Response se koristi za prosleđivanje kreiranog odgovora
 Postoje još i sledeće metode:
o Init: radi inicijalizaciju i poziva se samo jednom
o Service: obrađuje više zahteva i poziva druge metode
o Destroy: poziva se samo jednom pri isključenju servleta
 Prilikom kreiranja ServletTest se mapira u web.xml fajlu i dobija se sledeći kod
<servlet>
<description></description>
<display-name>ServletTest</display-name>
<servlet-name>ServletTest</servlet-name>
<servlet-class>rs.ac.kg.tfc.ServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest</servlet-name>
<url-pattern>/ServletTest</url-pattern>
</servlet-mapping>

o NAPOMENA: nikada ne kopirati servlet iz drugog projekta jer ga neće imati u


web.xml fajlu pa ga samim tim neće ni server prepoznati

3
o 1.7 anotacija i mapiranje servleta bez web.xml fajla, iznad definicije servleta
pomoću @WebServlet("/imeServleta")

4
Link sa parametrima
U velikom broju slučajeva neophodno je pomoću nekog linka pozvati Servlet i u isto vreme
proslediti im i parametre za obradu.

PRIMER: Link ka Servletu ServletOsoba sa parametrima akcija=“ispis“ i br=“3“.

<a href="ServletOsoba?akcija=ispis&br=3">ISPIS </a>

Ovako prosleđeni parametri se u Servletu (u doGet metodi) ili na jsp stranici kupe sa:

String akcija = request.getParametar("akcija");

String br = request.getParametar("br");

Prosleđivanje parametara forme servletu

o U okviru taga <form></form> podešava se akcja na servlet (preko imena servleta)


i metod zahteva

<form action="ServletTest" method="get">

 Čitanje prosleđenih parametara u servletu

o request.getParameter(“ime")
 Dobija se String vrednost prvog elementa koji se zove ime
 Rezultat je null ako ne postoji takav parametar u elementima forme
o request.getParameterValues(“ime")
 Dobija se niz String[] vrednosti za sve elemente koji se zovu ime
 Dobija se niz sa jednim elementom, ako se ime pojavljuje samo jednom
 Rezultat je null ako ne postoji takav parametar u elementima forme
o request.getParameterNames() ili request.getParameterMap()
 Dobija se Enumeration ili Map objekti od poslatih elemenata i običajeno je
da je rezervisano za debagovanje

5
PRIMER 1. Kreirati jsp stranicu sa formom u kojoj se unosi ime i proslediti je na Servlet koji
treba da prihvati prosleđeno ime i kreira html stranicu sa pozdravnom porukom i prosleđenim
imenom.
<!-- index -->
<form action="Servlet" method="get">
<p>Ime: <input type="text" name="ime"></p>
<input type="submit" value="Posalji">
</form>

protected void doGet(HttpServletRequest request, HttpServletResponse response)


throws ServletException, IOException {

response.setContentType("text/html");
String ime = request.getParameter("ime");

PrintWriter out = response.getWriter();


String docType =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "+
"Transitional//EN\">\n";
out.println(docType +
"<HTML>\n" +
"<HEAD><TITLE>Hello</TITLE></HEAD>\n"+
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1>Hello "+ime+"</H1>\n" +
"</BODY></HTML>");
}
 Veoma je važno ispitati da li je uspešno učitan parametar pre njegovog korišćenja da
bi se izbegao NULL POINTER EXCEPTION

 servlete koristiti u kontrolnom delu aplikacije a ne za kreiranje stranica zbog


složenosti.

 koristiti SERVLET za logiku, JSP za prikaz

NAPOMENA: Kao i kod JSP svi parametri se UVEK prosleđuju kao String pa se moraju
konvertovati u željeni format u try-catch bloku ako je potrebna njihova obrada.
String br = request.getParameter("br");

try{
a=Integer.parseInt(br); // ocekuje se celobrojna vrednost
}
catch(NumberFormatException nfe){
// ovde preduzeti neophodne korake u slučaju pogrešnih parametara
nfe.printStackTrace();
}

6
ZADATAK 1: Za kreiranu formu za piceriju (sa prethodnog časa) sa svim elementima forme
proslediti zahtev servletu ServletTest koji će da pročita prosleđene parametre i da kreira stranicu
izgleda prikazanog ispod. Ista logika kao za rešenje sa jsp stanicom. Dodati i sve provere.

Rešenje:
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
String num = request.getParameter("num");
String size = request.getParameter("size");
String[] top = request.getParameterValues("top");
String name = request.getParameter("name");
String phone = request.getParameter("phone");
String adress = request.getParameter("address");
String pass = request.getParameter("pass");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println(
"<HTML>\n" +
"<HEAD><TITLE>Hello</TITLE></HEAD>\n"+
"<BODY>\n" +
"<H1>PICERIJA</H1><br>");
out.println(
"vasa porudzbina :<br>"+
"PICA : komada: "+ num+" velicina:
"+size+"<br><H3>DODACI:</H3>");
for(String pom: top)
out.println(pom+", ");
out.println("<br><H3>Podaci o poruciocu:</H3>" +
"<br>Ime:"+name+
"<br>Telefon:"+phone+
"<br>Adresa:"+adress
);
out.println("</BODY></HTML>");
}

7
ZADATAK 2: Kreirati formu za unos parametara (ime, prezime, godine, sifra, validacija) i
validirati je na servletu. Potrebno je kreirati:
 index.jsp – ima formu za unos imena, prezimena, godina jedne osobe. Takođe na dnu
strane neophodno je uneti rezultat prikazane matematičke operacije (zbir dva random
broja) radi provere napada.
 Servlet – učitava prosleđene parametre i proverava :
o da li su svi parametri uneti,
o da li je godina int
o da li je sifra „12345“
o da li je tačan rezultat matematičke operacije.

Ukoliko:
 je sve zadovoljeno pri validaciji forme prosledi atribute na osoba.jsp (view) stranicu gde
će se podaci ispisivati u formatu: Ja sam „IME PREZIME“ i imam „GODINA“.
 nije sve zadovoljeno odgovarajući atribut msg vraća na index.jsp

UVOD U MVC:
 VIEW
o index.jsp
o osoba.jsp
 CONTROLLER
o Servlet.java

8
<!-- index.jsp body deo -->
<!-- Generisanje dva jednocifrena broja -->
<%
int prvi = (int)Math.ceil(Math.random()*10);
int drugi = (int)Math.ceil(Math.random()*10);
%>

<form action="Servlet" method="post">


<table>
<tr>
<th colspan="2">VALIDACIONA FOMRA</th>
</tr>
<tr>
<td align="right">IME:</td>
<td><input type="text" name="ime"/></td>
</tr>
<tr>
<td align="right">PREZIME:</td>
<td><input type="text" name="prezime"/></td>
</tr>
<tr>
<td align="right">GODINE:</td>
<td><input type="text" name="godine"/></td>
</tr>
<tr>
<td align="right">SIFRA:</td>
<td><input type="password" name="sifra"/></td>
</tr>
<tr>
<td align="right"><%=prvi %>+<%=drugi %>=</td>
<td>
<input type="text" name="validacija"/>

<!-- sakriveno slanje generisanih brojva -->


<input type="hidden" name="zbir" value="<%=prvi+drugi %>"/>
</td>
</tr>
<tr>
<td colspan="2" align="right"><input type="submit" value="Potvrdi"/></td>
</tr>
<!-- ATRIBUT MOŽE DA SE POKUPI I PREKO JSTL SA ${msg} -->
<tr>
<td colspan="2" align="center">
<!-- Prihvatanje atributa msg -->
<%
String msg = (String)request.getAttribute("msg");
if (msg != null){
%>
<%= msg %>
<% } %>
</td>
</tr>
</table>
</form>

9
// Servlet
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

// ucitavanje parametara
String ime = request.getParameter("ime");
String prezime = request.getParameter("prezime");
String godine = request.getParameter("godine");
String sifra = request.getParameter("sifra");
String validacija = request.getParameter("validacija");
String zbir = request.getParameter("zbir");

// provera da li su svi parametri popunjeni


if(ime != null && ime.length()>0 &&
prezime != null && prezime.length()>0 &&
godine != null && godine.length()>0 &&
sifra != null && sifra.length()>0 &&
validacija != null && validacija.length()>0 &&
zbir != null && zbir.length()>0
){
// provera sifre
if(sifra.equals("12345")){
// setovanje validacije
if(validacija.equals(zbir)){
try {
int g = Integer.parseInt(godine);
// setovanje atributa
request.setAttribute("ime", ime);
request.setAttribute("prezime", prezime);
request.setAttribute("godine", godine);
// prosledjivanje na prikaz.jsp
request.getRequestDispatcher("osoba.jsp").forward(request, response);
} catch (Exception e) {
request.setAttribute("msg", "Godine moraju biti broj");
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}else{
request.setAttribute("msg", "pogresna validacija");
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}else{
request.setAttribute("msg", "Pogresna sifra");
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}else{
request.setAttribute("msg", "Morate popuniti sva polja");
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
}

10
<!-- osoba.jsp -->
<body>
<%
String ime = (String) request.getAttribute("ime");
String prezime = (String) request.getAttribute("prezime");
String godine = (String) request.getAttribute("godine");
%>
<%
if (ime != null && prezime != null && godine != null) {
%>
Ja sam <%=ime%>&nbsp<%=prezime%> i imam <%=godine%> godina !!!
<%
} else {
%>
Nema podataka o osobi za ispis !!!
<%
}
%>
</body>

// osoba.jsp preko servleta

// direktan pristup
// http://localhost:8080/validacija/osoba.jsp

REZIME TOKA PODATAKA:


Index.jsp => Servlet => osoba.jsp – validacaija OK
Index.jsp => Servlet => index.jsp – validacaija ERROR

Servlet : kontoliše podatke i redirekciju

MVC:
 VIEW
o index.jsp
o osoba.jsp
 CONTROLLER
o Servlet.java

11
ZADATAK 3: Prepraviti Zadatak 2:
 Kreirati klasu Osoba sa atributima ime, prezime, godine.
 U servletu kad se uradi validacija kreirati osobu i dodati je u listu osoba.
 Tu listu osoba poslati na listaOsoba.jsp preko atributa lo
 Kreirati straniu listaOsoba.jsp da prihvata atribut lo i da listu prikaze kao nenumerisanu
listu

UVOD U MVC:
 VIEW
o index.jsp
o listaOsoba.jsp
 CONTROLLER
o Servlet.java

12
<!-- index.jsp body deo -->
<!-- Generisanje dva jednocifrena broja -->
<%
int prvi = (int)Math.ceil(Math.random()*10);
int drugi = (int)Math.ceil(Math.random()*10);
%>

<form action="Servlet" method="post">


<table>
<tr>
<th colspan="2">VALIDACIONA FOMRA</th>
</tr>
<tr>
<td align="right">IME:</td>
<td><input type="text" name="ime"/></td>
</tr>
<tr>
<td align="right">PREZIME:</td>
<td><input type="text" name="prezime"/></td>
</tr>
<tr>
<td align="right">GODINE:</td>
<td><input type="text" name="godine"/></td>
</tr>
<tr>
<td align="right">SIFRA:</td>
<td><input type="password" name="sifra"/></td>
</tr>
<tr>
<td align="right"><%=prvi %>+<%=drugi %>=</td>
<td>
<input type="text" name="validacija"/>

<!-- sakriveno slanje generisanih brojva -->


<input type="hidden" name="zbir" value="<%=prvi+drugi %>"/>
</td>
</tr>
<tr>
<td colspan="2" align="right"><input type="submit" value="Potvrdi"/></td>
</tr>
<!-- ATRIBUT MOŽE DA SE POKUPI I PREKO JSTL SA ${msg} -->
<tr>
<td colspan="2" align="center">
<!-- Prihvatanje atributa msg -->
<%
String msg = (String)request.getAttribute("msg");
if (msg != null){
%>
<%= msg %>
<% } %>
</td>
</tr>
</table>
</form>

13
package rs;

public class Osoba {


private String ime, prezime;
private int godine;

public String getIme() {


return ime;
}
public void setIme(String ime) {
this.ime = ime;
}
public String getPrezime() {
return prezime;
}
public void setPrezime(String prezime) {
this.prezime = prezime;
}
public int getGodine() {
return godine;
}
public void setGodine(int godine) {
this.godine = godine;
}
public Osoba() {
super();
// TODO Auto-generated constructor stub
}
public Osoba(String ime, String prezime, int godine) {
super();
this.ime = ime;
this.prezime = prezime;
this.godine = godine;
}

@Override
public String toString() {
// TODO Auto-generated method stub
return ime+" "+prezime+" "+godine;
}
}

// Servlet
public class Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public Servlet() {super();}

14
// LISTA OSOBA KAO ATRIBUT SERVELTA, DA BI JOJ SE PRISTUPALO IZ METODA
private ArrayList<Osoba> lo = new ArrayList<Osoba>();

protected void doPost(HttpServletRequest request, HttpServletResponse


response) throws ServletException, IOException {
// LISTA OSOBA
String ime = request.getParameter("ime");
String prezime = request.getParameter("prezime");
String godine = request.getParameter("godine");
String sifra = request.getParameter("sifra");
String validacija = request.getParameter("validacija");
String zbir = request.getParameter("zbir");

if(ime != null && ime.length()>0 &&


prezime != null && prezime.length()>0 &&
godine != null && godine.length()>0 &&
sifra != null && sifra.length()>0 &&
validacija != null && validacija.length()>0 &&
zbir != null && zbir.length()>0
){
if(sifra.equals("12345")){
if(validacija.equals(zbir)){
try {
int g = Integer.parseInt(godine);

// TEK SAD SVE OK

Osoba o = new Osoba(ime, prezime, g);

lo.add(o);

request.setAttribute("lo", lo);
request.getRequestDispatcher("listaOsoba.jsp").forward(request, response);
} catch (Exception e) {
request.setAttribute("msg", "Godine moraju biti broj");
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}else{
request.setAttribute("msg", "pogresna validacija");
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}else{
request.setAttribute("msg", "Pogresna sifra");
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}else{
request.setAttribute("msg", "Morate popunitis sva polja");
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
}

15
<!-- listaOsoba.jsp -->

<%@page import="rs.Osoba"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<%
ArrayList<Osoba> lo = (ArrayList<Osoba>)request.getAttribute("lo");
%>
<body>
<%
if(lo!=null && lo.size()>0){
%>
<h1>LISTA OSOBA</h1>
<ul>
<% for(int i = 0; i<lo.size();i++){ %>
<li><%=lo.get(i) %></li>
<%} %>
</ul>
<%
}else{
response.sendRedirect("index.jsp");
}
%>
</body>
</html>

16
IDEJE ZE DOPUNU

INIT, LOAD ON STARTUP

PROSLEDJIVANJE DRUGOM SERVLETU

CITANJE PARAMETARA ZAHTEVA - http://www.mkyong.com/java/how-to-get-http-request-


header-in-java/

17

You might also like