89
Margus Hanni, Nortal AS Servlet, JSP 11.03.2013

Servlet , JSP

Embed Size (px)

DESCRIPTION

Servlet , JSP. Margus Hanni, Nortal AS. 11.03.2013. Viited varasematele materjalidele…. 2012 – TÜ - Servlets , JSP, Web Containers – Roman Tekhov 2010 – Webmedia - Java EE + containers – Anti Orgla. Kas on asjakohane?. - PowerPoint PPT Presentation

Citation preview

Page 1: Servlet , JSP

Margus Hanni, Nortal AS

Servlet, JSP

11.03.2013

Page 2: Servlet , JSP

Viited varasematele materjalidele…

2012 – TÜ - Servlets, JSP, Web Containers – Roman Tekhov

2010 – Webmedia - Java EE + containers – Anti Orgla

Page 3: Servlet , JSP

Kas on asjakohane?

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

Page 4: Servlet , JSP

Kas on asjakohane?

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

Page 5: Servlet , JSP

Hello World - C ja JAVA

#include <stdio.h> int main() { printf("Hello World\n"); return 0; }

public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World"); } }

Page 6: Servlet , JSP

Kas on asjakohane?

Võrreldes eelmise aastaga on JAVA populaarsus taas kasvanud

Jätkuvalt on JAVA populaarseim keel ning selles osas arvatavasti lähiajal muutusi ei toimu

JAVA on laialdaselt kasutuses erinevate veebilahenduste loomisel

Page 7: Servlet , JSP

JAVA EE (Enterprise Edition)

Kogum vahendeid erinevate lahenduste loomiseks:

Veebi rakendused

Veebi teenused

Sõnumivahetus

Andmebaasid

http://en.wikipedia.org/wiki/Java_Platform,_Enterprise_Edition

Page 8: Servlet , JSP

JAVA EE

Kogum vahendeid erinevate lahenduste loomiseks:

Veebi rakendused

Veebi teenused

Sõnumivahetus

Andmebaasis

http://en.wikipedia.org/wiki/Java_Platform,_Enterprise_Edition

Web ContainerServletJSP

Page 9: Servlet , JSP

Web Container

Manages componentlife cycles

Routes requests toapplications

Accepts requests, sends responses

http://tutorials.jenkov.com/java-servlets/overview.html

Page 10: Servlet , JSP

Web Containers

Apache Tomcat

JBoss

WebLogic

Jetty

Glassfish

Websphere

Page 11: Servlet , JSP

Web Containers

Multiple applicationsinside one container

http://tutorials.jenkov.com/java-servlets/overview.html

Page 12: Servlet , JSP

Application structure

Page 13: Servlet , JSP

Application structure

Java source files

Page 14: Servlet , JSP

Application structure

Document root

Page 15: Servlet , JSP

Application structure

15

Static content

Page 16: Servlet , JSP

Application structure

Configuration,executable code

Page 17: Servlet , JSP

Application structure

Deployment descriptor

Page 18: Servlet , JSP

Application structure

Compiled classes

Page 19: Servlet , JSP

Application structure

Dependencies (JAR-s)

Page 20: Servlet , JSP

Application structure

Java Server Pages

Page 21: Servlet , JSP

Deployment descriptor (web.xml)Instructs the container how to deal with this application<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0">

<welcome-file-list><welcome-file>index.html</welcome-file>

</welcome-file-list>

</web-app>

Page 22: Servlet , JSP

Deployment descriptor (web.xml)In Servlet API version 3.0 most components of web.xml are replaced by annotations that go directly to Java source code.

We will see examples later

Page 23: Servlet , JSP

Servlets

On JAVA klass, mis töötleb sissetulevat päringut ning tagastab vastuse

Enamasti kasutatakse HTTP päringute ja vastuste töötlemiseks

Servletid töötavad veebikonteineris, mis hoolitseb nende elutsükli ning päringute suunamise eest

javax.servlet.http.HttpServlet – abstraktne klass, mis sisaldab meetodeid doGet ja doPost HTTP päringute töötlemiseks

Page 24: Servlet , JSP

Servlet examplepublic class HelloServlet extends HttpServlet {

@Overrideprotected void doGet(HttpServletRequest req,

HttpServletResponse resp) throws ServletException, IOException {

PrintWriter writer = resp.getWriter();writer.println("<html><head><title>Hello</

title></head><body>");writer.println("<p>Hello World!</p>");writer.println("<p>Current time: " + new

Date() + "</p>");writer.println("</body></html>");

}}

Page 25: Servlet , JSP

HttpServlet methods

For each HTTP method there is corresponding HttpServlet method

doPostdoGetdoPut

Page 26: Servlet , JSP

Servleti töö

Page 27: Servlet , JSP

Servlet Mapping

Before Servlet 3.0 in web.xml<servlet>

<servlet-name>hello</servlet-name><servlet-class>example.HelloServlet</servlet-class>

</servlet>

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

</servlet-mapping>

Page 28: Servlet , JSP

Servlet Mapping

In Servlet 3.0 via annotation

@WebServlet("/hello")public class HelloServlet extends HttpServlet {...

Page 29: Servlet , JSP

Servlet life cycle

http://tutorials.jenkov.com/java-servlets/servlet-life-cycle.html

Page 30: Servlet , JSP

Üldine servleti elutsükkel

Kui veebikonteineris puudub Servleti instants

Laetakse Servleti klass

Luuakse isend

Initsialiseeritakse (init meetod)

Iga päringu jaoks kutsutakse välja service meetod

Servleti kustutamisel kutsutakse välja destroy meetod

Page 31: Servlet , JSP

Sessions

HTTP is a stateless protocol, but we often need the server to remember us between requests There are some ways

CookiesURL rewriting

Page 32: Servlet , JSP

Java HttpSession

HttpSession is a common interface for accessing session context

Java Servlet API abstract away the details of how the session is maintained

Page 33: Servlet , JSP

Java HttpSession

http://java.sun.com/developer/onlineTraining/JSPIntro/contents.html

Page 34: Servlet , JSP

HttpSession example

HttpSession session = req.getSession();int visit;if (session.isNew()) {

visit = 0;} else {

visit = (Integer) session.getAttribute("visit");}session.setAttribute("visit", ++visit);

Page 35: Servlet , JSP

HttpSession example

HttpSession session = req.getSession();int visit;if (session.isNew()) {

visit = 0;} else {

visit = (Integer) session.getAttribute("visit");}session.setAttribute("visit", ++visit);

Either create a new session or get existing

Page 36: Servlet , JSP

HttpSession example

HttpSession session = req.getSession();int visit;if (session.isNew()) {

visit = 0;} else {

visit = (Integer) session.getAttribute("visit");}session.setAttribute("visit", ++visit);

Check if the session is fresh or not

Page 37: Servlet , JSP

HttpSession example

HttpSession session = req.getSession();int visit;if (session.isNew()) {

visit = 0;} else {

visit = (Integer) session.getAttribute("visit");}session.setAttribute("visit", ++visit);

Retrieve attribute

Page 38: Servlet , JSP

HttpSession example

HttpSession session = req.getSession();int visit;if (session.isNew()) {

visit = 0;} else {

visit = (Integer) session.getAttribute("visit");}session.setAttribute("visit", ++visit);

Update attribute

Page 39: Servlet , JSP

HttpServletRequest

Contains request informationAlso can be used to store attributes

request.setAttribute(“key", value);request.getAttribute(“key”);

Page 40: Servlet , JSP

HttpServletRequest: parametersrequest.getParameterNames();

Enumeration<String>

String value = request.getParameter("name");

Page 41: Servlet , JSP

HttpServletRequest: meta datarequest.getMethod();

“GET”, “POST”, …request.getRemoteAddr();

Remote client’s IPrequest.getServletPath();

“/path/to/servlet”…

Page 42: Servlet , JSP

HttpServletRequest: headers

request.getHeaderNames();Enumeration<String>

request.getHeader("User-Agent");

“Mozilla/5.0 (X11; Linux x86_64) …”

Page 43: Servlet , JSP

Request Headers

Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Encoding gzip, deflateAccept-Language et,et-ee;q=0.8,en-us;q=0.5,en;q=0.3Connection keep-alive

CookieJSESSIONID=C687CC4E2B25B8A27DAB4A5F30980583; __utma=111872281.1173964669.1316410792.1318315398.1338294258.52; oracle.uix=0^^GMT+3:00^p

Host localhost:8080

User-AgentMozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0

Page 44: Servlet , JSP

HttpServletRequest: cookies

Cookie[] cookies = request.getCookies();

cookie.getName();cookie.getValue();cookie.setValue(“new value”);

Page 45: Servlet , JSP

Cookie

JSESSIONID C687CC4E2B25B8A27DAB4A5F30980583 C687CC4E2B25B8A27DAB4A5F30980583

utma111872281.1173964669.13...318315398.1338294258.52

111872281.1173964669.13...318315398.1338294258.52

oracle.uix 0^^GMT 3:00^p 0^^GMT+3:00^p

Page 46: Servlet , JSP

HttpServletResponse

Allows to set response information

response.setHeader("Content-Type", "text/html");

response.addCookie(new Cookie("name", "value"));

Page 47: Servlet , JSP

Response Headers

Content-Language etContent-Type text/html;charset=UTF-8Date Mon, 11 Mar 2013 06:48:54 GMTServer Apache-Coyote/1.1Transfer-Encoding chunked

Page 48: Servlet , JSP

HttpServletResponse: content

response.getWriter().println("...");

Write text

response.getOutputStream().write(...);

Write binary

Page 49: Servlet , JSP

Problem with servlets

Writing HTML in Java is hideousPrintWriter writer = resp.getWriter();writer.println("<html><head><title>Hello</title></head><body>");writer.println("<p>Hello World!</p>");writer.println("<p>Current time: " + new Date() + "</p>");writer.println("</body></html>");

Page 50: Servlet , JSP

Java Server Pages (JSP)

Write standard markup

Add dynamic scripting elements

Add Java code

Page 51: Servlet , JSP

JSP example

war/WEB-INF/jsp/hello.jsp

<%@page import="java.util.Date"%>

<html><head><title>Hello</title></head><body>

<p>Hello World!</p><p>Current time: <%= new Date() %></p>

</body></html>

Page 52: Servlet , JSP

JSP mapping

In web.xml<servlet>

<servlet-name>hello2</servlet-name><jsp-file>/WEB-INF/jsp/hello.jsp</jsp-file>

</servlet>

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

</servlet-mapping>

Page 53: Servlet , JSP

The JSP Model 2 architecture

http://en.wikipedia.org/wiki/JavaServer_Pages

Page 54: Servlet , JSP

JSP life cycle

http://www.jeggu.com/2010/10/jsp-life-cycle.html

Page 55: Servlet , JSP

Dynamic content

Expression<p>Current time: <%= new Date() %></p>

Scriptlet<p>Current time: <% out.println(new Date()); %></p>

Page 56: Servlet , JSP

package org.apache.jsp.WEB_002dINF.jsp.document;

import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;import java.util.Date;

public final class testdokument_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent {

private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory();

private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

private javax.el.ExpressionFactory _el_expressionfactory; private org.apache.tomcat.InstanceManager _jsp_instancemanager;

public java.util.Map<java.lang.String,java.lang.Long> getDependants() { return _jspx_dependants; }

public void _jspInit() { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); }

public void _jspDestroy() { }

public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException {

final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriter out = null; final java.lang.Object page = this; javax.servlet.jsp.JspWriter _jspx_out = null; javax.servlet.jsp.PageContext _jspx_page_context = null;

try { response.setContentType("text/html; charset=UTF-8"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out;

out.write("\r\n"); out.write("\r\n"); out.write("<p>Current time: "); out.print( new Date() ); out.write("</p>"); } catch (java.lang.Throwable t) { if (!(t instanceof javax.servlet.jsp.SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { out.clearBuffer(); } catch (java.io.IOException e) {} if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); else throw new ServletException(t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } }}

Page 57: Servlet , JSP

Dynamic content

Declaration<%!

private Date currentDate(){return new Date();

} %>

<p>Current time: <%= currentDate() %></p>

Page 58: Servlet , JSP

JSP Eeldefineeritud muutujad

request- HttpServletRequest

response – HttpServletResponse

out – Writer

session – HttpSession

application – ServletContext

pageContext – PageContext

Page 59: Servlet , JSP

JSP Märgendid

jsp:include Veebipäring antakse ajutiselt üle mingile teisele JSP lehele.

jsp:forward Veebpäring antakse jäädavalt üle mingile teisele JSP lehele.

jsp:getProperty Loeb mingi JavaBeani muutuja väärtuse.

jsp:setProperty Määrab mingi JavaBeani muutuja väärtuse.

jsp:useBean Loob uue või taaskasutab mingit JSP lehele kättesaadavat JavaBeani.

Page 60: Servlet , JSP

Expression Language (EL)

Easy way to access JavaBeans in different scopes

Rea summa: ${rida.summa * rida.kogus}

Page 61: Servlet , JSP

Basic Operators in ELOperator Description

. Access a bean property or Map entry

[] Access an array or List element

( ) Group a subexpression to change the evaluation order

+ Addition

- Subtraction or negation of a value

* Multiplication

/ or div Division

% or mod Modulo (remainder)

== or eq Test for equality

!= or ne Test for inequality

< or lt Test for less than

> or gt Test for greater than

<= or le Test for less than or equal

>= or gt Test for greater than or equal

&& or and Test for logical AND

|| or or Test for logical OR

! or not Unary Boolean complement

empty Test for empty variable values

http://www.tutorialspoint.com/jsp/jsp_expression_language.htm

Page 62: Servlet , JSP

Scopes

Many objects allow you to store attributes

ServletRequest.setAttribute

HttpSession.setAttribute

ServletContext.setAttribute

Page 63: Servlet , JSP

Andmete skoobid

ServletContext – veebikontekst, üks ühe rakenduse ja JVM-i kohta

Sessioon – üks iga kasutajasessiooni kohta (erinev browser = erinev sessioon)

Request – konkreetse päringu skoop

Andmete kirjutamiseks/lugemiseks on meetodid setAttribute/getAttribute

Page 64: Servlet , JSP

Scopes

http://java.sun.com/developer/onlineTraining/JSPIntro/contents.html

Page 65: Servlet , JSP

Scopes

<% application.setAttribute("subject", "Web information systems");session.setAttribute("topic", "Servlets");request.setAttribute("lector", "Roman");pageContext.setAttribute("lector", "Roman");%>

Subject: ${subject}Topic: ${topic}Lector: ${lector}

Väljund: Subject: Web information systems Topic: Servlets Lector: Roman

Page 66: Servlet , JSP

Scopes

<% application.setAttribute("subject", "Web information systems");session.setAttribute("topic", "Servlets");request.setAttribute("lector", "Roman");pageContext.setAttribute("lector", "Roman");pageContext.setAttribute("subject", "Meie uus teema");application.setAttribute("subject", "Meie järgmine teema");%>

Subject: ${subject}Topic: ${topic}Lector: ${lector}

Mis on väljundiks?

Page 67: Servlet , JSP

Scopes

<% application.setAttribute("subject", "Web information systems");session.setAttribute("topic", "Servlets");request.setAttribute("lector", "Roman");pageContext.setAttribute("lector", "Roman");pageContext.setAttribute("subject", "Meie uus teema");application.setAttribute("subject", "Meie järgmine teema");%>

Subject: ${subject}Topic: ${topic}Lector: ${lector}

Subject: Meie uus teema Topic: Servlets Lector: Roman

Page 68: Servlet , JSP

Scopes

<% application.setAttribute("subject", "Web information systems");session.setAttribute("topic", "Servlets");request.setAttribute("lector", "Roman");pageContext.setAttribute("lector", "Roman");%>

Subject: ${subject}Topic: ${topic}Lector: ${lector}

Less visible

Page 69: Servlet , JSP

JavaBeans

public class Person implements Serializable {

private String name;

public Person() {}

public String getName() {return name;

}

public void setName(String name) {this.name = name;

}}

Implements Serializable

Public default constructor

getX and setX methods for each property X

Page 70: Servlet , JSP

JavaBeans in EL

Person person = new Person();person.setName("Roman");request.setAttribute("person", person);

<p>Person: ${person.name}</p>

Page 71: Servlet , JSP

Java Standard Tag Library (JSTL)Set of standard tools for JSP<%List<String> lectors = Arrays.asList("Siim", "Roman", "Margus");pageContext.setAttribute("lectors", lectors);%>

<c:set var="guestLector" value="Margus" />

<c:forEach var="lector" items="${lectors}">Name: ${lector}<c:if test="${lector eq guestLector}“>(guest)</c:if><br />

</c:forEach>

Page 72: Servlet , JSP

Problem with JSP

Writing Java in JSP is hideous

<p>Current time: <%= currentDate() %></p>

Page 73: Servlet , JSP

Model-View-Controller (MVC)

http://java.sun.com/blueprints/patterns/MVC-detailed.html

Page 74: Servlet , JSP

Servlet controller, JSP view

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

req.setAttribute("currentDate", new Date());

req.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(req, resp);}

Model data

Controller gets invoked

Page 75: Servlet , JSP

Servlet controller, JSP view

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

req.setAttribute("currentDate", new Date());

req.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(req, resp);}

Select and invoke view

Controller gets invoked

Page 76: Servlet , JSP

Servlet controller, JSP view

WEB-INF/jsp/hello.jsp

<html>...

<body><p>Current time: $

{currentDate}</p></body>

</html>View uses thedata from model

Page 77: Servlet , JSP

Filters

Allows you to do something before, after or instead of servlet invocation.

http://docs.oracle.com/javaee/5/tutorial/doc/bnagb.html

Filter chain

Page 78: Servlet , JSP

Filter example

public class LoggingFilter implements Filter {

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { long start = System.currentTimeMillis();

chain.doFilter(request, response);

long end = System.currentTimeMillis(); System.out.println("Time spent: " + (end - start)); }}

Page 79: Servlet , JSP

Filter example

public class LoggingFilter implements Filter {

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

long start = System.currentTimeMillis();

chain.doFilter(request, response);

long end = System.currentTimeMillis(); System.out.println("Time spent: " + (end - start)); }}

Invoke next filter inchain or the servletif this was the last filter

Page 80: Servlet , JSP

Filter declaration

Before Servlet 3.0 in web.xml

<filter><filter-name>loggingFilter</filter-name><filter-class>example.LoggingFilter</filter-

class></filter>

<filter-mapping><filter-name>hello</filter-name><url-pattern>/*</url-pattern>

</filter-mapping>

Page 81: Servlet , JSP

Filter declaration

In Servlet 3.0 via annotation

@WebFilter("/*")public class LoggingFilter implements Filter {...

Page 82: Servlet , JSP

Life cycle event listeners

javax.servlet.ServletContextListenerjavax.servlet.ServletContextAttributeListenerjavax.servlet.ServletRequestListenerjavax.servlet.ServletRequestAttributeListenerjavax.servlet..http.HttpSessionListenerjavax.servlet..http.HttpSessionAttributeListener

Page 83: Servlet , JSP

Listener example

public class LoggingRequestListener implements ServletRequestListener {

@Overridepublic void requestInitialized(ServletRequestEvent event) { System.out.println("Received request from " + event.getServletRequest().getRemoteAddr());}

@Override public void requestDestroyed(ServletRequestEvent event) {}

}

Page 84: Servlet , JSP

Listener declaration

Before Servlet 3.0 in web.xml

<listener><listener-class>example.LoggingRequestListener</listener-class>

</listener>

Page 85: Servlet , JSP

Listener declaration

In Servlet 3.0 via annotation

@WebListenerpublic class LoggingRequestListener implements ServletRequestListener {...

Page 86: Servlet , JSP

Should I bother?

• There are a lot of fancy Java web frameworks that simplify application building.

• Should I still learn these basic technologies, will I ever use them?

Page 87: Servlet , JSP

Should I bother?

• You are still going to deploy your application to a web container.

• Most traditional frameworks use JSP as the view technology.

Page 88: Servlet , JSP

What about servlets?

• Most frameworks are based on the Servlet API• You will probably still encounter things like

HttpSession, HttpServletRequest etc inside your code.

• You might want to write filters and listeners.• You probably won’t write much servlets. But

sometimes they can still be handy for simple tasks.

Page 89: Servlet , JSP

Sources of wisdom

Tutorialhttp://docs.oracle.com/javaee/6/tutorial/doc/http://docs.oracle.com/javaee/5/tutorial/doc/

APIhttp://docs.oracle.com/javaee/6/api/http://docs.oracle.com/javaee/5/api/