Платформа J2Me - Автор неизвестен
Шрифт:
Интервал:
Закладка:
*/
public class ConnectionDemo extends MID-лет
}
private static ConnectionDemo instance;
private URIEntry urlForm; public ConnectionDemo()
super(); instance = this; }
/**
Возвращает один экземпляр класса.
Вызов этого метода до создания объекта возвращает нулевой указатель.
@возвращаем экземпляр данного класса,
public static ConnectionDemo getlnstance ()
return instance;
}
public void startApp()
Display display;
URIEntry urlForm = URIEntry.getlnstance();
display = Display.getDisplay(this); display.setCurrentlurlForm);
}
public void pauseApp()
}
}
void quit ()
destroyApp(true); notifyDestroyed();
}
public void destroyApp(boolean destroy)
{
instance = null;
/**
Устанавливает данный объект в качестве текущего отображаемого объекта MID- лета.
*/
public void display()
Display.getDisplay(this). setCurrent(urlForm);
}
}
Листинг 8.2. Класс URIEntry описывает форму, которая приглашает пользователя ввести URI
import: javax.micrcedition.midlet.MIDlet;
import javax.microedition.Icdui.Command;
import javax.microedition.Icdui.CommandListener;
import javax.raicroedition.Icdui.Display;
import javax.microedition.Icdui.Displayable;
import javax.microedition.Icdui.Form;
import javax.microedition.Icdui.TextField;
/**
Этот класс задает Form, приглашающую пользователя ввести URI, с которым должно быть установлено соединение HTTP.
Пользователь вводит URI и нажимает командную кнопку «Go».
Экземпляр данного класса затем создает экземпляр класса ResourceDisplay, который выполняет обязанности извлечения ресурса HTTP и его отображения.
*/
public class URIEntry extends Form implements CommandListener
}
private static Command go =
new Command("Go", Command.SCREEN, 1);
private static Command exit =
new CommandCExit", Command. EXIT, 1);
private static URIEntry instance;
// URI, введенный пользователем, private TextField uri;
// Нить, контролирующая выполнение объекта
// ResourceDisplay. private Thread thread;
/**
Конструктор.
@param title заголовок Form.
*/
private URIEntry(String title)
}
super(title); instance = this;
uri = new TextField. ("Connect to: ",
null, 70,
TextField.URL); uri.setStringf'http://"); append (uri);
addCommand(go); addCommand(exit); setCommandListener(this);
}
/**
Выдает один экземпляр данного класса.
@возвращение экземпляра данного класса.
*/
public static URIEntry getlnstance ()
}
if (instance == null)
{
instance = new URIEntry("Enter URL");
}
return instance;
}
/**
Устанавливает этот объект в качестве текущего отображаемого объекта MID-лета.
*/
public void display()
MIDlet га = ConnectionDemo.getInstance();
Display.getDisplay(m). setCurrent(this);
}
public void commandAction(Command c, Displayable d)
}
if (c == go)
}
// Этот экран отображает метаинформацию ресурса,
// указанного с помощью URI.
ResourceDisplay view =
new ResourceDisplay(uri.getString());
MIDlet m = ConnectionDemo.getInstar.ee ();
Display.getDisplay(m). setCurrent(view);
thread = new Thread(view); thread.start();
}
else if (c == eit)
}
ConnectionDemo.getlnstance(). quit();
}
}
}
Листинг 8.3. Класс ResourceDisplay определяет форму, которая отображает ресурс. Он использует объект helper для получения этого ресурса
import javdx.microedition.lcdui.Command;
import javax.microedition.Icdui.CommandListener;
import javax.microedition.Icdui.Form;
import javax.microedition.Icdui.Displayable;
/**
Данный класс задает Form, которая отображает метаинформацию, описывающую HTTP-ресурс. Она контролируется отдельной нитью, поэтому она реализует Runnable.
Этот объект Form использует объект helper для коммуникации с HTTP-ресурсом через Connection. Он затем забирает данные соединения из объекта helper для отображения на экране для пользователя.
public class ResourceDisplay extends Form
implements CommandListener, Runnable
{
private static Command back =
new Command("Back", Command.BACK, 1);
private static Displayable instance;
// Объект helper создает соединение с ресурсом на исходном
// сервере и извлекает метаинформацию ресурса.
// private HttpResource resource;
Конструктор
Sparam uri URI ресурса для извлечения по запросу HTTP протокола.
*/
public ResourceDisplay(String uri)
{
super("Http Info");
instance = this;
resource = new HttpResource(uri);
addCommand(back);
setCommandListener(this);
}
/**
Запускает выполнение данного объекта: запускает объект helper HttpResource.
@смотри. rtpResource
*/
public void run()
{
resource.run();
append(resource.getResourceMetalnfo());
}
/**
Возвращает один экземпляр данного класса.
Вызов этого метода перед созданием объекта возвращает нулевой указатель.
@возвращаем экземпляр данного класса.
*/
public static Displayable getlnstance ()
{
return instance;
{
public void commandAction(Command c, Displayable d)
{
if (c == back)
{
URI Entry, get Instanced.display();
}
}
}
Листинг 8.4. Класс HttpResource определяет объект, который на самом деле извлекает сетевой ресурс
import Java.io.InputStream;
import Java.io.lOException;
import javax.microedition.io.Connect ion;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.Icdui.Displayable;
/**
Данный класс определяет объект helper, используемый классом ResourceDisplay. Он создает соединение с ресурсом HTTP, посылает запрос и получает ответ. Он размещает ответную метаинформацию в буфере. Этот класс предоставляет метод, который дает возможность другому объекту получать эту информацию как объект String асинхронно. Этот класс также записывает результат диагностики в стандартный вывод с целью демонстрации.
Результат появится в окне эмулятора J2MEWTK.
Обратите внимание, что этот класс реализует Runnable.
Он может использоваться программой для выполнения работы асинхронно, контролируемый нитью, отличной от основной нити приложения. В данной демонстрации соединения отдельная нить не порождает подпроцесс контролирования данного экземпляра, поскольку экземпляр ResourceDisplay, который использует данный экземпляр, уже контролирует отдельная нить.
**/
public class HttpResource implements Runnable
private static Displayable instance;
// URI, представляющий выбранный ресурс.
private String uri;
// Буфер для поддержки информации ресурса.
private StringBuffer contents = new StringBuffer();
// Соединение с ресурсом. private Connection conn;
// Ссылка на HTTP-соединение, private HttpConnection httpConn;
// Входной поток соединения, private InputStream is;
// Значение поля атрибута статуса HTTP. private int status = -1;
/**
Конструктор.
@pararc uri URI, указывающий выбранный ресурс.
*/
public HttpResource (String uri)
{
super ();
this.uri = uri;
}
private String userAgentID ()
{
StringBuffer buf = new StringBuffer();
String config =
System.get Property("microedition.configuration");
String profile =
System.get Property("microedition.profiles");
buf.append("Configuration/"); buf.append(config); buf.append!" Profile/");
buf.append(profile); return buf. toStrir.g ();)
/**
Запускает данный объект. Соединяется с URI, посылает запрос, получает отклик и анализирует ответное сообщение.
*/
public void run()
System.out.println("Connection class name = " + conn.getClass(). getName ());
connect (); parse ();
System.out.println(gecResourceMetalnfo());
try conn.close();
}
catch (lOException ioe) System.out.println(ioe.getMessage());
ioe.printStackTrace();
}
}
/**
Соединяется с исходным сервером, который поддерживает URI.
Если произошло исключение во время соединения, этот метод Перехватит его и не выдаст указания на ошибку, за исключением Записи в стандартном результате диагностики.
*/
protected void connect!)
}
try
}
while (true)
{
// Соединение находится в состоянии «установка». conn = Connector.open(uri);
httpConn = (HttpConnection) conn;
httpConn.setRequestProperty("method", HttpConnection.HEAD);
httpConn.setRequestProperty("User-Agent", userAgentID());
// Соединение находится в состоянии «установлено». if (resourceRelocated())
{
uri = httpConn.getHeaderField("location");
// Соединение находится в состоянии «отключено» после
// вызова close().
conn.close();
}
else
}
breaX;
*/
if (serverError())
{
conn.close (); return;
}
// Соединение находится в состоянии «установлено», is = httpConn.openlnputStream ();
System.out.println("Input stream class name = " + is.getClassO.get Name ());
int responseCode = httpCcnn.getResponseCode ();
printResponseCode (responseCode); catch (lOExceptior. ioe)
{
contents.append(ioe.getMessage());
System.out.println(ioe.getMessage());
ioe.printStackTrace();
}
}
private boolean resourceRelocated()
{
boolean relocated = false; try
}
status = httpConn.getResponseCode();
if (status == HttpConnection.HTTP_MOVED_TEMP II
status == HttpConnection.HTTP_MOVED_PERM II
status == HttpConnection.HTTP_TEMP_REDIRECT)
{
relocated = true;
}
}
catch (lOException ioe)
}
System.out.println(ioe.getMessage());
ioe.printStackTrace();
}
return relocated;
}
private boolean serverError ()
{
boolean error = false;