Jsp(Html)からServlet呼び出し(データ渡し)
Servletの呼び出すにはGetとPostの二種類があります。
Get | : | 単体で手軽に呼び出せる。ブラウザからUrlを直打ちしたときやHtmlのリンクなど。 |
Post | : | 呼び出し用のWeb画面が必要。ログイン画面、各種入力画面などで使用。 |
■サーブレットのGet
まずはサーブレットのGetからやっていきます。Eclipseでサーブレットを作成すると基本部分のソースは自動生成してくれます。
サーブレットの作成については別の場所に書いたのでそちらを参照して下さい。
→「アプリケーション(Web)サーバをWindowsで使う」の「EclipseでServlet作成」
TestG.java
package test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/TestGet")
public class TestG extends HttpServlet {
private static final long serialVersionUID = 1L;
public TestG() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF8");
response.setContentType("text/html; charset=UTF8");
response.getWriter().append("get1:").append(request.getParameter("aaa"));
response.getWriter().append("<BR>");
response.getWriter().append("get2:").append(request.getParameter("bbb"));
}
}
@WebServlet("/TestGet")の/TestGetがURLの指定になります。
昔はweb.xmlにURLの指定を記述していましたが、Servlet3.0(Tomcat 7)からこの指定ができるようになりました。
Getでアクセスされた場合は、doGetメソッドが呼ばれます。パラメータが指定された場合は、HttpServletRequestのgetParameterメソッドで 指定された値を取得するとこができます。
文字化け対策にデータ取得前に request.setCharacterEncoding("UTF8"); を実行して下さい
Getの呼び出し
Getはブラウザから直接アクセスできます。
http://localhost:8080/test/TestGet?aaa=パラメータも&bbb=受け取れるよ
ブラウザ表示
Jsp(Html)から呼び出す場合は、リンクを張るか、ボタンクリック時などJavascriptでページを遷移させます。
呼び出し元のJsp
test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ServletのGet</title>
<script type="text/javascript">
function exec() {
location.href = "/test/TestGet?aaa="
+ document.getElementById("aaa").value + "&bbb="
+ document.getElementById("bbb").value;
}
</script>
</head>
<body>
<a href="/test/TestGet?aaa=パラメータも&bbb=受け取れるよ">リンクはこちら</a>
<br />
<br /> Javascriptはこちら
<br />
<input type="text" id="aaa" />
<input type="text" id="bbb" />
<input type="button" value="実行" onclick="exec()">
</body>
</html>
ブラウザ表示
リンクをクリックしてもボタンを押してもどちらでもGetが呼び出されます。
■サーブレットのPost
TestP.java
package test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/TestP")
public class TestP extends HttpServlet {
private static final long serialVersionUID = 1L;
public TestP() {
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF8");
response.setContentType("text/html; charset=UTF8");
response.getWriter().append("post1:").append(request.getParameter("aaa"));
response.getWriter().append("<BR />");
response.getWriter().append("post2:").append(request.getParameter("bbb"));
}
}
@WebServlet("/TestP")の/TestPがURLの指定になります。
こちらもweb.xmlの記述は必要ありません。
Postでアクセスされた場合は、doPostメソッドが呼ばれます。パラメータが指定された場合は、HttpServletRequestのgetParameterメソッドで
指定された値を取得するとこができます。
文字化け対策にデータ取得前に request.setCharacterEncoding("UTF8"); を実行して下さい
Submitボタンでサーブレット呼び出し
test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ServletのPost</title>
</head>
<body>
<form action="/test/TestP" method="post">
Postで送信
<br />
<input type="text" name="aaa" />
<br />
<input type="text" name="bbb" />
<br />
<input type="submit" value="実行" />
</form>
</body>
</html>
formのactionでURLを指定し、methodにpostを指定します。この時、頭にプロジェクトを付けないと該当URLなしのエラーになるので注意です。
実行時は inputタグの type="submit" で実行します。
JavaScriptのメソッドでサーブレット呼び出し
test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ServletのPost</title>
<script type="text/javascript">
function exec() {
document.getElementById("fm").submit();
}
</script>
</head>
<body>
<form id="fm" action="/test/TestP" method="post">
Postで送信(Javascript)
<br />
<input type="text" name="aaa" />
<br />
<input type="text" name="bbb" />
<br />
<input type=button value="実行" onclick="exec()"/>
</form>
</body>
</html>
■同じ項目名が複数存在する場合
同じ項目名が複数存在する場合、サーブレット側では配列で受け取ります。getParameterメソッドの代わりにgetParameterValuesメソッドを使用します。
※項目が一つでもgetParameterValuesメソッドを使用すれば、サイズ1の配列で受け取れます。
package test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/TestP")
public class TestP extends HttpServlet {
private static final long serialVersionUID = 1L;
public TestP() {
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF8");
response.setContentType("text/html; charset=UTF8");
String[] strs = request.getParameterValues("aaa");
response.getWriter().append("post1:").append(strs[0]);
response.getWriter().append("<BR />");
response.getWriter().append("post2:").append(strs[1]);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ServletのPost</title>
</head>
<body>
<form action="/test/TestP" method="post">
Postで送信
<br />
<input type="text" name="aaa" />
<br />
<input type="text" name="aaa" />
<br />
<input type="submit" value="実行" />
</form>
</body>
</html>
■プロジェクト名の省略
ファイル名の前にプロジェクト名(コンテキストパス)を指定しますが、Eclipseでプロジェクト名を変えた場合など動作しなくなります。request.getContextPath()を使用することにより、プロジェクト名の指定が必要なくなります。
<form action="/test/TestP" method="post">
↓
<form action="<%=request.getContextPath()%>/TestP" method="post">
ページのトップへ戻る