知っていることだけ

勉強していて役に立つ、理解の助けになるようなポイントを書いていきます。

JSPの基本コード

JSP基礎知識

  • HTMLの中にJavaコードを記述する。HTML部分とJava部分を分けることで管理しやすくしている。Javaのprintlnを使ってHTMLを出力するよりも、HTML感が出るので楽。
  • jspファイルはhtmlファイルと同じように扱う

JSPタグの使い分け

  • <%@ JSPの宣言 %>
  • <% コードを実行 %>
  • <%= 出力 %>
  • <%! 変数やメソッドの宣言 %>
  • <%-- コメント --%>

xmlでURLの紐づけ

xmlファイルに

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0" metadata-complete="true">

<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>

とすればよい。これでURLが作られ、jspファイル中でhref = "hello"などと使える。

補足説明

Servletコンパイル

クラス名を使ったことからわかるように、事前に

$ javac -classpath "../../lib/servlet-api.jar" -d WEB-INF/classes HelloWorld.java

を書く

補足説明

JSPを呼び出すservlet

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Walk extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{

String player = "勇者";
request.setAttribute("name", player);

String view = "/WEB-INF/views/action.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(view);
dispatcher.forward(request, response);
}
}

補足説明

  • HttpServlet : Servletの基本クラス
  • doGet(HttpServletRequest request, HttpServletResponse response) : get methodで呼び出したときに実行されるメソッド
  • request.getRequestDispatchar("jspファイル名") : RequestDispatcherが作られる。
  • dispatcher.forward(request, response); : request.getRequestDispatcharで指定したファイルへ飛ぶ
  • request.setAttribute(キー, 値); : requestに値を格納
  • 他にも、request.getParameter("名前"); : get/postで送られてきたデータのうちname = 名前のデータを返す、がある

JDBCでデータベースを操作

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ExecuteSqlServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

String url = "jdbc:mysql://localhost/mydb";
String user = "root";
String password = "";

try {
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}

try (Connection connection = DriverManager.getConnection(url, user, password);
PreparedStatement statment = connection.prepareStatement("SQL文を入れる")) {
int number = statment.executeUpdate();//好きな処理。今回は何の意味もなくSQLを更新.

} catch (Exception e) {
request.setAttribute("exception", "Execute exception:" + e.getMessage());
}

String forward = "/show";
RequestDispatcher dispatcher = request.getRequestDispatcher(forward);
dispatcher.forward(request, response);
}
}

補足説明

  • データベースとの接続部分
     try (Connection connection = DriverManager.getConnection(データベースのURL,user名, password);
    PreparedStatement statment = connection.prepareStatement("SQL文を入れる"))
  • try{}の中ではデータを用いた処理が行える。HashMapのリストに代入する場合の例を下記に記す。
     ArrayList<HashMap<String, String>> rows = new ArrayList<HashMap<String, String>>();//HashMapのリストを用意。

    while (results.next()) {//データが残っていたら
    HashMap<String, String> columns = new HashMap<String, String>();//HaspMapを用意して

    String id = results.getString("id");//"id"という名前で送られてきたデータをidに代入
    columns.put("id", id);

    String title = results.getString("title");
    columns.put("title", title);

    String content = results.getString("content");
    columns.put("content", content);

    rows.add(columns);//リストに加えていく
    }

    request.setAttribute("rows", rows);
  • SQL文に変数を渡したいときはtry部分を下記に変更
    String sql = "UPDATE posts SET title = ?, content = ? WHERE id = ?";
    try (Connection connection = DriverManager.getConnection(url, user, password);
    PreparedStatement statment = connection.prepareStatement(sql)) {

    statment.setString(1, title);//1つ目の?には変数<String>titleを入れる
    statment.setString(2, content);
    statment.setInt(3, postId);
    int number = statment.executeUpdate();//SQL更新

    }