You are on page 1of 10

9/10/2011

Ni dung

B mn Cng ngh Phn mm


Vin CNTT & TT
Trng i hc Bch Khoa H Ni

LP TRNH WEB HNG JAVA


Bi 10: Servlet nng cao

1. K thut Include, Forward, Redirect


2. Servlet filter
3. X l s kin trong vng i Servlet
4. iu khin tng tranh
5. Invoker Servlet

Ging vin: ThS. Trnh Tun t


B mn CNPM
Email: trinhtuandat.bk@gmail.com/dattt@soict.hut.edu.vn
DatTT-DSE-SOICT-HUST
1

DatTT-DSE-SOICT-HUST

1. K thut Include, Forward,


Redirect

DatTT-DSE-SOICT-HUST

1.1. K thut nh km
(include)

DatTT-DSE-SOICT-HUST

Khi no cn nh km 1 ti nguyn Web?

Static resource

V d: thm banner, copyright information vo


trong response tr v t mt Web component
(JSP/servlet)

n thun thm ni dung tnh vo response ca


servlet ang xt (servlet mun nh km)

Dynamic web component (Servlet hoc JSP)

DatTT-DSE-SOICT-HUST

Cc loi Web Resource c nh km

i khi s rt hu ch nu c th chn cc
ni dung tnh/ng to trong web
resource khc:

Gi request ti Web component C NH


KM
Thc thi Web component C NH KM
nh km kt qu thc thi c vo response
ca servlet ang xt
DatTT-DSE-SOICT-HUST

9/10/2011

Web Resource c nh km c th v
khng th lm g?

Lm th no Include Web resource?

Web resource c nh km c th truy cp


ti i tng request, nhng b hn ch vi
i tng response

c th vit vo phn body ca response v


commit mt response
khng th thit lp cc headers hoc gi bt k
phng thc no (v d, setCookie) nh hng
n cc headers ca response

Ly i tng RequestDispatcher t i
tng ServletContext

Sau , gi phng thc include() ca i


tng RequestDispatcher vi tham s l i
tng request v response:

DatTT-DSE-SOICT-HUST

RequestDispatcher dispatcher =
getServletContext().getRequestDispatcher("
/banner");

dispatcher.include(request, response);

DatTT-DSE-SOICT-HUST

V d: BannerServlet - Web component


c nh km

V d: nh km BannerServlet

public class BannerServlet extends HttpServlet {


public void doGet (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

RequestDispatcher dispatcher =
getServletContext().getRequestDispatcher("/banner");

PrintWriter out = response.getWriter();


out.println("<body bgcolor=\"#ffffff\">" +
"<center>" + "<hr> <br> &nbsp;" + "<h1>" +
"<font size=\"+3\" color=\"#CC0066\">Duke's </font>" +
<img src=\"" + request.getContextPath() +
"/duke.books.gif\">" +
"<font size=\"+3\" color=\"black\">Bookstore</font>" +
"</h1>" + "</center>" + "<br> &nbsp; <hr> <br> ");
}
public void doPost (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

if (dispatcher != null)
dispatcher.include(request, response);
}

PrintWriter out = response.getWriter();


out.println("<body bgcolor=\"#ffffff\">" +
"<center>" + "<hr> <br> &nbsp;" + "<h1>" +
"<font size=\"+3\" color=\"#CC0066\">Duke's </font>" +
<img src=\"" + request.getContextPath() +
"/duke.books.gif\">" +
"<font size=\"+3\" color=\"black\">Bookstore</font>" +
"</h1>" + "</center>" + "<br> &nbsp; <hr> <br> ");
DatTT-DSE-SOICT-HUST
}
}

DatTT-DSE-SOICT-HUST

10

Khi no cn s dng k thut


Forwarding ti Web resource khc?

1.2. K thut forward

Khi mun c mt Web component thc hin


x l s b 1 request v mt component
khc m nhim sinh response

DatTT-DSE-SOICT-HUST

11

V d: x l 1 phn request ri chuyn cho


component khc, ty tng request

DatTT-DSE-SOICT-HUST

12

9/10/2011

Quy nh khi s dng k thut


Forwarding

Cch thc Forwarding ti mt Web


resource khc?

Nn s dng khi yu cu 1 resource khc


phn hi li cho 1 user

Ly ra i tng RequestDispatcher t i tng


HttpServletRequest

Nu truy cp vo i tng
ServletOutputStream hoc PrintWriter trong
servlet, s khng forward c na, nu khng
c c ngoi l IllegalStateException

Nu cn gi li URL gc x l thm, c th lu
li thnh 1 thuc tnh tm vc request
Gi phng thc forward() ca i tng
RequestDispatcher

DatTT-DSE-SOICT-HUST

13

RequestDispatcher dispatcher =
request.getRequestDispatcher("/template.js
p");

dispatcher.forward(request, response);
DatTT-DSE-SOICT-HUST

14

V d: Dispatcher Servlet
public class Dispatcher extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response) {
request.setAttribute("selectedScreen",
request.getServletPath());
RequestDispatcher dispatcher = request.
getRequestDispatcher("/template.jsp");
if (dispatcher != null)
dispatcher.forward(request, response);
}
public void doPost(HttpServletRequest request,
...
}
DatTT-DSE-SOICT-HUST

1.3. Ch nh trnh duyt redirect


ti Web Resource khc

15

DatTT-DSE-SOICT-HUST

16

Redirect mt Request

2 k thut iu hng request


Cch 1:

2. Servlet Filters

res.setStatus(res.SC_MOVED_PERMANTLY);
res.setHeader("Location", "http://...");

Cch 2:

public void sendRedirect(String url)

DatTT-DSE-SOICT-HUST

17

DatTT-DSE-SOICT-HUST

18

9/10/2011

2. Servlet Filters

2.1. Servlet filters l g v ti sao cn?


2.2. Cc Servlet Filters mc ni vi nhau nh
th no?
2.3. APIs lp trnh cho Servlet Filter
2.4. Cu hnh Servlet filter trong file web.xml
2.5. Cc bc xy dng v trin khai cc
servlet filters
2.6. V d
DatTT-DSE-SOICT-HUST

2.1. Servlet filters l g v ti


sao cn?

19

DatTT-DSE-SOICT-HUST

Java Servlet Filters l g?

Filters c th lin kt vi nhau thnh 1 chui v tch hp


vo h thng khi trin khai (deploy)

m, chn cc truy cp (access)


Caching, compression, logging
Authentication, access control, encryption
Content transformations

c gii thiu trong Servlet 2.3 (Tomcat 4.0)


DatTT-DSE-SOICT-HUST

Cho php cu hnh:

Mt Filter c th lm g?

L thnh phn chn v sa (intercept & modify)


cc requests v responses

Kim tra (Examine) cc request headers


iu chnh li i tng request: sa phn d liu
hoc request headers
iu chnh li i tng responseL sa phn d
liu hoc response headers
Gi n filter k tip trong chui
Kim tra (Examine) li cc response headers sau
khi gi filter k tip trong chui
Tung ra ngoi l thng bo c li trong qu trnh
x l

21

DatTT-DSE-SOICT-HUST

V d 1:

22

V d 2

ang c nhiu servlets v cc trang JSP pages cn


thc hin chung cc chc nng nh ghi log hoc
chuyn thnh nh dng XSLT ( biu din d
liu)

20

Khng mun thay i tt c cc servlets & cc trang JSP


ny
Mun xy dng cc chc nng chung nh 1 module, ti
s dng c

Mun tch bit iu khin truy cp (access


control) khi phn code hin thpresentation (JSP pages)

LTV khng mun thay i tng trang JSP

Gii php

To mt access-control servlet

Gii php:

To 1 logging filter v compression filter


Gn vo h thng khi trin khai
DatTT-DSE-SOICT-HUST

23

DatTT-DSE-SOICT-HUST

24

9/10/2011

V d 3

C rt nhiu cc Web resources m ch thay


i 1 s t cc gi tr (V d banners hoc tn
cng ty)

2.2. Cc Servlet Filters mc


ni vi nhau nh th no?

LTV khng mun thay i cc Web resources ny


mi ln tn cng ty thay i

Gii php

To banner replacement filter hoc company


name replacement filter

DatTT-DSE-SOICT-HUST

25

DatTT-DSE-SOICT-HUST

Servlet Filter lm vic nh th no?


Servlet
Container

Filter Chain lm vic nh th no?

Servlet

Filter Chain

Cc filters c th mc ni vi nhau

Filter
2

Filter N

User
implemented
filters

Servlet
container
filter

doFilter(
ServletRequest,
ServletResponse,
DatTT-DSE-SOICT-HUST
FilterChain)

Th t mc ni: chnh l th t cc phn t <filter>


trong file web.xml

Filter u tin trong chui s c container gi

Filter 1

26

Qua phng thc doFilter(ServletRequest req,


ServletResponse res, FilterChain chain)
Filter sau khi thc hin cng vic xong, s gi filter tip
theo trong chui: gi phng thc chain.doFilter(..)

Filter cui cng gi phng thc service() ca


Servlet

service(
ServletRequest,
ServletResponse)27

DatTT-DSE-SOICT-HUST

28

Giao din javax.servlet.Filter

2.3. APIs lp trnh cho Servlet


Filter

init(FilterConfig)

destroy()

DatTT-DSE-SOICT-HUST

29

c gi 1 ln duy nht khi filter dc khi to ln u


Ly ra i tng ServletContext t i tng FilterConfig
v lu vo u (Vd lm 1 thuc tnh ca Filter)
phng thc doFilter() c th truy cp.
c cc tham s khi to t i tng FilterConfig qua
phng thc getInitParameter()
c gi duy nht 1 ln khi container hy i tng filter
VD: ng file hoc ng kt ni Database
DatTT-DSE-SOICT-HUST

30

9/10/2011

Giao din javax.servlet.Filter

Mt s lp khc lin quan ti Sevlet Filter

doFilter(ServletRequest req, ServletResponse res,


FilterChain chain)

javax.servlet.FilterChain

c gi mi khi filter c kch hot


Cha cc x l ca filter
i tng ServletRequest c p kiu v
HttpServletRequest nu request l HTTP request
Gi filter tip theo: chain.doFilter(..)
Hoc chn request li. Cch thc:

javax.servlet.FilterConfig

khng gi phng thc chain.doFilter(..)


Filter phi cung cp output cho client

c truyn lm tham s trong phng thc


init()

javax.servlet.HttpServletResponseWrapper

set headers on the response for next entity


DatTT-DSE-SOICT-HUST

c truyn lm tham s cho phng thc


doFilter()

L ci t tin ch cho giao din


HttpServletResponse interface

31

DatTT-DSE-SOICT-HUST

32

Cu hnh trong web.xml

2.4. Cu hnh Servlet Filter


trong file web.xml file

<filter>

</filter>
<filter-mapping>

DatTT-DSE-SOICT-HUST

33

<filter-name>: tn ca filter
<filter-class>: gip container bit c lp x l tng
ng ca filter

<filter-name>: tn ca filter l g
<url-pattern>: mu URLs (Web resources) p dng cho
filter c tn trn

</filter-mapping>
DatTT-DSE-SOICT-HUST

34

V d: web.xml ca BookStore
<web-app>
<display-name>Bookstore1</display-name>
<description>no description</description>
<filter>
<filter-name>OrderFilter</filter-name>
<filter-class>filters.OrderFilter</filter-class>
</filter>
<filter>
<filter-name>HitCounterFilter</filter-name>
<filter-class>filters.HitCounterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OrderFilter</filter-name>
<url-pattern>/receipt</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>HitCounterFilter</filter-name>
<url-pattern>/enter</url-pattern>
</filter-mapping>
<listener>
...
</listener>
<servlet>
...
DatTT-DSE-SOICT-HUST
</servlet>

2.5. Cc bc xy dng v
trin khai cc Servlet Filters

35

DatTT-DSE-SOICT-HUST

36

9/10/2011

Cc bc xy dng Servlet Filter

To mt lp thc thi giao din Filter

Thc thi cc x l trong phng thc doFilter()


Gi phng thc doFilter() ca i tng
FilterChain

2.6. V d Servlet Filter

Cu hnh filter cho Servlet v cc trang JSP


cn p dng

S dng <filter> v <filter-mapping>

DatTT-DSE-SOICT-HUST

37

DatTT-DSE-SOICT-HUST

V d: HitCounterFilter

38

V d: HitCounterFilter

public final class HitCounterFilter implements Filter {


private FilterConfig filterConfig = null;

public void doFilter(ServletRequest request,


ServletResponse response, FilterChain chain)
throws IOException, ServletException {

public void init(FilterConfig filterConfig)


throws ServletException {
this.filterConfig = filterConfig;
}
public void destroy() {
this.filterConfig = null;
}

if (filterConfig == null) return;


StringWriter sw = new StringWriter();
PrintWriter writer = new PrintWriter(sw);
Counter counter = (Counter)
filterConfig.getServletContext().getAttribute("hitCounter");
writer.println("The number of hits is: " +
counter.incCounter());
// Log the resulting string
writer.flush();
filterConfig.getServletContext().log(sw.getBuffer().toString());
...
chain.doFilter(request, wrapper);
...

// Continued in the next page...


}
}

DatTT-DSE-SOICT-HUST

39

DatTT-DSE-SOICT-HUST

40

Cu hnh HitCounterFilter
<?xml version="1.0" encoding="ISO-8859-1"?>

3. X l s kin trong vng


i Servlet

<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web


Application 2.3//EN' 'http://java.sun.com/dtd/webapp_2_3.dtd'>
<web-app>
<display-name>Bookstore1</display-name>
<description>no description</description>
<filter>
<filter-name>HitCounterFilter</filter-name>
<filter-class>filters.HitCounterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HitCounterFilter</filter-name>
<url-pattern>/enter</url-pattern>
</filter-mapping>
...
DatTT-DSE-SOICT-HUST

41

DatTT-DSE-SOICT-HUST

42

9/10/2011

Cc bc thc hin khi x l s kin

3. X l s kin trong vng i Servlet

H tr x l s kin khi c thay i trng thi


trong

ServletContext

Startup/shutdown
Thay i thuc tnh (Attribute changes )

HttpSession

Creation v invalidation
Thay i thuc tnh (Changes in attributes)

DatTT-DSE-SOICT-HUST

Quyt nh phm vi ca i tng cn x l


s kin (context hay session)
Thc thi giao din ph hp
Override cc phng thc cn x l s kin
Cu hnh file web.xml
Cung cp thm cc tham s khi to nu cn

43

DatTT-DSE-SOICT-HUST

ng k Listener

Cc giao din Listener

Web container

ServletContextListener

ServletContextAttributeListener

HttpSessionListener

HttpSessionAttributeListener

HttpSessionActivationListener

To 1 thc th cho mi lp Listener


ng k tc th s x l s kin g, ty theo:

Giao din (interfaces) m n thc thi


Th t ng k trong file web.xml
(Cc Listeners s c gi theo ng th t ng k)

DatTT-DSE-SOICT-HUST

44

45

contextInitialized/Destroyed(ServletContextEvent)
attributeAdded/Removed/Replaced(ServletContextAttributeEvent)
sessionCreated/Destroyed(HttpSessionEvent)
attributedAdded/Removed/Replaced(HttpSessionBindingEvent)
X l sessions di tr (migrate) t server ny sang server khc
sessionWillPassivate(HttpSessionEvent)
sessionDidActivate(HttpSessionEvent)
DatTT-DSE-SOICT-HUST

V d: Context Listener

46

V d: Context Listener

public final class ContextListener


implements ServletContextListener {
private ServletContext context = null;
public void contextDestroyed(ServletContextEvent event) {
context = event.getServletContext();
BookDB bookDB = BookDB)context.getAttribute("bookDB");
bookDB.remove();
context.removeAttribute("bookDB");
context.removeAttribute("hitCounter");
context.removeAttribute("orderCounter");
}

public void contextInitialized(ServletContextEvent event) {


context = event.getServletContext();
try {
BookDB bookDB = new BookDB();
context.setAttribute("bookDB", bookDB);
} catch (Exception ex) {
context.log("Couldn't create bookstore
database bean: " + ex.getMessage());
}

Counter counter = new Counter();


context.setAttribute("hitCounter", counter);
counter = new Counter();
context.setAttribute("orderCounter", counter);
}
DatTT-DSE-SOICT-HUST

47

DatTT-DSE-SOICT-HUST

48

9/10/2011

Cu hnh Listener
<web-app>
<display-name>Bookstore1</display-name>
<description>no description</description>

M hnh Thread v ng b
ha cc Servlet

<filter>..</filter>
<filter-mapping>..</filter-mapping>
<listener>
<listener-class>listeners.ContextListener</listener-class>
</listener>
<servlet>..</servlet>
<servlet-mapping>..</servlet-mapping>
<session-config>..</session-config>
<error-page>..</error-page>
...
</web-app>

DatTT-DSE-SOICT-HUST

49

DatTT-DSE-SOICT-HUST

Vn iu khin tng tranh trong 1


servlet

Nhiu Threads, Mt Servlet Instance

Phng thc service() ca mt thc th


servlet c th c gi bi nhiu clients
(multiple threads)
LTV lp trnh Servlet phi t gii quyt vn
tng tranh (concurrency)

Web Server
request
thread

Cn bo v d liu chung (shared data)


c gi l servlet synchronization

request

thread

request

thread

S dng synchronized block


S dng SingleThreadModel
DatTT-DSE-SOICT-HUST

request
thread

request

51

52

Giao din SingleThreadModel

Synchronized blocks c s dng m


bo ch c duy nht mt thread ti mt
thi im c th thc thi mt on code
synchronized(this) {
myNumber = counter + 1;
counter = myNumber;
}
...
synchronized(this) {
counter = counter - 1 ;
}

DatTT-DSE-SOICT-HUST

Servlet container
DatTT-DSE-SOICT-HUST

S dng synchronized block

Servlet

thread

2 la chn ng b ha servlet

50

53

Servlets cng c th thc thi


javax.servlet.SingleThreadModel
Server s qun l mt kho (pool) cc servlet
instances
m bo rng ch c MT thread truy cp
mt instance
C th dn n bng n instances
Public class SingleThreadModelServlet extends
HttpServlet implements SingleThreadModel {
...
}
DatTT-DSE-SOICT-HUST

54

9/10/2011

SingleThreadModel

Khuyn co

Web Server

Nu c th, nn s dng synchronized block

SingleThreadModel c chi ph rt cao

thread

thread

thread

thread

DatTT-DSE-SOICT-HUST

55

DatTT-DSE-SOICT-HUST

56

Invoker Servlet l g?

Invoker Servlet

Thc thi cc servlet khng nh ngha trong file


web.xml
Ch yu s dng cho mc ch debug v test
V d ng cnh s dng

DatTT-DSE-SOICT-HUST

DatTT-DSE-SOICT-HUST

57

Lm th no s dng Invoker Servlet?

B ccomment cho on cu hnh sau t file


<Tomcat>/conf/web.xml v khi ng li
Tomcat

<!-<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
DatTT-DSE-SOICT-HUST
-->

C 1 lng ln servlets (vd: 1000 servlets)


LTV khng mun thc hin servlet mapping cho tt c
1000 servlets trong file web.xml, c bit l mi ang
pht trin ng dng (cha trin khai)
Nu s dng invoker servlet (cung cp bi container),
user vn truy cp 1000 servlets bnh thng, khng cn
thc hin servlet mapping trong file web.xml.
58

Lm th no s dng Invoker Servlet?

Thm on cu hnh sau vo file web.xml


<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/myservlets/*</url-pattern>
</servlet-mapping>

T trnh duyt, truy cp ti cc servlet nh


sau:

59

http://localhost:8080/myservlets/newservlet2

DatTT-DSE-SOICT-HUST

60

10

You might also like