Запрос базы данных MySQL из элемента Canvas? - PullRequest
0 голосов
/ 22 октября 2011

Хорошо. Итак, я хотел бы попытаться найти лучший способ сделать простую 2D-игру, которая запускается в браузере. Я посмотрел на HTML5 и элемент Canvas. Похоже, вы используете JavaScript, и я читал, что вы не можете подключиться к базе данных MySQL из JavaScript, поэтому подключение из элемента Canvas, который использует JavaScript, похоже, выходит за рамки.

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

private static URLConnection getServletConnection()
        throws MalformedURLException, IOException {
    URLConnection connection;

    // Open the servlet connection
    URL urlServlet = new URL("http://localhost:8080/examples/servlets/test_servlet");
    connection = urlServlet.openConnection();

    // Config
    connection.setDoInput(true);
    connection.setDoOutput(true);

    connection.setUseCaches (false);
    connection.setDefaultUseCaches (false);

    connection.setRequestProperty(
            "Content-Type",
            "application/x-java-serialized-object");

    return connection;
}

private static void onSendData() {
    try {
        URLConnection connection;

        // get input data for sending
        String input = "Applet string heading for servlet";

        // send data to the servlet
        connection = getServletConnection();
        OutputStream outstream = connection.getOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(outstream);
        oos.writeObject(input);
        oos.flush();
        oos.close();

        // receive result from servlet
        InputStream instr = connection.getInputStream();
        ObjectInputStream inputFromServlet = new ObjectInputStream(instr);
        String result = (String) inputFromServlet.readObject();
        inputFromServlet.close();
        instr.close();

        // show result
        //textField.setText(result);
        System.out.println(result);

    } catch (java.net.MalformedURLException mue) {
        //textField.setText("Invalid serlvetUrl, error: " + mue.getMessage());
        System.out.println("Invalid serlvetUrl, error: " + mue.getMessage());
    } catch (java.io.IOException ioe) {
        //textField.setText("Couldn't open a URLConnection, error: " + ioe.getMessage());
        System.out.println("Couldn't open a URLConnection, error: " + ioe.getMessage());
    } catch (Exception e) {
        //textField.setText("Exception caught, error: " + e.getMessage());
        System.out.println("Exception caught, error: " + e.getMessage());
    }
}

Мой сервлет содержит следующий код:

public class test_servlet extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
response.setContentType("text/html;charset=ISO-8859-1");
PrintWriter out = response.getWriter();
String defect = request.getParameter("defect").toString();

try {
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Servlet</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("<h1>Servlet at " + request.getContextPath() + "</h1>");
    out.println("<p>Defect: " + defect + "</p>");
    out.println("</body>");
    out.println("</html>");
} finally {
    out.close();
}
}

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

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

try {
    response.setContentType("application/x-java-serialized-object");

    InputStream in = request.getInputStream();
    ObjectInputStream inputFromApplet = new ObjectInputStream(in);

    String servletText = "Text from Servlet";

    // echo it to the applet
    OutputStream outstr = response.getOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(outstr);
    oos.writeObject(servletText);
    oos.flush();
    oos.close();

} catch (Exception e) {
    e.printStackTrace();
}

processRequest(request, response);
}

Это дает мне сообщение «Не удалось открыть URLConnection, ошибка: http://localhost:8080/examples/servlets/test_servlet"», когда я пытаюсь скомпилировать апплет в Eclipse. Я предполагаю, что это, вероятно, связано с тем, как / где я сохранил свой Файл сервлета. Я просто выбросил его в папку examples / servlet. Это все очень сбивает меня с толку, и я пытаюсь выяснить связь с сервлетом <-> в Апплете и как именно это заставить работать. Я смотрел на другие сообщения, и они получили меня так далеко.

1 Ответ

1 голос
/ 22 октября 2011
URL urlServlet = new URL("http://localhost:8080/examples/servlets/test_servlet");
connection = urlServlet.openConnection();

Не создавайте URL-адрес таким образом.Вместо этого используйте что-то вроде ..

URL urlServlet = new URL(getDocumentBase(), "../servlets/test_servlet");
connection = urlServlet.openConnection();

Это предполагает, что апплет находится в каталоге, который находится в том же каталоге, что и каталог examples.

...