Survey
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
Web Applications
Basic Web Servers and the HTTP Protocol
Basic Dynamic Content Generation: Servlets, HTML Forms, JDBC
Java Web Applications, JSP, JSTL, JSTL Expression Language
…
-- 1 -Web Servers
and the HTTP Protocol
3
HTML could of course be used locally:
To retrieve a document, just read it from the local file system
To identify a document, use its filename: “/info/index.html”
But it was developed to be used over the Internet!
Retrieve: Communicate with a “web server” (HTTP protocol)
To identify a document, we need to know:
1. Which server has the document
2. Which TCP port the server is running on
3. Some additional identifier (“filename”), such as “info/index.html”
4. And maybe which part of the document we want to start at
Request
HTTP
Client
(browser)
HTTP
Server
Response
File System
or database…
jonkv@ida
Finding HTML Documents
4
We want a single string to provide all information!
And we might also want to use such strings for FTP, local files, …
URL: Universal/Uniform Resource Locator
Orig. intention: specify how a resource can be found, generally on the net
http://user:password@www.ida.liu.se:80/info/index.html#chapter2
ftp://user:password@ftp.ida.liu.se/pub/foo.zip
file:///home/jonkv/book.pdf
(unused fields can generally be omitted)
Later we got URNs: Names
Intention: Name a resource,
without saying where it is
urn:isbn:096139210x
urn:newsml:reuters.com:20000206:…
Eventually, one saw URLs and URNs as special cases of URIs: Identifiers Now, the distinction seems to be fading…
jonkv@ida
URIs and URLs
5
The web browser parses a URL
http://www.ida.liu.se/info/index.html#chapter2
▪
▪
▪
▪
Protocol:
Server name:
Path:
Anchor:
HTTP default port is 80
www.ida.liu.se (DNS says IP number is 130.236.177.26)
/info/index.html
#chapter2
Uses standard TCP to contact 130.236.177.26, port 80
Uses text‐based HTTP request/response protocol on top of TCP…
Client
(connects to port 80)
Requests “info/index.html"
HTTP Request
Server www.ida.liu.se
(listens to port 80)
HTTP Response
jonkv@ida
HTTP 1: Parsing a URL
6
The browser sends an HTTP request
A set of request headers
Request method: GET, HEAD, POST, PUT,
▪ GET /info/index.html HTTP/1.0
DELETE, CONNECT, TRACE, OPTIONS
▪ Host: www.ida.liu.se
▪ User‐Agent: Mozilla/5.0 (Windows;
U; Windows NT 5.0; en‐US; rv:1.1)
Gecko/20020818
▪ Accept: text/xml,application/xml,
application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,
video/x‐mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1
▪ Accept‐Language: en‐us, en;q=0.50
▪ Accept‐Encoding: gzip, deflate, compress;q=0.9
▪ Accept‐Charset: ISO‐8859‐1, utf‐8;q=0.66, *;q=0.66
▪ Keep‐Alive: 300
Request
▪ Connection: keep‐alive
▪ [empty line]
Client
Server
jonkv@ida
HTTP 2: Sending a Request
7
What resource (page, image, …) was requested?
Early web servers (1989+) used a single directory of files
▪ Request “info/index.html”
send file “<webroot>/info/index.html”
Modern servers may serve many domains (especially web hotels)
▪ www.company.se and www.second.se both point to IP 12.34.56.78
▪ ”Host: www.company.se” use ”host1” config / directories
▪ ”Host: www.second.se” use ”second” config / directories
Some paths may be mapped to programs
▪ Is “/info/index.html” the name of a program? No.
Other paths correspond to static files on disk
▪ /info/index.html send file “<IDA webroot>/info/index.html”
jonkv@ida
HTTP 3: Finding Requested Resources
8
The web server sends a reply
Sequence of HTTP response headers => blank line => data
▪ HTTP/1.1 200 OK
HTTP/version status explanation
▪ Date: Mon, 19 Aug 2123 16:05:14 GMT Code 200: ”OK, here’s what you
▪ Server: Apache/1.3.26 (Unix) PHP/4.2.2 mod_ssl/2.8.10 asked for”…
OpenSSL/0.9.6e
Mapped to English version: “You
▪ Content‐Location: index.en.shtml
asked for index.html, you got
▪ Vary: negotiate,accept‐language
index.en.shtml”
▪ TCN: choice
▪ Transfer‐Encoding: chunked
Vary: “I may send another reply if
▪ Content‐Type: text/html
you vary these fields” (for caching)
▪ Content‐Language: en
▪ [Empty line]
<!DOCTYPE HTML PUBLIC "‐//W3C//DTD HTML 4.01 //EN"
Contents of "http://www.w3.org/TR/html4/strict.dtd">
<HTML>
Client
Server
index file <HEAD>
Response
…
jonkv@ida
HTTP 4: Receiving a Reply
Sometimes a resource must be moved
301 Moved Permanently
▪ Header "Location: <new‐URL‐to‐resource>"
▪ Client may automatically send a new request for the new URL
▪ Client may automatically update links and bookmarks
302 Found / 307 Temporary Redirect
▪ Header "Location: <temporary‐URL‐to‐resource>"
▪ Client may automatically send a new request for the new URL
▪ Only temporary redirection; do not update links or bookmarks
Configuration: Web‐server‐dependent
9
jonkv@ida
HTTP 5: Redirection
10
Various errors on the client side
400 Bad Request
▪ Syntax error
403 Forbidden
▪ Server refuses to do this, regardless of authorization
404 Not Found
▪ May be permanently or temporarily unavailable; maybe never existed
410 Gone
▪ Used to exist, but is now intentionally, permanently unavailable
…
jonkv@ida
HTTP 6: Client Errors
11
HTTP needs to specify the response data type
Can't rely on simple file extensions – not robust
Uses data types from MIME e‐mail standard
Content‐type: type/subtype; param=value; param…
Seven top level types
▪ text, image, audio, video, application ‐‐‐ discrete
▪ message, multipart ‐‐‐ composite
Many subtypes
▪ text/plain, text/html, text/css, text/tab‐separated‐values, …
▪ image/jpeg, image/gif, image/png, image/t38, …
▪ application/postscript, application/octet‐stream, …
▪ Create your own, beginning with "x‐": application/x‐jonkv‐dbresult
Can accept parameters
▪ text/html; charset=iso‐8859‐1
jonkv@ida
HTTP 7: MIME Data Types
-- 2 -Dynamic Content Generation
CGI Scripts and Java Servlets
HTML Forms and Servlet Request Parameters
Java Database Connectivity
13
How to generate content dynamically?
Example: Show a random quotation ("fortune")
Early solution, 1993: CGI, Common Gateway Interface
Simple standard for executing external programs, “CGI scripts”
Place all external programs in a single directory, /cgi‐bin
When server receives "GET /cgi‐bin/fortune"…
▪ Assume the file is a program, execute it, and send its output!
Client
(connects to port
80)
Request
Requests
"cgi-bin/fortune"
Response
Server
(listens to port
80)
Execute
/www/cgibin/fortune
stdout
Configured to
serve "/www"
jonkv@ida
Dynamic Content Generation (1)
14
Your first CGI script
Writes some simple HTML code to standard output
Could use Perl or other languages. Here: plain shell script
▪ #!/bin/sh
echo "Content-type: text/html“
# An empty line separates headers from body
echo
echo "<html>"
echo "<head><title>Fortune</title></head>"
echo "<body>"
echo "<h1>This is today's fortune:</h1>"
echo "<pre>"
/bin/fortune
# use standard Unix fortune command
echo "</pre></body></html>"
/www/cgibin/fortune
jonkv@ida
Your First CGI Script
15
CGI scripts have some limitations:
Not completely well‐defined interface
No support for common server‐side tasks
Must start a new OS process for every request (inefficient!)
Better alternatives were quickly developed
Proprietary interfaces for commercial web servers
Module interface for the common Apache server (open source)
New languages intended to be used on the web,
including PHP (first "full" version june 1998)
jonkv@ida
CGI Limitations
16
The Java approach: Servlets (”miniature servers”)
Implemented as subclasses of HttpServlet
Loaded dynamically into the server’s servlet container
▪ Created, init()ed, called for multiple requests, possibly destroy()ed
▪ doGet() for GET requests, doPost() for POST requests (some forms),
doPut(), doDelete(), doOptions(), doTrace()
▪ public class FortuneServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws … {
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println("<html><head><title>Fortune</title></head>");
out.println("<head><title>Hello World</title></head><body>");
out.println("<h1>This is today's “ +
• From early 1997, before PHP
“fortune:</h1><pre>");
• Extensive API support
out.println(Fortune.getFortune());
• Servlet container always loaded –
no need to create new processes
out.println("</pre></body></html>");
}
jonkv@ida
Servlets: The Java Approach
18
Users must be able to send information to the server
Online store example:
▪ User registration form – enter name, address, … and store in database
▪ Click‐to‐buy: Which item did you click? Store in shopping cart
▪ …
Solution: Add forms to HTML, send form input to the servlet
▪ Each GUI control has a name and a value
▪ Submitting sends name=value pairs to the servlet
General format:
▪ <form action="http://somehost/address‐of‐servlet‐or‐script">
…HTML code…
…"input" tags generating GUI controls…
</form>
jonkv@ida
Scripts Need Input!
Text input tags:
Name:
<input
Password:
<input
type="text" name="firstName"
value="initial"
maxlength="30">
type="password" name="pass"
maxlength="30">
19
jonkv@ida
HTML Forms 1: Text Input
20
Yes/no input tags: Checkboxes
▪ <p>Which operating systems do you use?</p>
<input type="checkbox" name="os" value="Linux">Linux<br>
<input type="checkbox" name="os" value="Solaris">Solaris<br>
<input type="checkbox" name="os" value="Win">Windows<br>
<input type="checkbox" name="os" value="MacOS">MacOS<br>
<input type="checkbox" name="os" value="C64 Basic V2">C64 Basic V2
▪ Multiple choices result in for example "os=Linux,Solaris"
▪ Can of course use multiple groups (each group has a different name)
jonkv@ida
HTML Forms 2: Checkboxes
Yes/no input tags: Radio buttons
▪ <p>Your gender:<br>
<INPUT type="radio" name="gnd" value="Male">Male<br>
<INPUT type="radio" name="gnd" value="Female">Female<br>
▪ Only one selected radio button within each named group
21
jonkv@ida
HTML Forms 3: Radio Buttons
Button input tags:
<input type="submit" name="ok" value="Do this">
<input type="submit" name="ok" value="Do that">
▪ Value is also used as label
▪ Pressing one results in "ok" being set to "Do this" or "Do that",
and in submitting the form to the specified URL
<input
type="reset" name="reset"
value="Reset this form">
Additional tags (see spec):
Image buttons
Hidden controls (predefined data to be submitted)
File selector control (upload files to CGI scripts)
22
jonkv@ida
HTML Forms 4: Buttons + misc
23
Complete form example:
<FORM action="http://somesite.com/cgi-bin/adduser” method=“(next page)”>
<table class="mytable">
<tbody>
<tr><td>First name:<td><INPUT type="text" name="first">
<tr><td>Last name: <td><INPUT type="text" name="last">
<tr><td>E-mail: <td><INPUT type="text" name="email">
<tr><td><INPUT type="radio" name="gender" value="Male"> Male
<tr><td><INPUT type="radio" name="gender" value="Female"> Female
<tr><td><INPUT type="submit" value="Send"> <INPUT type="reset">
</tbody>
</table>
</FORM>
jonkv@ida
HTML Forms 5: Complete Example
25
Sending form data, method 1: GET
Same HTTP method as when retrieving a static page
▪ <FORM action="http://somesite.com/cgi-bin/adduser" method="get">
Form input ends up in the URL query string
▪ Adds a “?” after the action URL
▪ Adds each name=value pair separated by “&”
▪ Uses a special 7‐bit query string format
▪ a‐z, A‐Z, 0‐9 remain the same
▪ Space is converted into '+'
▪ Other characters are converted into ‘%xy’:
Hexadecimal representation of the lower 8 bits of the char
▪ Request: GET /cgi-bin/adduser?first=Jonas&last=Kvarnstr%F6m&… HTTP/1.0
The server automatically splits the URL at the question mark
▪ Resource:
▪ Query string:
/cgi-bin/adduser
first=Jonas&last=Kvarnstr%F6m&…
jonkv@ida
Form Requests 1: Using GET
Consequences of using GET:
Parameters end up in the URL field in the browser
▪ Positive: Can add a bookmark pointing to the query
▪ Negative: Many fields and lots of text very long URLs!
▪ Definitely not useful if you upload files!
Browsers assume it is safe to request the same URL again
▪ They don’t ask for permission to reload the page
▪ Can be OK for information requests
▪ But don’t use GET for actions having side effects
▪ Add new user
▪ Send email
▪ …
26
jonkv@ida
Form Requests 2: Using GET
27
Sending form data, method 2: POST
Designed for sending form data
▪ <FORM action="http://somesite.com/cgi-bin/adduser" method="post">
Request data ends up in the HTTP request data section
▪ POST /cgi-bin/adduser HTTP/1.0
[other headers]
(blank line)
first=Jonas&last=Kvarnstr%F6m&…
Positive: Much better if you send large quantities of data
Negative: No parameters in the URL, so not possible to bookmark
Must be used when you don’t want to re‐submit by accident
(you don’t want to purchase the same item twice!)
▪ Browsers generally ask whether to really re‐post data
if you try to reload the page
jonkv@ida
Form Requests 3: Using POST
Information about the request: HttpServletRequest
This is where you get your form parameters (already parsed)
▪ req.getParameter(“first") == “Jonas”
▪ req.getParameter(“last") == “Kvarnström” (no %xy codes!)
Sending a response: HttpServletResponse
First, set the content type
▪ void setContentType(String mimetype)
Then, send a response (tunneled through the web server)
▪ PrintWriter getWriter()
▪ ServletOutputStream getOutputStream()
28
jonkv@ida
ServletRequest / Response
HTML:
29
jonkv@ida
Servlet Example: Queries
<form action="http://foo.com/employees/list" method="get">
Name pattern: <input type="text" name="pat">…
</form>
----------------------------------------------------------------------------------------------------------------public class ListEmployeeServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws … {
res.setContentType("text/html");
Error handling and PrintWriter out = res.getWriter();
many details omitted!
String pattern = req.getParameter("pat");
DBs covered later.
Connection con = …;
String query = "SELECT * FROM employees WHERE id like ‘?‘ ";
PreparedStatement stmt = con.prepareStatement(query);
stmt.setString(1, pat);
ResultSet emp = stmt.executeQuery(query);
out.println("<HTML><BODY><p>Employees matching pattern:</p>");
while (emp.next()) { /* get and print employee information */ }
out.println("</BODY></HTML>");
}
Webapp:
Servlet:
HTML:
30
jonkv@ida
Servlet Example: Adding Employees
Employee database (context path: /employees)
NewEmployeeServlet (configured within the webapp as "new")
<form action="http://foo.com/employees/new" method="post">
Name: <input type="text" name="name">…
</form>
----------------------------------------------------------------------------------------------------------------public class NewEmployeeServlet extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse res) throws … {
res.setContentType("text/html");
String name = req.getParameter("name");
String address = req.getParameter("address");
// …
String query = "INSERT INTO employees VALUES(?,?,?,…)";
PreparedStatement stmt = con.prepareStatement(query);
stmt.setString(1, name); /* … */
int modified = stmt.executeUpdate(query);
// …
out.println("<HTML><BODY><p>Added new user: " + name + “</p></BODY></
}
JDBC:
Java Database Connectivity
Interface to relational databases / SQL
2010-01-21
Jonas Kvarnström
31
32
Java keeps track of a set of DataSources
Using JNDI: Java Naming and Directory Interface
Application servers take care of much of the setup
In the labs: configure/name a database in Tomcat’s config (XML)
▪ Example:
<Resource
name="jdbc/MyDB”
auth="Container”
type="javax.sql.DataSource”
username=”…” password=”…"
driverClassName=”…” url=”…”
maxActive="8" />
▪ This creates a DataSource named ”jdbc/MyDB”
▪ Automatically creates a connection pool: When you close a connection, it is actually stored and can be reused
jonkv@ida
JDBC 1: DataSource
Use the DataSource to connect to a database
Use getConnection() to get a connection
▪ InitialContext ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/MyDB");
Connection con = null;
try {
con = ds.getConnection(url, "ID", "passwd");
// Use the connection
} finally {
try { if (con != null) con.close(); }
catch (SQLException e) { /* handle it, log it, … */ }
}
Remember to close it!
▪ If you forget, you may run out of connections…
▪ The pattern above (with try/finally) ensures it is closed
even if there is an exception inside “try”
▪ Note that there can be an exception when you close it!
33
jonkv@ida
JDBC 2: Getting a Connection
A connection can handle many concurrent queries
Each query is handled by a separate Statement
Each Statement keeps track of its own settings (timeouts, …)
ds.getConnection()
Connection to MyDB
createStatement()
Statement
(settings for one query)
createStatement()
Statement
(settings for one query)
34
jonkv@ida
JDBC 3: Making a Statement
Use executeQuery() to execute a SELECT query
▪ String query="SELECT * FROM employees WHERE salary<12000";
Statement myStatement = null;
ResultSet rs = null;
try {
myStatement = connection.createStatement();
rs = myStatement.executeQuery(query);
// use rs
} finally {
try { if (rs != null) rs.close(); }
catch (SQLException e) { /* handle it */ }
try { if (myStatement != null) myStatement.close(); }
catch (SQLException e) { /* handle it */ }
}
35
jonkv@ida
JDBC 4: Executing a SELECT query
Use PreparedStatements for non‐constant queries!
If you put user‐generated information into query strings:
▪ String pattern = req.getParameter("pat");
String query = "SELECT * FROM employees WHERE id like ‘“ + pattern + “’”;
▪ suppose the user enters x’; DELETE * FROM employees;
▪ Quoting is possible, but you have to get everything right
Let PreparedStatement take care of everything instead!
▪ Use ”?” as a placeholder
▪ String pattern = req.getParameter("pat");
String query = "SELECT * FROM employees WHERE id like ‘?‘ ";
PreparedStatement stmt = con.prepareStatement(query);
stmt.setString(1, pat);
boolean success = ps.executeQuery();
▪ Easier and safer
36
jonkv@ida
JDBC 5: PreparedStatement
37
executeQuery() returns a ResultSet – a set of rows
Similar to an Iterator
▪ "Cursor" points to the "current" row of data,
▪ next() advances the cursor – returns false if there were no more rows
Retrieve data from the current row
▪ Use column numbers or names:
getFloat(name), getInt(name), getString(name), …
▪ while (rs.next()) {
final String
name
= rs.getString("name");
final String
address = rs.getString("address");
prettyPrint(name, address);
}
Find out more about the result set using ResultSetMetaData
▪ ResultSetMetadata rsmd = rs.getMetaData();
jonkv@ida
JDBC 6: Using a ResultSet
38
Use executeUpdate() for update queries Can also use prepared statements more than once
▪ String q = "UPDATE employees SET salary = ? WHERE name = ?"; PreparedStatement stmt = con.prepareStatement(q);
stmt.setInt(1, 15000); stmt.setString(2, "John Doe");
int changedRows = stmt.executeUpdate();
stmt.setInt(1, 17000); stmt.setString(2, "Jane Doe");
changedRows += stmt.executeUpdate();
jonkv@ida
JDBC 7: Updates
39
Connections are normally in auto‐commit mode
Turn this off if you want to handle transactions
▪ con.setAutoCommit(false);
String q = "UPDATE employees SET salary = ? WHERE name = ?"; PreparedStatement stmt = con.prepareStatement(q);
stmt.setInt(1, 15000); stmt.setString(2, "John Doe");
stmt.executeUpdate();
stmt.setInt(1, 17000); stmt.setString(2, "Jane Doe");
stmt.executeUpdate();
con.commit(); // or con.rollback();
con.setAutoCommit(true);
jonkv@ida
JDBC 8: Transactions
-- 3 -Java Web Applications
41
“External Interface" presented
to web browsers
A webapp is a single coherent application
Message Forum
▪ Shopping system, message forum, …
Web applications
▪ Consists of HTML files, servlets, images, …
Appears as a hierarchical URL structure
▪ Rooted in the context path,
specified in the global web server config
Ex: Message forum at www.myserver.com
▪ Configure with context path "/forum" =>
http://www.myserver.com/forum /login
/index.html
…
▪ Configure with context path "/msg" =>
http://www.myserver.com/msg /login
/index.html
…
/login [servlet]
/listmsg [servlet]
/newmsg [servlet]
/newuser [servlet]
/index.html
/welcome.html
/img/logo.png
jonkv@ida
Webapps 1: Introduction
42
jonkv@ida
Webapps 2: Directory Structure
Physical directory structure matches URL hierarchy
Except WEB‐INF directory: Contains config files, servlets, … Message Forum
/login [servlet]
Virtual mapping through
<servlet-config> and
<servlet-mapping>
in web.xml
/listmsg [servlet]
/newmsg [servlet]
/newuser [servlet]
/index.html
/welcome.html
/img/logo.png
File System
[approot]/index.html
[approot]/welcome.html
[approot]/img/logo.png
[approot]/WEB-INF/web.xml
[approot]/WEB-INF/classes/…
Can be packaged as a single WAR file
(Web Archive) for easy distribution.
Unpacked version is called exploded directory.
43
The WEB‐INF directory:
Contains configuration files, servlets, and resources
▪ [approot]/WEB-INF/web.xml:
[approot]/WEB-INF/lib/*.jar:
[approot]/WEB-INF/classes/*:
[approot]/WEB-INF/res.foo:
A deployment descriptor (webapp config)
Libraries used from servlets and JSP
Compiled servlet classes
Resources to use in servlets (see below)
Example:
▪ …/WEB-INF/lib/jdbcdriver.jar
…/WEB-INF/classes/com/mycorp/LoginServlet.class
…/WEB-INF/classes/com/mycorp/ListMsgServlet.class
Files in WEB‐INF cannot be retrieved directly via HTTP
▪ Classes accessed through servlet mappings (discussed later)
▪ Files can be accessed from servlet code:
ServletContext ctxt = getServletConfig().getServletContext();
// Use ctxt.getResourceAsStream(…) or ctxt.getResource(…);
jonkv@ida
Webapps 3: WEB-INF
Deployment descriptor (web.xml)
XML header, then <web‐app> tag – example:
▪ <?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
… miscellaneous configuration items …
… miscellaneous configuration items …
… miscellaneous configuration items …
… miscellaneous configuration items …
</web-app>
44
jonkv@ida
Webapps 4: Deployment Descriptor
45
Configuring webapps should not require recompilation
Easiest to change configuration if you store it in a database
Also built‐in support for parameters in web.xml
▪ At the top level in web.xml:
<context-param>
<param-name>Webmaster</param-name>
<param-value>webmaster@mycorp.com</param-value>
</context-param>
Parameters accessed through ServletContext
▪ ServletContext ctxt = getServletConfig().getServletContext();
String webmaster = ctxt.getInitParameter("Webmaster");
jonkv@ida
Webapps 5: Configuration
Each servlet must be specified in web.xml
Configuration + possibly user‐specified init params
▪ <servlet>
<servlet-name>mylogin</servlet-name>
<servlet-class>com.mycorp.LoginServlet</servlet-class>
<display-name>Login Servlet</display-name>
<description>Log in using name / password</description>
<init-param>
<description>Maximum number of login attempts</description>
<param-name>maxattempts</param-name>
<param-value>3</param-value>
</init-param>
<init-param>…</init-param>
</servlet>
▪ String maxattempts = getServletConfig().getInitParameter(“maxattempts");
Internal ID:
mylogin
Class name:
com.mycorp.LoginServlet
46
jonkv@ida
Webapps 6: Configuring a Servlet
Mapping URLs to webapps:
47
Context path /forum
Web server assigns a context path
▪ The webapp itself does not control this!
▪ Setup: Server‐specific
Example:
▪ Web server at http://www.myserver.com
▪ Suppose admin downloads forum software,
places it at context path "/forum"
▪ any requests to
http://www.myserver.com/forum/…
go to the forum webapp!
▪ The remainder of the URL,
after “http://www.myserver.com/forum/”,
is an address within the webapp
▪ How do we find the intended resource?
Web Application:
Message Forum
LoginServlet
ListMsgServlet
NewMsgServlet
NewUserServlet
index.html
welcome.html
smiley.png
jonkv@ida
Mapping 1: Context paths
48
Suppose someone asks for http://www.myserver.com/forum/index.html
▪ Server part is http://www.myserver.com
▪ Context path /forum maps to this webapp
▪ Remainder is /index.html
There is no special configuration for /index.html in web.xml
▪ Search for a file at the root of the webapp
▪ If found, serve this file
File System
▪ If not, send error 404
[approot]/index.html
But what about servlets?
▪ People aren’t supposed to know about
internal class names, package structures…
▪ We want to define “external” names!
[approot]/welcome.html
[approot]/img/logo.png
[approot]/WEB-INF/web.xml
[approot]/WEB-INF/classes/…
jonkv@ida
Mapping 2: General Files
49
Simple servlet mapping
http://www.myserver.com/forum/login ‐> LoginServlet
▪ Server part is http://www.myserver.com
▪ Context path /forum maps to this webapp
▪ Remainder is /login
▪ <servlet-mapping>
<url-pattern>/login</url-pattern>
<servlet-name>mylogin</servlet-name>
</servlet-mapping>
public void doGet(HttpServletRequest req, HttpServletResponse res) throws … {
String contextPath = req.getContextPath();
// "/forum"
String servletPath = req.getServletPath();
// "/login"
String pathInfo = req.getPathInfo();
// null
}
URL:
Internal ID:
Class name:
http://<server>/<ctxt>/login
mylogin
com.mycorp.LoginServlet
(http://www.myserver.com/forum/login)
jonkv@ida
Mapping 3: Servlets
Wildcard matching
http://www.myserver.com/forum/view/102 –> show msg 102
▪ <servlet-mapping>
<url-pattern>/view/*</servlet-name>
<servlet-name>ViewMessage</servlet-name>
</servlet-mapping>
▪ The complete request path is sent to the servlet,
which can extract the message number
public void doGet(HttpServletRequest req, HttpServletResponse res) throws … {
String contextPath = req.getContextPath();
// "/forum"
String servletPath = req.getServletPath();
// "/view"
String pathInfo = req.getPathInfo();
// "/102"
// … Parse pathInfo as a query parameter
}
50
jonkv@ida
Mapping 4: Path Wildcards
How to map: Extension matching
Can be used to define automatic pre‐processing for *.foo files
▪ Suppose we want any *.foo to be handled by FooServlet,
regardless of where in the webapp the *.foo file is located
▪ <servlet-mapping>
<servlet-name>foo</servlet-name>
<url-pattern>*.foo</servlet-name>
</servlet-mapping>
public void doGet(HttpServletRequest req, HttpServletResponse res) throws … {
String contextPath = req.getContextPath();
// "/forum"
String servletPath = req.getServletPath();
// "/sub/test.foo"
String pathInfo = req.getPathInfo();
// null
}
51
jonkv@ida
Mapping 5: File Extensions
The server returns a MIME type for every file
Servlets set this using response.setContentType()
Files are given MIME types using extension mapping
▪ <mime‐mapping>
<extension>pdf</extension>
<mime‐type>application/pdf</mime‐type>
</mime‐mapping>
Can use the ServletContext to find the MIME type of a file
▪ ServletContext ctxt = getServletConfig().getServletContext();
String mimetype = ctxt.getMimeType("misc/test.zip");
52
jonkv@ida
Mapping 6: MIME Types
53
The webapp does not know where it will end up!
May be placed at "/forum", at "/users/jonkv/msgs", even at "/"!
Should not contain hardcoded links to a single path!
To link to another part of the application:
Use a relative link
▪ <a href="../topiclist?start=100">Next page</a>
▪ Must know "where you are" – address is relative to your own location!
Servlets: Can use the context path
▪ public void doGet(HttpServletRequest req, HttpServletResponse res) … {
String contextPath = req.getContextPath(); // "/forum", or "/board", or …
String linkURL = contextPath + "/topiclist?start=100";
…
}
JSP: <jsp:getProperty name="request" property="contextPath"/>
JSTL: The <c:url> tag can locate resources relative to this webapp
jonkv@ida
Mapping 7: Where is the application?
Summary of servlet configuration:
1) Give each servlet class an ID
▪ <servlet>
<servlet-name>mylogin</servlet-name>
<servlet-class>com.mycorp.LoginServlet</servlet-class>
</servlet>
2) Associate various paths with servlet IDs
▪ <servlet-mapping>
<url-pattern>/login</url-pattern>
<servlet-name>mylogin</servlet-name>
</servlet-mapping>
54
jonkv@ida
Summary