/*--------------------------------------------------
* Url_rewrite.java
*
* Use Java servlets sessions to tally golf scores.
* Session management is done using url-rewriting.
*
* Example from the book: Core J2ME Technology
* Copyright John W. Muchow http://www.CoreJ2ME.com
* You may use/modify for any non-commercial purpose
*-------------------------------------------------*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;
public class Url_rewrite extends MIDlet implements CommandListener
{
private Display display; // Reference to display object
private Form fmMain; // The main form
private TextField tfScore; // Enter new score
private int indxTextField; // Index on of the textfield
private StringItem siTotal; // Running total
private Command cmExit; // A Command to exit the MIDlet
private Command cmUpdate; // Update score on servlet
private int holeNumber = 1; // Current hole
private static final int MAX_HOLES = 18;
private String url = "http://www.mycgiserver.com/servlet/corej2me.Url_rewriteServlet";
public Url_rewrite()
{
display = Display.getDisplay(this);
// Enter scores
tfScore = new TextField("Enter score for Hole #1", "", 2, TextField.NUMERIC);
// Current running total
siTotal = new StringItem("Total: ", "");
// Commands
cmExit = new Command("Exit", Command.EXIT, 1);
cmUpdate = new Command("Send", Command.SCREEN,2);
// Create Form, add components, listen for events
fmMain = new Form("");
// Save index of textfield, it is removed
// after entering 18 values
indxTextField = fmMain.append(tfScore);
fmMain.append(siTotal);
fmMain.addCommand(cmExit);
fmMain.addCommand(cmUpdate);
fmMain.setCommandListener(this);
}
public void startApp()
{
display.setCurrent(fmMain);
}
public void pauseApp()
{ }
public void destroyApp(boolean unconditional)
{ }
/*--------------------------------------------------
* Process events
*-------------------------------------------------*/
public void commandAction(Command c, Displayable s)
{
if (c == cmExit)
{
destroyApp(false);
notifyDestroyed();
}
else if (c == cmUpdate) // Send score for next hole
{
// If nothing in the text field or max scores entered
if (tfScore.getString().equals("") || holeNumber > MAX_HOLES)
return;
else
{
try
{
// Update the score on remote server
updateTotal(tfScore.getString());
// If entered the maximum, remove the
// textfield from the form
if (++holeNumber > MAX_HOLES)
{
fmMain.delete(indxTextField);
return;
}
// Change the label & reset contents
tfScore.setLabel("Enter score for Hole #" + holeNumber);
tfScore.setString("");
}
catch (Exception e)
{
System.err.println("Msg: " + e.toString());
}
}
}
}
/*--------------------------------------------------
* Send client request. Receive server response
*
* Client: Send score for next hole.
*
* Server: Check for custom header 'Custom-newURL'
* If found, update the MIDlet URL for all
* future requests. Any data returned is
* current total for all scores entered.
*-------------------------------------------------*/
private void updateTotal(String score) throws IOException
{
HttpConnection http = null;
InputStream iStrm = null;
boolean ret = false;
try
{
// When using GET, append data onto the url
String completeURL = url + "?" + "score=" + score;
http = (HttpConnection) Connector.open(completeURL);
//----------------
// Client Request
//----------------
// 1) Send request method
http.setRequestMethod(HttpConnection.GET);
// 2) Send header information - none
// If you experience connection/IO problems, try
// removing the comment from the following line
//http.setRequestProperty("Connection", "close");
// 3) Send body/data - data is at the end of URL
//----------------
// Server Response
//----------------
iStrm = http.openInputStream();
// 1) Get status Line - ignore for now
// System.out.println("Msg: " + http.getResponseMessage());
// System.out.println("Code: " + http.getResponseCode());
// 2) Get header information
// See if header includes a rewritten url
// if yes, update url for all future servlet requests
String URLwithID = http.getHeaderField("Custom-newURL");
if (URLwithID != null)
url = URLwithID;
// 3) Get body/data - the new running total is returned
String str;
int length = (int) http.getLength();
if (length != -1)
{
byte servletData[] = new byte[length];
iStrm.read(servletData);
str = new String(servletData);
}
else // Length not available...
{
ByteArrayOutputStream bStrm = new ByteArrayOutputStream();
int ch;
while ((ch = iStrm.read()) != -1)
bStrm.write(ch);
str = new String(bStrm.toByteArray());
bStrm.close();
}
// Update the stringitem that shows total
siTotal.setText(str);
}
finally
{
// Clean up
if (iStrm != null)
iStrm.close();
if (http != null)
http.close();
}
}
}
/*--------------------------------------------------
* Url_rewriteServlet.java
*
* Use url-rewriting to manage sessions.
* Keeps a running total of golf scores for a
* round of 18 holes (client sends score for each
* hole, one at a time).
*
* Example from the book: Core J2ME Technology
* Copyright John W. Muchow http://www.CoreJ2ME.com
* You may use/modify for any non-commercial purpose
*-------------------------------------------------*/
//package corej2me; // Required for mycgiserver.com
import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Url_rewriteServlet extends HttpServlet
{
/*--------------------------------------------------
* Initialize the servlet
*-------------------------------------------------*/
public void init(ServletConfig config) throws ServletException
{
super.init(config);
}
/*--------------------------------------------------
* Handle a GET request from client
*-------------------------------------------------*/
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
try
{
// Get session information
HttpSession session = req.getSession(true);
// If a new session, we need to rewrite the URL for client
if (session.isNew())
{
// Get the URL that got us here
String incomingURL = HttpUtils.getRequestURL(req).toString();
// Encode by adding session ID onto URL
String URLwithID = res.encodeURL(incomingURL);
// Send back a header to client with new re-written URL
res.setHeader("Custom-newURL", URLwithID);
}
// Get the next score (parameter) passed in
int nextScore = Integer.parseInt(req.getParameter("score"));
// Get the ongoing total saved as part of the session
// Convert to an integer "object"
Integer sessionTotal = (Integer) session.getValue("sessionTotal");
// Running total from session and score passed in
int runningTotal = nextScore;
if (sessionTotal != null)
runningTotal += sessionTotal.intValue();
// Update the session total, must save as an "object"
session.putValue("sessionTotal", new Integer(runningTotal));
// Send back to client the new running total
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
out.write(Integer.toString(runningTotal));
out.close();
}
catch (Exception e)
{
System.err.println("Msg: " + e.toString());
}
}
/*--------------------------------------------------
* Information about servlet
*-------------------------------------------------*/
public String getServletInfo()
{
return "Url_rewriteServlet 1.0 - John W. Muchow - www.corej2me.com";
}
}
|