WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Как перенаправить аплет на новый URL?

Как перенаправить аплет на новый URL?


Дата публикации: 17-03-2013

Предложение от Cliff Berg

Нормальный путь Java:
String url = new URL("http://www.digitalfocus.com");
applet.showDocument(url, "MY_NETSCAPE_FRAME");

Но в Netscape 2 и в Netscape 3 beta 4 этот пример не работает если пользователь покинет страницу с аплетом - даже, если у него останется фрейм с Java-ой.

Вот пример на javascript:
import netscape.javascript.*;

JSObject win = JSObject.getWindow(applet);
String url = new URL("http://www.digitalfocus.com");
win.eval("open(\"" + url + "\",\"" + "MY_NETSCAPE_FRAME" + "\")");

Предложение от Jeff Breidenbach

Вы можете использовать такой код:
getAppletContext().showDocument(newplace);

Где newplace это URL нового места, куда необходиме перенаправить браузер.

Предложение от William S. Clark

/*** Load URL.*/
public boolean loadUrl() {
urlLoaded = true; // well, tried to load anyway
if (url == null)
return false;
dbg("loadUrl()");
// use showDocument() to display new URL.
// Note: Netscape 2.0b2 problems here... I don't really understand how
// to catch errors from showDocument()!
try {
getAppletContext().showDocument(url);
}
catch (Exception e) {
if (url.getRef() == null) {
errMessage = "Couldn't load url. Try to re-start Netscape :-(";
}
else {
errMessage = "Couldn't load url: " + url.getRef();
}
return false;
}
return true;
}

2.Как послать запрос HTTP серверу на объект и обработать содержимое
его ответа как HTML или любым другим типом?

Предложение от Daryoush Mehrtash

Вот сегмент кода, который у меня работает:
// Open the URL and display it as a new page
try {
String NLinkname = "http://home.netscape.com";
URL NLink = new URL(NLinkname);
MYAPPLET.getAppletContext().showDocument(NLink);
}
catch(java.net.MalformedURLException e) {
System.out.println("Malformed URL!!!! exception");
}

3.Как могут два аплета общатся друг с другом на одной страничке?

Предложение от Seokkyu Kong

Ниже два способа решить эту проблему:

Applet1:

import java.awt.*;
import java.applet.*;

public class Applet1 extends java.applet.Applet{
public boolean handleEvent(Event evt){
Applet buddy=(Applet)getAppletContext().getApplet("buddy");
return (buddy!=null) ? buddy.handleEvent(evt):false;
}
}
Applet2:
import java.awt.*;
public class Applet2 extends java.applet.Applet{
String str="";
public boolean handleEvent(Event evt){
str=evt.toString();
repaint();
return true;
}
public void paint(Graphics g){
g.drawString(str, 0, size().height * 2 / 3);
}
}
и
test1.html:


Test





Другое решение
Applet3:

import java.awt.*;
import java.applet.*;

class Applet2 extends Applet{
public boolean handleEvent(Event evt){
return true;
}
}

public class Applet3 extends java.applet.Applet{
public boolean handleEvent(Event evt){
Applet2 buddy=(Applet2)getAppletContext().getApplet("buddy");
return (buddy != null) ? buddy.handleEvent(evt):false;
}
}
и Applet2 такой же,
test2.html:


Test





Предложение от Bill Giel

/* Very simple inter-applet communication demo
* for any number of applets.
* by Bill Giel, rvdi@usa.nai.net
* http://www.nai.net/~rvdi/home.htm
*
*
*
* Inter-Applet Test
*
*
*
*
*
*
*
*
* This example uses three applets of the same class, but the
* technique could be applied to different applets that shared
* a common class containing static members to share data among
* the different applets.
*
*/


import java.awt.*;
import java.applet.*;

public class interapp extends Applet implements Runnable
{
/////////////////////////////////////////////
// Static members are common in value to all
// instances.
/////////////////////////////////////////////
static final String BUTTON="Hit me!";

static String globalName = null;
static boolean globalHitFlag=false;
static int counter = 0;

/////////////////////////////////////
// These are unique in value for each
// instance.
/////////////////////////////////////
String instanceName=null;
boolean instanceHitFlag=false;
int width,height;
Thread appThread=null;

public void init()
{
Button button;

instanceName=new String("Hit on No. " + (counter + 1));
counter++;
add (button=new Button(BUTTON));
width=size().width; height=size().height;
button.move((width-button.size().width)/2,
(width-button.size().width)/2);
}

public boolean action(Event evt, Object arg)
{
if(arg.equals(BUTTON)){
globalName=instanceName;
globalHitFlag=!globalHitFlag;
return true;
}
else return false;
}

public void paint(Graphics g)
{
if(null != globalName){
FontMetrics fm=g.getFontMetrics();
int yPos=height/2;
int xPos=(width-fm.stringWidth(globalName))/2;

g.drawString( globalName,xPos,yPos);
}
}

public void run()
{
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
for(;;)
////////////////////////////////////////
// If the instance data no longer equals
// the global data, then there was a hit.
/////////////////////////////////////////
if(instanceHitFlag != globalHitFlag){
repaint();
instanceHitFlag=globalHitFlag;
}
}

public void start()
{
if(appThread == null){
appThread = new Thread(this);
appThread.start();
}
}

public void stop()
{
appThread.stop();
appThread=null;
}
}
Предложение от Albert M. Lopez

В этом примере Applet1 получает текст из textBox, а затем вызывает функцию appendText из Applet2. Applet2 добавляет этот текст в textArea.

// Applet1
import java.awt.*;

public class Applet1 extends java.applet.Applet {

TextField inputText;
Panel myPanel;

public void init() {

resize( 100, 100 );

setLayout(new BorderLayout());

add("South", myPanel = new Panel() );

GridBagLayout gridBag = new GridBagLayout();
GridBagConstraints con = new GridBagConstraints();
myPanel.setLayout( gridBag );

inputText = new TextField( "", 15 );
inputText.setEditable( true );
con.gridwidth = GridBagConstraints.REMAINDER; // end of row
gridBag.setConstraints( inputText, con ); // end of row
myPanel.add( inputText );

con.gridwidth = 1;
Button enterText = new Button( "Enter Text" );
myPanel.add ( enterText );
myPanel.enable();

}


public boolean action(Event ev, Object arg) {

if( ev.target instanceof Button)
{

String textMsg = inputText.getText().trim();
Applet2 applet2 = (Applet2)getAppletContext().getApplet("applet2");

if ( applet2 != null )
{
applet2.AppendText( textMsg );
return true;
}

else
return false;

}

return false;
}



//Applet2
import java.awt.*;

public class Applet2 extends java.applet.Applet {

TextArea textBox;
Panel myPanel;

public void init() {

resize ( 100, 100 );

setLayout(new BorderLayout());

add("South", myPanel = new Panel() );


textBox = new TextArea( 5, 40 );
myPanel.add( textBox );
myPanel.enable();

}


public void AppendText( String msg )

{
String newLine = new String( "\n" );
textBox.appendText( msg );
textBox.appendText( newLine );


}

}


Предложение от Matt Young

Из Lemay & Perkins, стр. 298:

for( Enumeration e = getAppletContext().getApplets(); e.hasMoreElements();) {
Applet current = (Applet)(e.nextElement());
f(current);
}
Где f это вызов функции.

Предложение от Friedhelm Ries

От elharo@sunsite.unc.edu (в его comp.lang.java.faq)http://sunsite.unc.edu/javafaq/javafaq.html:

"Сейчас аплеты могут соединятся между собой, если они находятся на одной странице. Если на разных, то такой возможности нет"

Для аплетов на одной странице он предлагает такой пример:

Applet 1:

import java.awt.*;
public class Applet1 extends java.applet.Applet {
public boolean handleEvent(Event evt) {
Applet2 buddy = (Applet2)getAppletContext().getApplet("buddy");
return (buddy != null) ? buddy.handleEvent(evt) : false;
}
}

Applet 2:

import java.awt.*;
public class Applet2 extends java.applet.Applet {
String str = "";
public boolean handleEvent(Event evt) {
str = evt.toString();
repaint();
return true;
}
public void paint(Graphics g) {
g.drawString(str, 0, size().height * 2 / 3);
}
}

HTML:









Это "мыслемый" путь заставить аплеты разговаривать с сервером, который находится где-то в Интернет и сохранять любые данные, которые необходимо сериализировать. Потом, когда другосу аплету понадобятся эти данные, он должен соединится с этим же сервером. Имплементация такого подхода не тривиальна. Впрочем в таком случае нет секурного пути для сохранения этих данных на клиенте.

4.Как получить HTML страницу и выцепить из нее только нужную фразу?

Предложение от Peter Ott

/* code snippet to grab a page from the httpd server
* and parse the returned info.
*/

...

/* build the URL */
String tmpURL = new String("http://www.foo.bar/junk.html");
URL infoLink = new URL(tmpURL);

/* start the connection with the httpd and talk */
InputStream serverIO = infoLink.openStream();
/* the stream doesn't need to be buffered, but
* it's what I used during testing */
BufferedInputStream bufServerIO = new BufferedInputStream(serverIO);

/* init the buffer that'll hold the info coming from the server */
StringBuffer oneLink = new StringBuffer();

/* setup some parsing variables */
int info;
char histchar1=' ',histchar2=' ';

/* do the deed - one character at a time.
* you can use read(byte b[], int off, int len) if you know
* how many characters you expect from the server.
*/
while((info=bufServerIO.read())!=-1)
{
oneLink.append((char)info); /* make note of the info */

/* Sample Parsing: Now I look for the "/UL" string
* parsing this way is ALOT faster than using oneLink.toString().indexOf("/UL")
*/
if(((char)info=='L')&&(histchar1=='U')&&
(histchar2=='/'))
{
/* do stuff with oneLink */
}
histchar2=histchar1;
histchar1=(char)info;
}

...

5.Как написать такой аплет, который мог бы запускаться и как приложение?

Предложение от Vivek Pabby

Следующий класс работает и как аплет и как приложение.

import java.awt.*;
import java.applet.*;

public class easyOne extends Applet
{
public void init() {
}
public void resize() {
resize(300,300);
}
public easyOne() {
setLayout(new BorderLayout());
Panel p1 = new Panel();
p1.setLayout(new FlowLayout());
add("South", p1);
p1.add(new Button("ButtonOne"));
p1.add(new Button("AnotherButton"));
}

public void paint(Graphics g) {
g.setColor(Color.cyan);
g.drawRect(10,10,150,150);
g.fillRect(10,10,150,150);
}

public static void main(String args[]) {
Frame f1 = new Frame("Standalone Application");
easyOne s1 = new easyOne();
f1.add("Center", s1);
f1.resize(300, 300);
f1.show();
s1.init();
s1.start();
}
}

6.Как прописать аплет находящийся на другом хосте?

Предложение от Steve Alexander

Путь для ссылки на аплеты расположенные на другом сервере лежит в использовании параметра "CODEBASE" в блоке описания аплета в html-файле. Это означает, что нет необходимости приводить полный URL аплета в параметре CODE, но его необходимо привести в параметре CODEBASE.

applet code="MyJavaApplet.class"
width = 300
height = 300
CODEBASE="http://www.mydomain.fun/appletdirectory/"
Это корректный синтаксис html для того, что бы загрузить с другого сервера аплет.

7.Как выводить HTML генерируемый аплетом?

Предложение от Cliff Berg

String myHTML = new String(
"javascript:'My Page

My Page

'");
getAppletContext().showDocument(new URL(myHTML));

8.Как отавить аплет выполнятся если пользователь ушел со страницы?

Предложение от David J. Bianco

Когда ваш браузер переходит на другую страницу, он вызывает метод вашего аплета stop(). Если вы перекроете его, вы можете оставить ваш аплет работающим в фоне, пока Netscape занимается другими вещами. Добавление нижеследующего в ваш клас должно сделать, то, что нужно:

public void stop() {
return;
}
Как можно увидеть, метод stop() в действительности ничего не делает. Он просто перекрывает метод по умолчанию, так, что Netscape не может остановить ваш аплет.

Этот метод наиболее хорош для использования если ваш аплет открывается в своем собственном фрейме. Но не забудте предоставить вашим пользователям другой способ для убиения вашего аплета . Так же необходимо помнить, что если этот аплет будет не в своем отдельном фрейме, то при переходе на другие страницы этот аплет будет так же оставаться работающим, что будет отнимать некоторое количество процессорного времени.

Будте осторожны с перекрытием метода stop().

9.Какую информацию можно получить из коружения аплета? Как получить текущее положение браузера?

Используйте Applet.getAppletContext(), Applet.getCodeBase(), и Applet.getDocumentBase().


10.Как заставить браузер с поддержкой Java перейти на страницу с аплетом, а браузер без нет?

Предложение отEric A. Zarko

Лучший способ сделать такое это использовать CGI script. Для примера:

#!/usr/local/bin/perl

use CGI; # CGI.pm See note below
$cgi = new CGI;

if(scalar(grep(/Macintosh/, $ENV{HTTP_USER_AGENT})) > 0) {
# Give them the no applet page
print $cgi->redirect('no-applet.html');
} else {
# Give them the applet page
print $cgi->redirect('applet.html');
}
exit(0);
Этот код подразумевает, что у вас уже есть perl и модуль CGI.pm от Lincoln Stein. Если же нет, то пиняйте на себя и забирайте их отсюдова: ftp://ftp.netlabs.com/pub/outgoing/perl5.0/ и http://www-genome.wi.mit.edu/ftp/pub/software/WWW/.

Предложение от Cliff Berg

Любые теги HTML помещенные между тегом applet и тегом конца аплета будут выполнятся, если браузер не поддерживает аплеты. Поэтому, этот не Java HTML может предоставлять данные для не Java браузеров. Аплет же в свою очередь может вызвать getAppletContext().showDocument(url), тем самым вызывая открытие другой страницы.


11.Как получить доступ из javascript к аплету под Netscape?

Предложение от Cliff Berg

Взято из собственных хелпов Netscape:














12.Как управлять документом в одном фрейме при помощи аплета в дургом?

Предложение от Hoa Ton-That

Вам нужно создать второй фрейм с именем:



Затем нужно использовать следующий код:
void moveFrame(String dest) {
URL destURL=null;

try {
destURL = new URL(dest);
} catch (MalformedURLException mal){
}

getAppletContext().showDocument(destURL,"target");
}

13.Как сделать аплет выполняющийся в фоновом режиме, без вывода чего либо на экран браузера?

Предложение от E. Will Brown

В теге аплета установите height=0 width=0.
Вот пример который помещает скроллируемый текст в строку состояния, но ничего не рисующий на самой сранице. Это работает (netscape 2.0 Solaris 2.4) но не очень здорово.

/* ScrollStatus.java emacs C++ mode: -*- C++ -*-

Optional parameters: message, width
Default values:
message = " Isn't scrolling text in the status line annoying? "
width = 36

Example usage:






*/

import java.util.*;
import java.applet.Applet;

public class ScrollStatus extends Applet implements Runnable {

Thread thread;
String message;
StringBuffer buffer;
int at;
int width;

public void init(){
message = getParameter("message");
if(message == null)
message = " Isn't scrolling text in the status line annoying? ";

String ws = getParameter("width");
if(ws == null) width = 36;
else{
width = Integer.valueOf(ws).intValue();
}
if(width 180)
width = 36;

buffer = new StringBuffer(width);
buffer.setLength(width);
at = 0;

if(message.length() < width){
char buf[] = new char[width];
for(int i = 0; i = l)
at = 0;

/*
This seems to work just as well (or poorly :(. I thought that it might be
creating a lot of strings for the GC to clean up though.
the "buffer" and "at" variable are not needed for this code.

String msg = message.substring(0, width-1);
getAppletContext().showStatus(msg);
msg = message.substring(1);
message = msg + message.charAt(0);
*/
}

public void run(){
while(true){
scroll();
try{
Thread.sleep(25); // wait 25 ms
}
catch(InterruptedException e){
break;
}
}
}
}
Предложение от Rob Whelan

Я в натуре нашел, что установка тегов аплета в width=0 и height=0 может создать искажение фонового изображения страницы. Лучшим способом сделать такую вещь это спрятать этот аплет. Если на странице мотонный фон, то его можно сделать размером в 1 пиксель такого же цвета. Я обычно решаю эту проблему путем иммитирования моим аплетом html горизонтальной линии (
). Используйте ваше воображение.


14.Как организовать интерфейс с DDE?

Предложение от Martin Higgins

Попробуй http://www.apc.net/neva/java/ имплементации сервера DDE через использование нативных методов. Не идеально, но я думаю, что это единственный путь.


15.Как работать с паролем и именем пользователя на сервере?

Предложение от Eric Zarko

Для этого нужно иметь страничку с аплетом в той же дирректории. Браузер спросит пользователя имя и пароль, когда он запросит эту страничку.


16.Как создать фрейм без надписи в низу фрейма?

Предложение от Matt Durham

(Редакторское замечание: Мы не рекомендуем программистам использовать эту технику.)

Сдесь описано, как я это делаю:

Сперва нужно установить флаг индицирующий, что эта вещь еще не показана.

В init():
Создаем фрейм, но не показываем его ( .show() ).
Создаем окно в этом фрейме и устанавливаем желательный размер.
Показываем .show() это окно, и добавляем "this" в него (пока не используем this.show()).
Ресайзим "this" до нечто равного или большего, чем это окно.
В run() или в handleEvent(): создаем вызов repaint()
В paint():

Проверяем, установлен ли наш флаг.
Если да, то this.show() и устанавливаем флаг в положение нет.
Здесь много различных возможностей сделать это. И не играет значения в какой последовательности шагов выполнять этот алгоритм. Фишка в том, что бы не показывать this.show() до тех пор, пока не покажется окно , и сделать это нужно не в init, а вызовом события в repaint во время работы WINDOW_EXPOSE.
Если вы измените размер окна, строка появится снова, до того, как вы скроете "this", измените размер окан и покажите "this" снова.

Если аплет прекратит свою работу, сообщение появится снова.

- Matt Durham, Feb. 13, 1997

А вот собственно и сам код:


import java.awt.*;

public class nowarn extends java.applet.Applet implements Runnable{

Frame framey;
Window winny;
Thread runny;
boolean startflag=true;

public void init(){
setBackground(Color.black);
framey=new Frame();
winny=new Window(framey);
winny.show();
this.resize(500,300);
winny.add(this);
this.move(0,0);
start();

}//end init

public void start(){
if(runny==null){
runny=new Thread(this);
runny.start();
}
run();
}//end start

public void stop(){

if(runny!=null){
runny.stop();
runny=null;
}
}//end stop

public void update(Graphics g){
paint(g);
}//end update

public void paint(Graphics g){

if(startflag){
winny.reshape(20,20,300,300);
this.show();
startflag=false;
}//endif: first time through only

}//end paint

public void run(){
while(true){
repaint();
try{runny.sleep(100);}
catch(InterruptedException e){}
}
}//end run

}//end nowarn
HTML:




Look, no warning...







Вот и все!
Домен продается

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Апрель 2024 (1)
Октябрь 2018 (14)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта



Случайная цитата

Неизвестный автор:

"Жизнь – как сидение в интернете: смысла нет, а уходить не хочется."

Опрос

Ваша ОС?

Windows XP
Windows 7
др. версия Windows
Linux
др. ОС