Mark Dixon 1 09 – Java Servlets
Mark Dixon 1
09 – Java Servlets
Mark Dixon 2
Session Aims & Objectives• Aims
– To cover a range of web-application design techniques
• Objectives,by end of this week’s sessions, you should be able to:
– create a servlet– use a class to gather code common to different
pages
Mark Dixon 3
• most application programs – 3 major layers– Top (Presentation) layer:
• human/machine interaction (the user interface)– input from the keyboard / mouse– output in the form of screen displays / sound
– Middle (Application or business logic) layer:• core functionality – gives application program its character• contains business rules -> drive an organisation• e.g. order entry system vs. inventory control system
– Bottom layer• general services needed by other layers• e.g. file, print, communications, and database services
3
Application Layers
Mark Dixon 4
2-Tier Architecture• Presentation and Application layer
located on client machine– could be implemented using Applet interacting server
• Known as a ‘fat client’
Tier 1
Server
Presentation layerApplication layer
Client
Database server
Tier 2
Server
Mark Dixon 5
3-Tier Architecture• 3-tier architecture,
– only presentation layer on client– application layer on server – Database on server or third machine
• Known as a ‘thin-client’– very little (application) code / processing on client
• e.g. use of Java Servlets (JSP pages)
T ier 1
Presentation layer
Client
T ier 3
Database server
Application layer
T ier 2
Server
Mark Dixon 6
Example: AddNum (JSP)<%@page contentType="text/html" pageEncoding="UTF-8"%><%double N1;double N2;String Res = ""; if (request.getParameter("btnAdd") != null){ N1 = Double.parseDouble(request.getParameter("txtN1")); N2 = Double.parseDouble(request.getParameter("txtN2")); Res = Double.toString(N1 + N2); }%><!DOCTYPE html><html> <head><title>Add Numbers</title></head> <body> <form method="post"> <input name="txtN1" type="text" /><br /> <input name="txtN2" type="text" /><br /> <input name="btnAdd" type="submit" value="Add" /> <p><%=Res%></p> </form> </body></html>
AddNum.jsp
Java - functionality
HTML – user interface
Mark Dixon 7
JSP pages & Servlets• all JSP pages converted to servlet
• Servlet– Java program running in web server– Special type of Java class (.java file)
• Can get servlet error– caused by error in JSP page (usually missing } ), but difficult to see the connection
Mark Dixon 8
AddNum: .html file• Split
– User interface (html)– Functionality (Java)
<!DOCTYPE html><html> <head><title>Add Numbers</title></head> <body> <form method="post" action="AddNum"> <input name="txtN1" type="text" /><br /> <input name="txtN2" type="text" /><br /> <input name="btnAdd" type="submit" value="Add" /> </form> </body></html>
Points to Servlet (AddNum.java)
Mark Dixon 9
AddNum: .java fileimport java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;
public class AddNum extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { double N1; double N2; String Res = ""; response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { N1 = Double.parseDouble(request.getParameter("txtN1")); N2 = Double.parseDouble(request.getParameter("txtN2")); Res = Double.toString(N1 + N2); out.println("<html>"); out.println("<head>"); out.println("<title>Add Numbers</title>"); out.println("</head>"); out.println("<body>"); out.println(Res); out.println("</body>"); out.println("</html>"); } finally { out.close(); } }
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); }
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); }
@Override public String getServletInfo() { return "Short description"; }}
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { double N1; double N2; String Res = ""; response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { N1 = Double.parseDouble(request.getParameter("txtN1")); N2 = Double.parseDouble(request.getParameter("txtN2")); Res = Double.toString(N1 + N2); out.println("<html>"); out.println("<head>"); out.println("<title>Add Numbers</title>"); out.println("</head>"); out.println("<body>"); out.println(Res); out.println("</body>"); out.println("</html>"); } finally { out.close(); } }
Calculationcode
Also, write (all) html
Mark Dixon 10
Example: PeopleList.jsp v2<%@page import="java.sql.*"%><%@page contentType="text/html"%><%Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection cn = DriverManager.getConnection("jdbc:odbc:PeopleDB", "", "");Statement st = cn.createStatement();ResultSet r = st.executeQuery("SELECT * FROM Person;");String html = "";String id; while(r.next()){ id = Integer.toString(r.getInt("PersonID")); html += "<a href='Person2.jsp?id=" + id + "'>"; html += r.getString("Surname") + "</a><br />"; } cn.close();%><!DOCTYPE html><html> <head><title></title></head> <body> <%=html%> </body></html>
Connect to db
Mark Dixon 11
Example: Person.jsp v2<%@page import="java.sql.*"%><%@page contentType="text/html" pageEncoding="UTF-8"%><%String id = request.getParameter("id");Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection cn = DriverManager.getConnection("jdbc:odbc:PeopleDB", "", "");Statement st = cn.createStatement();ResultSet r = st.executeQuery("SELECT * FROM Person WHERE PersonID = " + id + ";");String surname = ""; if(r.next()){ surname = r.getString("Surname"); } cn.close();%><!DOCTYPE html><html> <head><title>Person</title></head> <body> Surname: <input name="txtSurname" type="text" value="<%=surname%>" /> </body></html>
Connect to DB
Mark Dixon 12
Person & PeoplList v2
• both JSP page duplicate common code
<%@page import="java.sql.*"%><%@page contentType="text/html" pageEncoding="UTF-8"%><%String id = request.getParameter("id");Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection cn = DriverManager.getConnection("jdbc:odbc:PeopleDB", "", "");Statement st = cn.createStatement();ResultSet r = st.executeQuery("SELECT * FROM Person WHERE PersonID = " + id + ";");String surname = ""; if(r.next()){ surname = r.getString("Surname"); } cn.close();%><!DOCTYPE html><html> <head><title>Person</title></head> <body> Surname: <input name="txtSurname" type="text" value="<%=surname%>" /> </body></html>
<%@page import="java.sql.*"%><%@page contentType="text/html"%><%Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection cn = DriverManager.getConnection("jdbc:odbc:PeopleDB", "", "");Statement st = cn.createStatement();ResultSet r = st.executeQuery("SELECT * FROM Person;");String html = "";String id; while(r.next()){ id = Integer.toString(r.getInt("PersonID")); html += "<a href='Person2.jsp?id=" + id + "'>"; html += r.getString("Surname") + "</a><br />"; } cn.close();%><!DOCTYPE html><html> <head><title></title></head> <body> <%=html%> </body></html>
Mark Dixon 13
Class People• Contains common code for both pages
Peoplecnstr
OpenSelectClose
Mark Dixon 14
Class: People.java 1• Common code
package Main;import java.sql.*;
public class People{private Connection cn;private Statement st;private ResultSet r;
public void Open(){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); cn = DriverManager.getConnection("jdbc:odbc:PeopleDB", "", ""); } catch (Exception e){ //e.printStackTrace(); } }
public void Select(String sql){ try{ st = cn.createStatement(); r = st.executeQuery(sql); } catch (Exception e){ //e.printStackTrace(); } }
public boolean Next(){ boolean found = false; try{ found = r.next(); } catch (Exception e){ //e.printStackTrace(); } return found; }
public String get(String id){ String s = ""; try{ s = r.getString(id); } catch (Exception e){ //e.printStackTrace(); } return s; }
public void Close(){ try{ cn.close(); } catch (Exception e){ //e.printStackTrace(); } }}
package Main;import java.sql.*;
public class People{private Connection cn;private Statement st;private ResultSet r;
public void Open(){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); cn = DriverManager.getConnection("jdbc:odbc:PeopleDB", "", ""); } catch (Exception e){ //e.printStackTrace(); } }
public void Select(String sql){ try{ st = cn.createStatement(); r = st.executeQuery(sql); } catch (Exception e){ //e.printStackTrace(); } }
Mark Dixon 15
Class: People.java 2• Common code
package Main;import java.sql.*;
public class People{private Connection cn;private Statement st;private ResultSet r;
public void Open(){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); cn = DriverManager.getConnection("jdbc:odbc:PeopleDB", "", ""); } catch (Exception e){ //e.printStackTrace(); } }
public void Select(String sql){ try{ st = cn.createStatement(); r = st.executeQuery(sql); } catch (Exception e){ //e.printStackTrace(); } }
public boolean Next(){ boolean found = false; try{ found = r.next(); } catch (Exception e){ //e.printStackTrace(); } return found; }
public String get(String id){ String s = ""; try{ s = r.getString(id); } catch (Exception e){ //e.printStackTrace(); } return s; }
public void Close(){ try{ cn.close(); } catch (Exception e){ //e.printStackTrace(); } }}
public boolean Next(){ boolean found = false; try{ found = r.next(); } catch (Exception e){ //e.printStackTrace(); } return found; }
public String get(String id){ String s = ""; try{ s = r.getString(id); } catch (Exception e){ //e.printStackTrace(); } return s; }
public void Close(){ try{ cn.close(); } catch (Exception e){ //e.printStackTrace(); } }}
Mark Dixon 16
PersonList.jsp
• Class complex
• Pages simpler
<%@page import="Main.*" %><%@page contentType="text/html" pageEncoding="UTF-8"%><%!People p = new People();%><%String html = ""; p.Open(); p.Select("SELECT * FROM Person;"); while(p.Next()){ html += p.get("Surname") + "<br />"; } p.Close();%>
<!DOCTYPE html><html> <head><title>People</title></head> <body> <%=html%> </body></html>
Import Package
Use methods
Create Instance
Mark Dixon 17
Example: Person v3 (Specification)
• User requirement:Display person’s details from database online
– Change surname and save to database
Mark Dixon 18
• modify data in one or more rows,matching specified condition(s)
• General SQL format:UPDATE Table
SET ColumnName1 = Value1, ColumnName2 = Value2, …WHERE ColumnNameA = ValueAAND ColumnNameB = ValueB …
Example: UPDATE Book
SET price = '45.00', title = 'Core Web' , price = ’50.00’ WHERE isbn = '0130897930' 18
SQL UPDATE Statement
Mark Dixon 19
SQL INSERT & DELETE• INSERT – adds new record
• DELETE – deletes specified records
Mark Dixon 20
Example: Person.jsp v3<%@page import="java.sql.*"%><%@page contentType="text/html" pageEncoding="UTF-8"%><%String id = request.getParameter("id");Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection cn = DriverManager.getConnection("jdbc:odbc:PeopleDB", "", "");Statement st = cn.createStatement(); if(request.getParameter("btnSave") != null){ String surname = request.getParameter("txtSurname"); String sql = "UPDATE Person" + " SET surname = '" + surname + "'" + " WHERE PersonID = " + id + ";"; st.executeUpdate(sql); }ResultSet r = st.executeQuery("SELECT * FROM Person WHERE PersonID = " + id + ";");String surname = ""; if(r.next()){ surname = r.getString("Surname"); } cn.close();%><!DOCTYPE html><html> <head><title>Person</title></head> <body> <form action="" method="post"> Surname: <input name="txtSurname" type="text" value="<%=surname%>" /><br> <input name="btnSave" type="submit" value="Save" /> </form> </body></html>
Save button works now
Mark Dixon 21
Example: Person.jsp v3<%@page import="java.sql.*"%><%@page contentType="text/html" pageEncoding="UTF-8"%><%String id = request.getParameter("id");Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection cn = DriverManager.getConnection("jdbc:odbc:PeopleDB", "", "");Statement st = cn.createStatement(); if(request.getParameter("btnSave") != null){ String surname = request.getParameter("txtSurname"); String sql = "UPDATE Person" + " SET surname = '" + surname + "'" + " WHERE PersonID = " + id + ";"; st.executeUpdate(sql); }ResultSet r = st.executeQuery("SELECT * FROM Person WHERE PersonID = " + id + ";");String surname = ""; if(r.next()){ surname = r.getString("Surname"); } cn.close();%><!DOCTYPE html><html> <head><title>Person</title></head> <body> <form action="" method="post"> Surname: <input name="txtSurname" type="text" value="<%=surname%>" /><br> <input name="btnSave" type="submit" value="Save" /> </form> </body></html>
if(request.getParameter("btnSave") != null){ String surname = request.getParameter("txtSurname"); String sql = "UPDATE Person" + " SET surname = '" + surname + "'" + " WHERE PersonID = " + id + ";"; st.executeUpdate(sql); }
Mark Dixon 22
Tutorial Exercise: Person2• Task 1: Get the Person (v2) example from
the lecture working (using the People class).
Mark Dixon 23
Tutorial Exercise: Person3• Task 1: Get the Person (v3) example from
the lecture working.• Task 2: Modify your code, so that a line of
text is displayed confirming that data has been saved.
• Task 3: Modify the list page, so that an add button is included, which allows a new record to be added.
• Task 4: Modify the person page, so that a delete button is included, which allows the current record to be deleted.