Why server side programming ?. What is java servlet ?

57
Why server side programming ?

Transcript of Why server side programming ?. What is java servlet ?

Why server side programming ?

What is java servlet ?

Practical applications of java servlets

– Developing ecommerce – Web site that open up large legacy system

on internet– Distributed object application on web

Alternatives for servlets

• CGIcreates new process for each CGI request

implemented in perl (require interpreter for every req. )

• server side java scriptJavascript into precompiled HTML pages.

Nerscape’s Enterprise and fasttrack server

• ASPNot precompiled tied to specific web server IIS

Why servlet?

• Efficient» Initialization only first time, then it call’s service

• Persistent» Maintain state between requests( It stay resident in memory)

• Portable» Because they are in java.

• Robust» Well define exception handling.

• Extensible» Polymorphism and inheritance

• Secure » Server side» Java security manager

Java servlet architecture

<<interface>>Javax.servlet.Servlet------------------------------------------------------------Init( )getServletConfig( )service( )getServletInfo( )Destroy()

<<interface>>Javax.servlet.ServletConfig------------------------------------------------------------getInitParameter( )getServletContex( )getInitParameterNames( )

<<interface>>Javax.io.Serializable------------------------------------------------------------

Javax.servlet.GenricServlet--------------------------------------------------------------------------getInitParameter( )getServletContext( )getInitParameterNames( ) log( )init()getServletConfig()service()getServletInfo()destory()

Javax.servlet.http.HttpServlet--------------------------------------------------------------------------doDelete()doGet()doOptions()doPost()doPut()doTrace()getLastModified()service()

Genericservlet and HttpServlet • No main() it calls servlets service() method.

• GenericServlet.service()Public abstract void service(ServletRequest req, ServletResponse res)

throws ServletException, IOException

• Httpservlet.sevice()Public abstract void service(HttpServletRequest rq, HttpServletResponse rs)

throws ServletException, IOException

It’s already implemented . Depending upon METHOD stored in request it overrides doGet() or doPost()

Life cycle of servlet

• java.servlet.Servlet interface– init()

» Call immediately after server initialize.» It initializes resources that will be using for request.» Public void init(ServletConfig config) throws Servletexception

– service()» Handle all request send by client. starts aftre init()» Public abstract void service (ServletRequest req,

ServletResponse res) throws ServletException,

IOException

– destory()» End of servlet life » Return all resource eg close database connection » Good place to save persistent information » Public void destory();

Simple servlet to display hello

// simple servlet to display “Hello again servlet “

import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

public class AgainHello extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet

{protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{response.setContentType("text/html");PrintWriter out = response.getWriter();out.print("<hr/>");out.print("<h3>Hello again Servlet</h3>");

} }

import javax.servlet.ServletException;import javax.servlet.http. *;

public class AgainHello extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet

{public void init (ServletConfig config) throws servletException{ super.init(config) }

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{response.setContentType("text/html");PrintWriter out = response.getWriter();out.print("<table border=2><tr><th>Doller</th><th>Rs.</th></tr>");for(i=1;i<10;i++)out.print(“<tr><td>“ + i + “</td><td>“ + i*50 + “</td></tr>”);} }

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); }

public String getServletInfo() { return “Description for request method Created by A. Yeole

on 3-6-2006 ";}

}

Java servlet architecture <<interface>>Javax.servlet.Servlet------------------------------

<<interface>>Javax.servlet.ServletConfig------------------------------------------------------------

<<interface>>Javax.io.Serializable------------------------------------------------------------

Javax.servlet.GenricServlet--------------------------------------------------------------------------

Javax.servlet.http.HttpServlet--------------------------------------------------------------------------

AgainHello

The methods overridden by AgainHello

• init()

• doGet()

• doPost()

• getServletInfo()

Httpservlet request object

• getCookies();

• getMethod();

• getPathInfo();

• getServletPath();

• getContextPath();

//myservlet.java

import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

public class AgainHello extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet

{protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{ response.setContentType("text/html");

PrintWriter out = response.getWriter();

out.println("<h1>Servlet myservlet at " + request.getContextPath () + "</h1>");

out.println("<p> servlet path : : " + request.getServletPath() +" </p>"); out.println("<p>the name of this servlet : : " + getServletInfo() +" </p>");

} public String getServletInfo() {

return “Description for request methode Created by A. Yeole on 3-6-2006 "; } }

Html form has action servlet

// html file myhtml.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

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

<form action="myservlet“ method=“GET" ><input type="submit" value="click me" name="b1" /></form>

<form action="myservlet" method="POST" enctype="multipart/form-data">

<input type="submit" value="click me post" /> </form>

</body></html>

// file myservlet.java

import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*;

public class myservlet extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{ response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter();

out.println("<html>"); out.println("<head>"); out.println("<title>Servlet myservlet</title>"); out.println("</head>"); out.println("<body>"); out.print("<h1>MY FAVORITE SUBJECTS</h1>");

out.print("<li>Operating Systems</li>"); out.print("<li>Java</li>"); out.print("<li>Maths</li>"); out.print("<li>C</li>");

out.println("</body>"); out.println("</html>"); out.close(); }

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } }

Retrieving form data in a servlet

• Three methods are used to retrieve request parameters are the ServletRequest’

• Public Enumeration ServletRequest.getParameterNames();• Public String ServletRequest.getParameter(String name);• Public String[] ServletRequest.getParameterValues(String n);

//form.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title></title></head><body> <form name="form1" action="formservlet"> <br> Email : <input type="text" name="email" value="" size="20" /><br> <br> Are U registered user : <input type="radio" name="reg" value="registered" checked="checked" />Yes <input type="radio" name="reg" value="unregistered" />No<br><br> <input type="submit" value="submit" name="submit" /><br> </form> </body></html>

//formservlet.java prog for reading data from form import java.io.*;import java.net.*;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.http.HttpServletRequest;

public class formservlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse

response) throws ServletException, IOException {

response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>");

out.println("</head>"); out.println("<body>"); String email = request.getParameter("email"); String rg = request.getParameter("reg"); out.println("<p>the mail id u have entered : : " + email +" </p>");

if (rg.equals("registered")) out.println("<h1> Registered user </h1>");

if (rg.equals("unregistered")) out.println("<h1> UnRegistered user </h1>");

out.println("</body>"); out.close(); }

Use of getParameterNames()

Enumeration p = request.getParameterNames();

String s;

While(p.hasMoreElements())

{

s = (String)p.nextElement();

out.printnl(s + “ : “ + request.getParameter(s) );

}

import java.io.*;

import java.net.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.util.*;

public class servlet2 extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html");

PrintWriter out = response.getWriter();

String title = "Reading All Request Parameters";

out.println( "<BODY BGCOLOR=\"#FDF5E6\">\n" +

"<H1 ALIGN=CENTER>" + title + "</H1>\n" +

"<TABLE BORDER=1 ALIGN=CENTER>\n" +

"<TR BGCOLOR=\"#FFAD00\">\n" +

"<TH>Parameter Name<TH>Parameter Value(s)");

Enumeration paramNames = request.getParameterNames();

while(paramNames.hasMoreElements()) {

String paramName = (String)paramNames.nextElement();

out.println("<TR><TD>" + paramName + "\n<TD>");

String[] paramValues = request.getParameterValues(paramName);

if (paramValues.length == 1) {

String paramValue = paramValues[0];

if (paramValue.length() == 0)

out.print("<I>No Value</I>");

else

out.print(paramValue);

} else {

out.println("<UL>");

for(int i=0; i<paramValues.length; i++) {

out.println("<LI>" + paramValues[i]);

}

out.println("</UL>");

}

}

out.println("</TABLE>\n</BODY></HTML>");

out.close();

}

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

processRequest(request, response);

}

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

processRequest(request, response);

}

public String getServletInfo() {

return "Short description"; } }

Listing All Form Data

// content of response - excel

import java.io.*;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

public class ApplesOranges extends javax.servlet.http.HttpServlet { protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/vnd.ms-excel"); PrintWriter out = response.getWriter(); out.println("\tQ1\tQ2\tQ3\tQ4\tTOTAL"); out.println("Apples\t78\t87\t29\t10\t=Sum(b2:e2)"); out.println("Oranges\t77\t86\t93\t10\t=Sum(b3:e3)");}

}

Parsing initialization parameters

• Initialization parameters are not part of request.

• they are passed to the servlet when it first loaded. Therefore u have access to them in init() method.

• The value of these parameter does not change until the servlet reloaded.

import java.io.*;import java.net.*;import javax.servlet.*;import javax.servlet.http.*;

public class myservlet1 extends HttpServlet { private String message;

private String defaultMessage = "No message."; private int repeats = 1;

public void init(ServletConfig config) throws ServletException {message = config.getInitParameter(“company");

} protected void doGet(HttpServletRequest request, HttpServletResponse

response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter();

out.println(“Wel come to ” + message); out.close(); } }

What is jdbc

• It is a pure java API used to execute sql statements.

• Basic step :

1. Open connection to database2. Execute sql statement 3. Process the result4. Close connection

• JDBC driver is JDBC ODBC bridge provided by sun jdk1.1 and later.

• It provides jdbc access to database trough odbc.

Application space

Java application

JDBC ODBC bridge

ODBC driver

Database

Installing and setting up ODBC bridge

Control panel

Establishing database connection

1. load JDBC driver

2. make connection

1. load JDBC driver• The class name of the JDBC-ODBC bridge driver is sun.jdbc.odbc.JdbcOdbcDriver. When a driver is loaded, it registers itself with Drivermanager which is then used to get the Connection.

1.new JdbcOdbcDriver();Will load a new driver object, calling its constructor.

2.Other way is class.forName(“JdbcOdbcDriver”) “forName” method of the “class” in “java.lang

package”

2.Make connection • We connect to database using the static method getConnection()

method of DriverManager class that returns a connection . • To get a connection, we need to specify a url for the actual

database we wish to use. The form of this url is specific to the driver we are using. With the driver loaded, we can use the properties file above to get the database url. Using the Sun JDBC-ODBC bridge driver, the url of the database is jdb:odbc:xxx where xxx is the ODBC data source name registered for your database.

String url = "jdbc:odbc:anjali";String user="";String password ="";Connection con =DriverManager.getConnection(url,user,password);

Open connection to database. you will be using it to create JDBC statements to the database.

Using statment• A Statement is obtained from a Connection:

Statement stmt = con.createStatement() ;• Once you have a Statement, you can use it to execute, and control

the execution of, various kinds of SQL queries.

Use stmt.executeUpdate with a string argument containing the text of an SQL update query (INSERT, DELETE or UPDATE). This returns an integer count of the number of rows updated.

Use stmt.executeQuery with a string argument containing the text of an SQL SELECT query. This returns a ResultSet object which is used to access the rows of the query results.

• int count = stmt.executeUpdate("INSERT INTO Customers " + "(CustomerFirstName, CustomerLastName, CustomerAddress) " "VALUES ('Tony', 'Blair', '10 Downing Street, London')") ;

• ResultSet rs = stmt.executeQuery("SELECT * FROM Customers") ; // do something with count and RS

Retrieving Information

• When executing an SQL statement that returns results, we use the executeQuery method which returns Resultset containing the row of data that satisfy the query

Executing ResultSet rs = stmt.exectueQuery (“SELECT * FROM customer”);

returns the rows containing the names, add of all entries in customer.

Working with ResultSets• If you do not know exactly the table

structure (the schema) of the ResultSet, you can obtain it via a ResultSetMetaData object

ResultSetMetaData rsmd = rs.getMetaData() ; int colCount = rsmd.getColumnCount() ; for (int i = 1 ; i <= colCount ; i++) {

if (i > 1)

out.print(", "); out.print(rsmd.getColumnLabel(i)) ;

} out.println() ;

• Sim.java

PreparedStatement

• The PreparedStatement interface inherits from Statement .

1. Instances of PreparedStatement contain an SQL statement that has already been compiled.

2. The SQL statement contained in a PreparedStatement object may have one or more IN parameters.

Because PreparedStatement objects are precompiled, their execution can be faster than that of Statement objects.

• Being a subclass of Statement, PreparedStatement inherits all the functionality of Statement. In addition, it adds a set of methods that are needed for setting the values to be sent to the database in place of the placeholders for IN parameters. Also, the three methods execute, executeQuery, and executeUpdate are modified so that they take no argument.

• Pre.java

Transactions• Transactions are a mechanism to group

operations together so that either all of them complete together successfully or none of them do.

When a Connection is obtained, by default its

AutoCommit property is set to true. This means that every query execution is committed immediately after it is executed and before the next one is executed. To enable grouping of operations in transactions, you have to switch the AutoCommit property off:

con.setAutoCommit(false) ;

Now you have to obtain new statement objects from the connection (the old ones won't work), and query or update as usual. When all operations that you want to group together have completed, you must commit the updates to the database:

con.commit() ;

At this point you can continue with more operations which will be grouped into a new transaction or you can switch AutoCommit back on:

con.setAutoCommit(true) ; anything goes wrong during a transaction (e.g.

an Exception is thrown or an error means that you cannot complete your group of operations) then you have to undo all operations in your transaction so far:

con.rollBack() ;

//formservlet.java prog for database connectivityimport java.io.*;import java.net.*;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.http.HttpServletRequest;

public class formservlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException { response.setContentType("text/html");

PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("</head>"); out.println("<body>"); String email = request.getParameter("email"); String rg = request.getParameter(“name"); try

{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection("jdbc:odbc:anjali","","");

Statement stmt = con.createStatement(); int rs = st.executeUpdate(“insert into directory values(“’+email+”’,”’+rg+””)”);

Out.println(“record insetred “);

Statement stmt1 = con.createStatement();ResultSet rs1= st1.executeQuery(“select * from directory”);While (rs1.next()){Out.println(“ ” + rs1.getString(“email”) + “ “ + rs1.getString(“phone”) );Out.println(<br>);}Con.close();}out.println("</body>"); out.close(); }

• Session Tracking

HttpSession object

• Using sessions in servlets is quite straightforward.

• involves – looking up the session object associated with the

current request.– creating a new session object when necessary.– looking up information associated with a session.– storing information in a session, and – discarding completed or abandoned sessions.

Looking up the HttpSession object associated with the current request.

• This is done by calling the getSession method of HttpServletRequest. If this returns null, you can create a new session, but this is so commonly done that there is an option to automatically create a new session if there isn't one already. Just pass true to getSession.

• HttpSession session = request.getSession(true);

Looking up Information Associated with a Session.

• HttpSession objects live on the server; they're just automatically associated with the requester.

• These session objects have a built-in data structure that let you store any number of keys and associated values

• getAttribute, • setAttribute

Although the data that was explicitly associated with a session is the part you care most about, there are some other pieces of information that are sometimes useful as well.

• getId. This method returns the unique identifier generated for each session. It is sometimes used as the key name when there is only a single value associated with a session, or when logging information about previous sessions.

• isNew. This returns true if the client (browser) has never seen the session, usually because it was just created rather than being referenced by an incoming client request. It returns false for preexisting sessions

• getCreationTime. This returns the time, in milliseconds since the epoch, at

which the session was made. To get a value useful for printing out, pass the value to the Date constructor or the setTimeInMillis method of GregorianCalendar.

• getLastAccessedTime. This returns the time, in milliseconds since the epoch, at which the session was last sent from the client.

• getMaxInactiveInterval. This returns the amount of time, in seconds, that a session should go without access before being automatically invalidated. A negative value indicates that the session should never timeout.

• Httpsession1.java– last access date

• Httpsession2.java– No of access