【JSP・Servlet】入力した日本語だけが文字化け

今回はinput.jsp→Control.java(サーブレット)→output.jspの流れのプログラムを作りました。
最初のinput.jspで入力した内容をControl.java経由で最後にoutput.jspで表示させる仕様です。

文字化けしてしまうプログラム

input.jsp(入力)

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
output.jsp(出力)

プログラムは次の通りです。

input.jsp

<%@ page language="java" contentType="text/html"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>名前入力</title>
</head>
<body>
	<form action="<%=request.getContextPath()%>/Control" method="post">
		<h2>名前を入力してください</h2>
		<input type="text" name="name"><br />
		<h2>出身地を入力してください</h2>
		<input type="text" name="Birthplace"><br />
		<h2>性別を選択してください</h2>
		<select name="gender">
			<option value="男性">男性</option>
			<option value="女性">女性</option>
			<option value="秘密">秘密</option>
		</select>
	<br/>
		 <input type="submit" value="送信">
	</form>
</body>
</html>

Control.java

package name;
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;
/**
 * Servlet implementation class Control
 */
@WebServlet("/Control")
public class Control extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String name = request.getParameter("name");
		String Birthplace = request.getParameter("Birthplace");
		String gender = request.getParameter("gender");
		request.setAttribute("name", name);
		request.setAttribute("Birthplace", Birthplace);
		request.setAttribute("gender", gender);
		request.getRequestDispatcher("/jsp/output.jsp").forward(request, response);
	}
}

output.jsp

<%@ page language="java"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>入力確認</h2>
<%response.setContentType("text/html; charset=UTF-8"); %>
こんにちは<%=request.getAttribute("name") %>さん<br/>
<%=request.getAttribute("Birthplace") %><br/>
<%=request.getAttribute("gender") %><br/>
入力が確認できました。<br/>
この情報を破棄します。<br/>
</body>
</html>

 
最初はjsp側でpageEncoding=“UTF-8が書いていなかったのかなと疑問に思っていましたが、入力を受け取る以外の文字はしっかりと日本語で表示されています。
ですので次にサーブレット側を修正してみました。
input.jspから日本語を受け取った後文字が化けてしまい、output.jspに正しく表示できませんでした。

修正後

Control.java(修正)

ピンク文字の部分を追加しました。

package name;
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;
/**
 * Servlet implementation class Control
 */
@WebServlet("/Control")
public class Control extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String name = request.getParameter("name");
		String Birthplace = request.getParameter("Birthplace");
		String gender = request.getParameter("gender");
		request.setAttribute("name", name);
		request.setAttribute("Birthplace", Birthplace);
		request.setAttribute("gender", gender);
		request.getRequestDispatcher("/jsp/output.jsp").forward(request, response);
	}
}

 

サーブレットに日本語で受け取れるようにプログラムをしたところ、しっかり表示できました。

©Copyright2022 FICH-LABO.All Rights Reserved.