Апплет - Servlet Communication - PullRequest
       27

Апплет - Servlet Communication

2 голосов
/ 21 июля 2011

Я отказался от своих предыдущих попыток заставить апплет напрямую взаимодействовать с базой данных, хотя пользователи и веб-страницы говорили, что это возможно. Сейчас я пытаюсь заставить мой апплет передать информацию (в виде строки и логического формата), введенную в текстовые поля или отмеченную флажками, и передать ее сервлету, который затем соответствующим образом сохраняет ее в базе данных. У меня есть интерфейс апплета - встроенный графический интерфейс и соединение сервлетов - с базой данных. Единственная проблема - связь между ними, апплетом и сервлетом. Как передать данные String из апплета в сервлет?

Спасибо, Джозеф Г.

Ответы [ 2 ]

2 голосов
/ 21 июля 2011

Прежде всего, вы должны признать, что вы можете общаться только с сервером, с которого был загружен ваш апплет, включая номер порта, если вы не хотите возиться с разрешениями, подписанием апплета и всей этой малярией.Это также не просто ограничение апплета, это относится и к Flash и JavaScript (хотя в случае с JavaScript есть способы обойти это).

Использование либо getCodeBase (), либо getDocumentBase() "метод вашего апплета получит вам URL, из которого вы можете получить компоненты, необходимые для создания нового URL, который позволит вам вызывать сервлет.

Таким образом, ваш апплет должен обслуживаться изтот же сервер, на котором размещен ваш сервлет.

например, если ваш апплет находится на следующей странице:

http://www.example.com/myapplet.html

... это означает, что вы можете звонить на любой URL, который начинается с

http://www.example.com/

... сравнительно легко.

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

URL codeBase = getCodeBase();
URL servletURL = new URL(codeBase.getProtocol(), codeBase.getHost(), codeBase.getPort(), "/myServlet");

// assumes protocol is http, could be https
HttpURLConnection conn = (HttpURLConnection)servletURL.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");

PrintWriter out = new PrintWriter(conn.openOutputStream());
out.println("hello world");
out.close();

System.out.println(conn.getResponseCode());

Затем в вашем сервлете вы можете получить текст, отправленный путем переопределения doPost () и чтения потока ввода из запроса.(обработка исключений не показана, и она читает только первую строку ввода):

public void doPost(HttpServletRequest req, HttpServletResponse res) {

   BufferedReader reader = req.getReader();
   String line = reader.readLine();
   System.out.println("servlet received text: " + line);

}

Конечно, это только один подход.Вы также можете взять свои входные данные и создать строку запроса, подобную этой (URLEncoding не показан):

String queryString = "inputa=" + view.getInputA() + "&inputb=" + view.getInputB();

и добавить это к вашему URL:

URL servletURL = new URL(codeBase.getProtocol(), codeBase.getHost(), codeBase.getPort(), "/myServlet?" + queryString);

Однако, это выглядит довольноВ наши дни принято создавать некие строки и передавать их сервлету.

Рекомендованным форматом будет JSON, поскольку он полуструктурирован, при этом его легко читать, и существует множество (де) сериализаторов, которые должны работать в вашем апплете и в вашем сервлете.Это означает, что у вас может быть хорошая объектная модель для ваших данных, которую вы могли бы разделить между вашим апплетом и сервлетом.Построение строки запроса сложных входных данных может привести к потере сознания.

Аналогично, вы могли бы фактически использовать сериализацию Java и передавать двоичный файл в ваш сервлет, который затем использует сериализацию Java для создания соответствующих объектов Java.Однако, если вы будете придерживаться чего-то вроде JSON, это будет означать, что ваш сервлет более открыт для повторного использования, поскольку сериализация Java никогда не была реализована вне Java (о чем я знаю).

1 голос
/ 21 июля 2011

Хм, я думаю, что апплет и сервлет работают в двух отдельных процессах Java.В этом случае вам придется использовать некоторую технологию удаленного взаимодействия, например, http-вызов localhost.Фактически, именно для этого и используются сервлеты: принимать и обрабатывать http-запросы.

...