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"などと使える。
補足説明
- この部分は2019/02/23現在知識不足
<?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"> - クラスとURLの紐づけ部分
<servlet>
<servlet-name>Hello</servlet-name><!--好きな名前を付ける-->
<servlet-class>HelloWorld</servlet-class><!--対象のクラス名(ファイル名かも)-->
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern><!--URLを紐づけ-->
</servlet-mapping>
Servletのコンパイル
クラス名を使ったことからわかるように、事前に
$ javac -classpath "../../lib/servlet-api.jar" -d WEB-INF/classes HelloWorld.java
を書く
補足説明
- "../../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更新
}