J2EE Servlets
description
Transcript of J2EE Servlets
J2EE ServletsJ2EE Servlets
Ch. 10 (Architecture)Ch. 10 (Architecture)
Ch. 12 (21 Days)Ch. 12 (21 Days)
History of Interactive WebHistory of Interactive Web AppletsApplets
Long download timesLong download times Code on client machines (maintenance)Code on client machines (maintenance)
CGICGI Custom code to interact with web serverCustom code to interact with web server Security holeSecurity hole Resource hog for large sitesResource hog for large sites
Java ServletsJava Servlets Standard, easy interface to web serverStandard, easy interface to web server Security/authenticationSecurity/authentication Implements sessionsImplements sessions
History (cont.)History (cont.) Early use of ServletsEarly use of Servlets
Simple, easy to use for web applicationsSimple, easy to use for web applications MVC all implemented in one big servletMVC all implemented in one big servlet
• Very complexVery complex• Difficult to maintainDifficult to maintain• Not scalableNot scalable
Current state of Servlet useCurrent state of Servlet use Smaller is better. Smaller is better. Used only for:Used only for:
• Gathering and validating data input from the userGathering and validating data input from the user• Coordinating outputCoordinating output• Minimal business logicMinimal business logic• Web page forwardingWeb page forwarding
Servlet FeaturesServlet Features
Tailored to interact with Web ServerTailored to interact with Web Server Server and platform independentServer and platform independent Efficient and scalableEfficient and scalable Container provides additional functionalityContainer provides additional functionality
(i.e., authentication, cookies, etc.)(i.e., authentication, cookies, etc.)
Interacting with HTML FormsInteracting with HTML Forms
Get – Request information from web Get – Request information from web serverserver SimpleSimple
http://www.byui.edu/j2ee?Name=Fred+&tel=3565132http://www.byui.edu/j2ee?Name=Fred+&tel=3565132
Post – Send data to the serverPost – Send data to the server Submit button, etc.Submit button, etc. Data is sent in body of messageData is sent in body of message Safer than GetSafer than Get
HTML Forms (Cont.)HTML Forms (Cont.)
Put – Place a file on the serverPut – Place a file on the server
Delete – Remove a web page from serverDelete – Remove a web page from server
Servlet Class DiagramServlet Class DiagramClass Diagram
Servlet Life CycleServlet Life Cycle
Class Diagram
State: Resident ProcessingRequest
START
END
init()
doGet(), doPost, …
destroy()
Servlet Sequence DiagramServlet Sequence Diagram
Fig. 12-15
Model 1 - Servlets onlyModel 1 - Servlets only
Model/View/Control
Servlet
WebServer
Database
doGet/doPost
webpageGenerate
HTML
submit
Data
Servlets in the EnterpriseServlets in the Enterprise
ModelView/Control
EJBEntityBeanWebServer
ServletInput
Control
Output
doGet/doPost
webpage
submit
Data
Performance and
Flexibility Issues
publc class HtmlPage extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { String name = request.getParameter(“name”); String telephone = request.getParameter(“tel”); response.setContentType(“text/html”);
…. Business logic ….
PrintWriter out = response.getWriter(): out.println(“<HTML>”); out.println(“<HEAD><TITLE>First Servlet</TITLE></HEAD>”); out.println(“<BODY>”); out.println(“<H1>Hello “ + name + “, Telephone “ + telephone + “</H1>”); out.println(“</BODY>”); out.println(“</HTML>”); }
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { doGet(request, response); }
}
Example ServletExample Servlet
Get value of form parameters
Sent output to web browser
Model 2 ArchitectureModel 2 Architecture
ModelView
Data Access Objecs
<<EntityEJB>>WebServer
Servlet
JSPpage
input
output
doGet/doPost
webpage
Control
Business
Methods<<SessionEJB>>
Data
submit
<<forward>>
JSPServlet
Web Development Life CycleWeb Development Life CycleModel 2 ArchitectureModel 2 Architecture
Get request Parameters
Determine and call business function
Determine next view Build view
Web Development Life CycleWeb Development Life Cycle
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");String password = request.getParameter("password");
try {InitialContext context = new InitialContext();BusinessRulesRemote businessRules =
(BusinessRulesRemote) context.lookup(BusinessRules.REMOTE_JNDI_NAME);Long personId = businessRules.login(username,password);
} catch (Exception e) {e.printStackTrace();
}
HttpSession session = request.getSession();session.setAttribute("personid", personId);
RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");dispatcher.forward(request, response);
}
1. Get request parameters
2.Call business function
3. Determine next view
Web Development Life CycleWeb Development Life CycleJSP pageJSP page
<div id="login"> <span class='highlight'>Welcome to Home Town Bank!</span> <br> <a id='logout' href="">Logout</a></div>
4.Build next view
How to use HTTPServletHow to use HTTPServlet
HttpServletRequest
HttpServlet
doGet(request HttpServletRequest , response:HttpServletResponse)
doPost(request HttpServletRequest, response:HttpServletResponse)
doPut(request HttpServletRequest , response:HttpServletResponse)
doDelete(request HttpServletRequest , response:HttpServletResponse)
HttpServletResponse
Contains Request Info (Input) Handles Response (Output)
RequestResponse InterfaceRequestResponse InterfaceForwarding a Response
RequestResponse InterfaceRequestResponse InterfaceIncluding other Web Components
Deployment of ServletsDeployment of Servlets
All Servlet files zipped together into a web All Servlet files zipped together into a web archive (“war”) filearchive (“war”) file
Requires specific directory structureRequires specific directory structure
Deployment Descriptor (WSDL)Deployment Descriptor (WSDL)
Deployment DescriptorDeployment 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> <servlet-name>Verify Data</servlet-name> <servlet-class>VerifyData</servlet-class> <init-param> <param-name>maxValue</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>/error404.html</location> </error-page></web-app>
Customizing DeploymentCustomizing Deployment
Define initialization parametersDefine initialization parameters Context parametersContext parameters
• Apply to entire web applicationApply to entire web application
Servlet parametersServlet parameters• Apply to a specific servletApply to a specific servlet
<?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> <param-name>location</param-name> <param-value>BYU-Idaho</param-value> <description>Site Location</description> </context-param> <servlet> <servlet-name>Verify Data</servlet-name> <servlet-class>VerifyData</servlet-class> <init-param> <param-name>maxValue</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>/error404.html</location> </error-page></web-app>
Deployment DescriptorDeployment Descriptor
Context Intialization Parameter
Servlet Intialization Parameter
Retrieving Init. ParametersRetrieving Init. Parameters
public void init() throws ServletException{ super.init(); ServletContext context = this.getServletContext(); String location = context.getInitParameter(“location");
if (maxValue == null) {
int maxValue = Integer.parseInt(this.getInitParameter(“maxValue"); } … …}
Handling ErrorsHandling Errors
HTTP Error CodesHTTP Error Codes Http Status code – set error codeHttp Status code – set error code Error page – set default error pageError page – set default error page
Send Redirect – redirect to another pageSend Redirect – redirect to another page
Servlet Exceptions – catch and handle all Servlet Exceptions – catch and handle all servlet exceptionsservlet exceptions
Set HTTP Status CodeSet HTTP Status Code
Sets the error status code on default error pageSets the error status code on default error page
Import java.io.*;import javax.servlet.*;import javax.servlet.http.*;publc class HtmlPage extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { String name = request.getParameter(“name”); if (name.length() < 1) response.sendError(9001, “Invalid name”); }
}
HttpServletResponse
public void sendError(int statusCode)public void sendError(int statusCode, String msg)) ….public void sendRedirect(String url);
Default HTTP Error PageDefault HTTP Error Page
<?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> <servlet-name>Verify data</servlet-name> <servlet-class>VerifyData</servlet-class> <init-param> <param-name>maxValue</param-name> <param-value>25</param-value> </init-param></servlet>
<servlet-mapping> <servlet-name>verifyData</servlet-name> <url-pattern>/verifyData</url-pattern></servlet-mapping><session-config> <session-timeout>30</session-timeout></session-config><error-page> <error-code>9001</error-code> <location>/error9001.html</location></error-page></web-app>
Define output error page for error code
Deployment Descriptor
Send RedirectSend Redirect Redirect to another page to handle errorRedirect to another page to handle error
Import java.io.*;import javax.servlet.*;import javax.servlet.http.*;publc class HtmlPage extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { String name = request.getParameter(“name”); if (name.length() < 1) response.sendRedirect(“/Servlets/invalidNamePage”); }
}
HttpServletResponse
public void sendError(int statusCode)public void sendError(int statusCode, String msg)) ….public void sendRedirect(String url);
Servlet Session ManagementServlet Session Management Hidden fields in formHidden fields in form
Visible to client in source (not secure)Visible to client in source (not secure) Limited amount of dataLimited amount of data
URL rewrittingURL rewrittinghttp://www.byui.edu/j2ee?sessionid=9982345http://www.byui.edu/j2ee?sessionid=9982345
CookiesCookies Store on client browserStore on client browser May be disabled by some usersMay be disabled by some users
Server side session objectServer side session object Session info stored on ServerSession info stored on Server
• Unlimited amount of spaceUnlimited amount of space• More secureMore secure
Automatic managementAutomatic management
Creating CookiesCreating Cookies Implement transactions with CookiesImplement transactions with Cookies
Store state data in CookieStore state data in Cookie
Cookie
public void setValue(String value)public String getName()public String getValue()….
HttpServletResponse
…public void addCookie(Cookie c)public Cookie[ ] getCookies() ….
Creating a CookieCreating a CookieImport java.io.*;import javax.servlet.*;import javax.servlet.http.*;publc class HtmlPage extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { try { Cookie cookie = new Cookie(“userAddress”, null); String url = this.getRequextURI(); cookie.addValue(url); response.addCookie(cookie); double quantity = Double.parseDouble(request.getParameter(“quantity”)); double totalQuantity += (Double) session.getAttribute(“totalQuantity”); } catch (RemoteException remex) { response.sendError(response.SC_INTERNAL_SERVER_ERROR); } }
}
Retrieving a CookieRetrieving a Cookiepublc class HtmlPage extends HttpServlet{ String userUrl = new UniqueID(); public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { try { Cookie cookie = null; Cookie[] cookies = response.getCookies(); if (cookies != null) { for (int i=0; i < cookies.length; i++) { cookie = cookies[i]; if (cookie.getName().equals(“userAddress”)) { String urlAddress = cookie.getValue(); break; } } } } catch (RemoteException remex) { response.sendError(response.SC_INTERNAL_SERVER_ERROR); } }
SessionsSessions Implement transactions with a HttpSessionImplement transactions with a HttpSession
Retains state of data between page requestRetains state of data between page request
HttpSession
public long getId()public long getLastAccessedTime()public long getCreationTime()public long getMaxInactiveInterval()public Object getAttribute() public boolean isNew() ….
HttpServletRequest
…public HttpSession getSession() ….
Getting a SessionGetting a SessionImport java.io.*;import javax.servlet.*;import javax.servlet.http.*;publc class HtmlPage extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { try { HttpSession session = request.getSession(); if (session.isNew()) {
Long personId = (Long) session.getAttribute(“personId”); } double quantity = Double.parseDouble(request.getParameter(“quantity”)); session.setAttribute(“quantity”); } catch (RemoteException remex) { response.sendError(response.SC_INTERNAL_SERVER_ERROR); } }
}
Filter ServletsFilter Servlets
Acts as preprocessor to request/response Acts as preprocessor to request/response for target servletfor target servlet
AuthenticateFilter
Servlet
HttpPage Servlet
VerifyData Servlet
PageHitsFilter
Servlet
…HttpPage
…VerifyData
Filter ServletFilter ServletImport java.io.*;import javax.servlet.*;import javax.servlet.http.*;publc class PageHits extends HttpServlet implements Filter{ private FilterConfig filterConfig = null; public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; }
public void destroy( { this.filterConfig = null; }
Must override init. method
Must override destroy method
Must implementFilter Interface
Filter Servlet (cont.)Filter Servlet (cont.)
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { if (filterConfig == null) return; synchronized (this) { Integer counter =(Integer) filterConfig.getServletContext().getAttribute("Counter");
if (counter == null) counter = new Integer(0); counter = new Integer(counter.intValue()+1); filterConfig.getServletContext().log("Number of hits is " + counter); filterConfig.getServletContext().setAttribute("Counter", counter); }
chain.doFilter(req, resp) }
Must override doFilter method
Modify Deployment DescriptorModify 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> <servlet-name>VerifyData</servlet-name> <servlet-class>VerifyData</servlet-class> <init-param> <param-name>maxValue</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>
<filter> <filter-name>Page Hits</filter-name> <display-name>Page Hits</display-name> <description>Count page hits<description> <filter-class>PageHits</filter-class> </filter> <filter-mapping> <filter-name>PageHits</filter-name> <servlet-name>VerifyData</servlet-name> </filter-mapping> </web-app>
Listener ServletListener Servlet
Servlet is automatically executed when Servlet is automatically executed when some external event occurssome external event occurs
HTTPSessionActivationListenerHTTPSessionActivationListener Session is activated/passivatedSession is activated/passivated
HTTPSessionAttributeListenerHTTPSessionAttributeListener Session attribute is added/removedSession attribute is added/removed
HTTPSessionListenerHTTPSessionListener Session attribute is created/destroyedSession attribute is created/destroyed
HTTPSessionContextAttributeListenerHTTPSessionContextAttributeListener Servlet contextattribute is Servlet contextattribute is added/removedadded/removed
HTTPSessionContextListenerHTTPSessionContextListener Servlet context changesServlet context changes
Create Listener ServletCreate Listener ServletImport java.io.*;import javax.servlet.*;import javax.servlet.http.*;publc class Listener extends HttpServlet implements ServletContextListener{ private ServletContext context = null; public void contextIntialized(ServletContextEvent event)
{ context = event.getServerContext(); Integer counter = new Integer(0); context.setAttribute(“Counter”, counter); context.log(“Created Counter”);
}
public void contextDestroyed(ServletContextEvent event)
{ event.getServletContext().removeAttribute(“Counter”); }
}
Must override contextInitialized method
Must override contextInitialized method
Must implementListner Interface
Modify Deployment DescriptorModify 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> <servlet-name>Verify data</servlet-name> <servlet-class>VerifyData</servlet-class> <init-param> <param-name>maxValue</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> <filter> <filter-name>Page Hits</filter-name> <display-name>Page Hits</display-name> <description>Count page hitsdescription> <filter-class>PageHits</filter-class> </filter> <filter-mapping> <filter-name>PageHits</filter-name> <servlet-name>Verify data</servlet-name> </filter-mapping> <listener> < listener-class>Listener</ listener -class> </listener></web-app>
Modify Filter ServletModify Filter Servlet
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { if (filterConfig == null) return; synchronized (this) { Integer counter =( Integer) filterConfig.getServletContext().getAttribute(“Counter”); if (counter = null) counter = new Integer(1); counter = new Integer(counter.intValue()+1); filterConfig.getServletContext().log(“Number of hits is “ + counter); filterConfig.getServletContext().setAttribute(“Counter”, counter); counter);
}
chain.doFilter(request, response); }
}
No longer needed
Modified Filter ServletModified Filter Servlet
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { if (filterConfig == null) return; synchronized (this) { Integer counter =( Integer) filterConfig.getServletContext().getAttribute(“Counter”); counter = new Integer(counter.intValue()+1); filterConfig.getServletContext().log(“Number of hits is “ + counter); filterConfig.getServletContext().setAttribute(“Counter”, counter); counter);
}
chain.doFilter(request, response); }
}