J 2 EE Servlets Ch 10 Architecture Ch











































- Slides: 43
J 2 EE Servlets Ch. 10 (Architecture) Ch. 12 (21 Days)
History of Interactive Web Ø Applets l l Ø CGI l l l Ø Long download times Code on client machines (maintenance) Custom code to interact with web server Security hole Resource hog for large sites Java Servlets l l l Standard, easy interface to web server Security/authentication Implements sessions
History (cont. ) Early use of Servlets Ø l l Simple, easy to use for web applications MVC all implemented in one big servlet • • • Very complex Difficult to maintain Not scalable Current state of Servlet use Ø l l Smaller is better. Used only for: • • Gathering and validating data input from the user Coordinating output Minimal business logic Web page forwarding
Servlet Features Ø Tailored to interact with Web Server Ø Server and platform independent Ø Efficient and scalable Ø Container provides additional functionality (i. e. , authentication, cookies, etc. )
Interacting with HTML Forms Ø Get – Request information from web server l Simple http: //www. byui. edu/j 2 ee? Name=Fred+&tel=3565132 Ø Post – Send data to the server l l l Submit button, etc. Data is sent in body of message Safer than Get
HTML Forms (Cont. ) Ø Put – Place a file on the server Ø Delete – Remove a web page from server
Servlet Class Diagram
Servlet Life Cycle Class Diagram START init() State: Resident destroy() END do. Get(), do. Post, … Processing Request
Servlet Sequence Diagram Fig. 12 -15
Model 1 - Servlets only Model/View/Control submit Servlet do. Get/do. Post webpage Web. Server Generate HTML Data base
Servlets in the Enterprise submit View/Control do. Get/do. Post Model Servlet Input Control Web. Server webpage Output Performance and Flexibility Issues Data EJB Entity Bean
Example Servlet publc class Html. Page extends Http. Servlet { public void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws IOException { String name = request. get. Parameter(“name”); String telephone = request. get. Parameter(“tel”); response. set. Content. Type(“text/html”); Get value of form parameters …. Business logic …. Print. Writer out = response. get. Writer(): out. println(“<HTML>”); out. println(“<HEAD><TITLE>First Servlet</TITLE></HEAD>”); out. println(“<BODY>”); out. println(“<H 1>Hello “ + name + “, Telephone “ + telephone + “</H 1>”); out. println(“</BODY>”); out. println(“</HTML>”); } public void do. Post(Http. Servlet. Request request, Http. Servlet. Response response) throws IOException { do. Get(request, response); } } Sent output to web browser
Model 2 Architecture submit View do. Get/do. Post <<forward>> webpage Model Business Data Access Objecs Servlet input Web. Server Control JSP page output Methods <<Session. EJB>> Data <<Entity. EJB>>
Web Development Life Cycle Model 2 Architecture Servlet Get request Parameters Determine and call business function JSP Determine next view Build view
Web Development Life Cycle protected void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { String username = request. get. Parameter("username"); String password = request. get. Parameter("password"); 1. Get request parameters try { Initial. Context context = new Initial. Context(); Business. Rules. Remote business. Rules = (Business. Rules. Remote) context. lookup(Business. Rules. REMOTE_JNDI_NAME); Long person. Id = business. Rules. login(username, password); } catch (Exception e) { e. print. Stack. Trace(); } 2. Call business function Http. Session session = request. get. Session(); session. set. Attribute("personid", person. Id); Request. Dispatcher dispatcher = request. get. Request. Dispatcher("index. jsp"); dispatcher. forward(request, response); } 3. Determine next view
Web Development Life Cycle JSP page <div id="login"> <span class='highlight'>Welcome to Home Town Bank!</span> <a id='logout' href="">Logout</a> </div> 4. Build next view
How to use HTTPServlet Http. Servlet do. Get(request Http. Servlet. Request , response: Http. Servlet. Response) do. Post(request Http. Servlet. Request, response: Http. Servlet. Response) do. Put(request Http. Servlet. Request , response: Http. Servlet. Response) do. Delete(request Http. Servlet. Request , response: Http. Servlet. Response) Http. Servlet. Request Contains Request Info (Input) Http. Servlet. Response Handles Response (Output)
Request. Response Interface Forwarding a Response
Request. Response Interface Including other Web Components
Deployment of Servlets Ø All Servlet files zipped together into a web archive (“war”) file Ø Requires specific directory structure Ø Deployment Descriptor (WSDL)
Deployment Descriptor <? xml version=“ 1. 0” encoding=“UTF-8: ? > <!DOCTYPE web-app PUBLIC ‘-//Sun Microsystems, Inc. //DTD Web Application 2. 3//EN’ ‘http: //java. sun. com/dtd/web-app_2_3. dtd’> <web-app> <display-name>A Simple Application</display-name> <servlet-name>Verify Data</servlet-name> <servlet-class>Verify. Data</servlet-class> <init-param> <param-name>max. Value</param-name> <param-value>25</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Verify Data</servlet-name> <url-pattern>/verifydata</url-pattern> </servlet-mapping> <session-config> <session-timeout>30</session-timeout> </session-config> <error-page> <error-code>404</error-code> <location>/error 404. html</location> </error-page> </web-app>
Customizing Deployment Ø Define initialization parameters l Context parameters • Apply to entire web application l Servlet parameters • Apply to a specific servlet
Deployment Descriptor <? xml version=“ 1. 0” encoding=“UTF-8: ? > <!DOCTYPE web-app PUBLIC ‘-//Sun Microsystems, Inc. //DTD Web Application 2. 3//EN’ ‘http: //java. sun. com/dtd/web-app_2_3. dtd’> <web-app> <display-name>A Simple Application</display-name> <context-param> Context <param-name>location</param-name> <param-value>BYU-Idaho</param-value> Intialization <description>Site Location</description> Parameter </context-param> <servlet-name>Verify Data</servlet-name> <servlet-class>Verify. Data</servlet-class> <init-param> Servlet <param-name>max. Value</param-name> Intialization <param-value>25</param-value> Parameter </init-param> </servlet> <servlet-mapping> <servlet-name>Verify Data</servlet-name> <url-pattern>/verifydata</url-pattern> </servlet-mapping> <session-config> <session-timeout>30</session-timeout> </session-config> <error-page> <error-code>404</error-code> <location>/error 404. html</location> </error-page> </web-app>
Retrieving Init. Parameters public void init() throws Servlet. Exception { super. init(); Servlet. Context context = this. get. Servlet. Context(); String location = context. get. Init. Parameter(“location"); if (max. Value == null) { int max. Value = Integer. parse. Int(this. get. Init. Parameter(“max. Value"); } … … }
Handling Errors Ø HTTP Error Codes l l Http Status code – set error code Error page – set default error page Ø Send Redirect – redirect to another page Ø Servlet Exceptions – catch and handle all servlet exceptions
Set HTTP Status Code Ø Sets the error status code on default error page Http. Servlet. Response public void send. Error(int status. Code) public void send. Error(int status. Code, String msg)) …. public void send. Redirect(String url); Import java. io. *; import javax. servlet. http. *; publc class Html. Page extends Http. Servlet { public void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws IOException { String name = request. get. Parameter(“name”); if (name. length() < 1) response. send. Error(9001, “Invalid name”); } }
Default HTTP Error Page Deployment Descriptor <? xml version=“ 1. 0” encoding=“UTF-8: ? > <<!DOCTYPE web-app PUBLIC ‘-//Sun Microsystems, Inc. //DTD Web Application 2. 3//EN’ ‘http: //java. sun. com/dtd/web-app_2_3. dtd’> <web-app> <display-name>A Simple Application</display-name> <servlet-name>Verify data</servlet-name> <servlet-class>Verify. Data</servlet-class> <init-param> <param-name>max. Value</param-name> <param-value>25</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>verify. Data</servlet-name> <url-pattern>/verify. Data</url-pattern> </servlet-mapping> <session-config> <session-timeout>30</session-timeout> </session-config> <error-page> <error-code>9001</error-code> <location>/error 9001. html</location> </error-page> Define output error page for error code
Send Redirect Ø Redirect to another page to handle error Http. Servlet. Response public void send. Error(int status. Code) public void send. Error(int status. Code, String msg)) …. public void send. Redirect(String url); Import java. io. *; import javax. servlet. http. *; publc class Html. Page extends Http. Servlet { public void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws IOException { String name = request. get. Parameter(“name”); if (name. length() < 1) response. send. Redirect(“/Servlets/invalid. Name. Page”); } }
Servlet Session Management Ø Hidden fields in form l l Ø Visible to client in source (not secure) Limited amount of data URL rewritting http: //www. byui. edu/j 2 ee? sessionid=9982345 Ø Cookies l l Ø Store on client browser May be disabled by some users Server side session object l Session info stored on Server • Unlimited amount of space • More secure l Automatic management
Creating Cookies Ø Implement transactions with Cookies l Store state data in Cookie Http. Servlet. Response … public void add. Cookie(Cookie c) public Cookie[ ] get. Cookies() …. Cookie public void set. Value(String value) public String get. Name() public String get. Value() ….
Creating a Cookie Import java. io. *; import javax. servlet. http. *; publc class Html. Page extends Http. Servlet { public void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws IOException { try { Cookie cookie = new Cookie(“user. Address”, null); String url = this. get. Requext. URI(); cookie. add. Value(url); response. add. Cookie(cookie); double quantity = Double. parse. Double(request. get. Parameter(“quantity”)); double total. Quantity += (Double) session. get. Attribute(“total. Quantity”); } catch (Remote. Exception remex) { response. send. Error(response. SC_INTERNAL_SERVER_ERROR); } } }
Retrieving a Cookie publc class Html. Page extends Http. Servlet { String user. Url = new Unique. ID(); public void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws IOException { try { Cookie cookie = null; Cookie[] cookies = response. get. Cookies(); if (cookies != null) { for (int i=0; i < cookies. length; i++) { cookie = cookies[i]; if (cookie. get. Name(). equals(“user. Address”)) { String url. Address = cookie. get. Value(); break; } } catch (Remote. Exception remex) { response. send. Error(response. SC_INTERNAL_SERVER_ERROR); } }
Sessions Ø Implement transactions with a Http. Session l Retains state of data between page request Http. Session Http. Servlet. Request … public Http. Session get. Session() …. public long get. Id() public long get. Last. Accessed. Time() public long get. Creation. Time() public long get. Max. Inactive. Interval() public Object get. Attribute() public boolean is. New() ….
Getting a Session Import java. io. *; import javax. servlet. http. *; publc class Html. Page extends Http. Servlet { public void do. Get(Http. Servlet. Request request, Http. Servlet. Response response) throws IOException { try { Http. Session session = request. get. Session(); if (session. is. New()) { Long person. Id = (Long) session. get. Attribute(“person. Id”); } double quantity = Double. parse. Double(request. get. Parameter(“quantity”)); session. set. Attribute(“quantity”); } catch (Remote. Exception remex) { response. send. Error(response. SC_INTERNAL_SERVER_ERROR); } } }
Filter Servlets Ø Acts as preprocessor to request/response for target servlet …Http. Page Authenticate Filter Servlet …Verify. Data Page. Hits Filter Servlet Http. Page Servlet Verify. Data Servlet
Filter Servlet Import java. io. *; import javax. servlet. http. *; publc class Page. Hits extends Http. Servlet implements Filter { private Filter. Config filter. Config = null; Must implement Filter Interface public void init(Filter. Config filter. Config) throws Servlet. Exception { this. filter. Config = filter. Config; } public void destroy( { this. filter. Config = null; } Must override init. method Must override destroy method
Filter Servlet (cont. ) public void do. Filter(Http. Servlet. Request request, Http. Servlet. Response response, Must override Filter. Chain chain) throws IOException, Servlet. Exception do. Filter method { if (filter. Config == null) return; synchronized (this) { Integer counter =(Integer) filter. Config. get. Servlet. Context(). get. Attribute("Counter"); if (counter == null) counter = new Integer(0); counter = new Integer(counter. int. Value()+1); filter. Config. get. Servlet. Context(). log("Number of hits is " + counter); filter. Config. get. Servlet. Context(). set. Attribute("Counter", counter); } chain. do. Filter(req, resp) }
Modify Deployment Descriptor <? xml version=“ 1. 0” encoding=“UTF-8: ? > <<!DOCTYPE web-app PUBLIC ‘-//Sun Microsystems, Inc. //DTD Web Application 2. 3//EN’ ‘http: //java. sun. com/dtd/web-app_2_3. dtd’> <web-app> <display-name>A Simple Application</display-name> <servlet-name>Verify. Data</servlet-name> <servlet-class>Verify. Data</servlet-class> <init-param> <param-name>max. Value</param-name> <param-value>25</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Verify Data</servlet-name> <url-pattern>/verify. Data/</url-pattern> </servlet-mapping> <filter-name>Page Hits</filter-name> <display-name>Page Hits</display-name> <description>Count page hits<description> <filter-class>Page. Hits</filter-class> </filter> <filter-mapping> <filter-name>Page. Hits</filter-name> <servlet-name>Verify. Data</servlet-name> </filter-mapping> </web-app>
Listener Servlet Ø Servlet is automatically executed when some external event occurs HTTPSession. Activation. Listener Session is activated/passivated HTTPSession. Attribute. Listener Session attribute is added/removed HTTPSession. Listener Session attribute is created/destroyed HTTPSession. Context. Attribute. Listener Servlet contextattribute is added/removed HTTPSession. Context. Listener Servlet context changes
Create Listener Servlet Import java. io. *; import javax. servlet. http. *; publc class Listener extends Http. Servlet implements Servlet. Context. Listener { private Servlet. Context context = null; public void context. Intialized(Servlet. Context. Event event) { context = event. get. Server. Context(); Integer counter = new Integer(0); context. set. Attribute(“Counter”, counter); context. log(“Created Counter”); Must implement Listner Interface Must override context. Initialized method } public void context. Destroyed(Servlet. Context. Event event) { event. get. Servlet. Context(). remove. Attribute(“Counter”); } } Must override context. Initialized method
Modify Deployment Descriptor <? xml version=“ 1. 0” encoding=“UTF-8: ? > <<!DOCTYPE web-app PUBLIC ‘-//Sun Microsystems, Inc. //DTD Web Application 2. 3//EN’ ‘http: //java. sun. com/dtd/web-app_2_3. dtd’> <web-app> <display-name>A Simple Application</display-name> <servlet-name>Verify data</servlet-name> <servlet-class>Verify. Data</servlet-class> <init-param> <param-name>max. Value</param-name> <param-value>25</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Verify Data</servlet-name> <url-pattern>/verify. Data/</url-pattern> </servlet-mapping> <filter-name>Page Hits</filter-name> <display-name>Page Hits</display-name> <description>Count page hitsdescription> <filter-class>Page. Hits</filter-class> </filter> <filter-mapping> <filter-name>Page. Hits</filter-name> <servlet-name>Verify data</servlet-name> </filter-mapping> <listener> < listener-class>Listener</ listener -class> </listener> </web-app>
Modify Filter Servlet public void do. Filter(Http. Servlet. Request request, Http. Servlet. Response response, Filter. Chain chain) throws IOException, Servlet. Exception { if (filter. Config == null) return; synchronized (this) { Integer counter =( Integer) filter. Config. get. Servlet. Context(). get. Attribute(“Counter”); if (counter = null) No longer needed counter = new Integer(1); counter = new Integer(counter. int. Value()+1); filter. Config. get. Servlet. Context(). log(“Number of hits is “ + counter); filter. Config. get. Servlet. Context(). set. Attribute(“Counter”, counter); } chain. do. Filter(request, response); } }
Modified Filter Servlet public void do. Filter(Http. Servlet. Request request, Http. Servlet. Response response, Filter. Chain chain) throws IOException, Servlet. Exception { if (filter. Config == null) return; synchronized (this) { Integer counter =( Integer) filter. Config. get. Servlet. Context(). get. Attribute(“Counter”); counter = new Integer(counter. int. Value()+1); filter. Config. get. Servlet. Context(). log(“Number of hits is “ + counter); filter. Config. get. Servlet. Context(). set. Attribute(“Counter”, counter); } chain. do. Filter(request, response); } }











































