質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

2038閲覧

文字が?で表示されてしまう

sena14

総合スコア109

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/06/15 22:23

下記のようにフォームのようなものを作りたいのですが送信ボタンを押した後も画面でお問い合わせタイトルと表示させたい場所に??????????と表示されてしまいます。文字コードの設定の仕方などが間違っているのでしょうか?
よろしくお願いします。

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>お問い合わせ</title> <link rel="icon" href="img/favicon.png"> <link rel="stylesheet" href="css/style.css"> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <div class="wrapper"> <object class ="header" type="text/html" data="header.html"></object> <main> <h1>お問い合わせ</h1> <form class="form" action="HelloServlet" method="POST"> <div> <label>お問い合わせ件名<br> <input type="text" name="subject" placeholder="お問い合わせ"></label> </div> <div> <input type="submit" name="submit" value="送信"> </div> </form> </main> <object class ="footer" type="text/html" data="footer.html"></object> </div> </body> </html>
import java.io.IOException; import java.io.PrintWriter; 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 HelloServlet */ @WebServlet("/HelloServlet") public class HelloServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public HelloServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().append("Served at: ").append(request.getContextPath()); request.setCharacterEncoding("UTF-8"); String subject = request.getParameter("subject"); response.setContentType("text/html; charset = UTF-8"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("お問い合わせタイトル:"+ subject); out.println("</body></html>"); out.close(); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); request.setCharacterEncoding("UTF-8"); String subject = request.getParameter("subject"); response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("お問い合わせタイトル:"+ subject); out.println("</body></html>"); out.close(); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/06/16 02:01 編集

最初のhtmlはjspなどではなく単なる(Tomcat上で実行されている)静的htmlなんですよね?
sena14

2018/06/16 02:18

静的htmlです。
m.ts10806

2018/06/16 02:22

htmlファイル自体の文字コードはutf8になっていますか?
sena14

2018/06/16 02:25

記載している通り、 <meta charset="utf-8">で設定しています。
sena14

2018/06/16 02:26

静的なものは文字化けしていないです。サーブレットで書いた部分だけが文字化けしてしまっているのでサーブレットのどこかに問題があるのかと思うのですが
退会済みユーザー

退会済みユーザー

2018/06/16 02:48

記述してないですよね meta charset
退会済みユーザー

退会済みユーザー

2018/06/16 02:49

※ レスポンスされるもの
sena14

2018/06/16 02:59

サーブレット内で書いているものということですよね?response.setContentType("text/html; charset=UTF-8");ここで設定できているつもりでいるのですが間違っていますか?
guest

回答2

0

ベストアンサー

やはりsetContentTypeの位置かと思います。

requestとresponseの文字コード設定はdoPost,doGet冒頭でするように習慣づけられたほうが間違いありません。

投稿2018/06/16 02:31

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sena14

2018/06/16 02:38

一応書籍のとおりにコードを書いているのですが書籍では正しく表示されるはずのものが文字化けしてしまいます。 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); response.setContentType("text/html; charset=utf-8"); request.setCharacterEncoding("UTF-8"); String subject = request.getParameter("subject"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("お問い合わせタイトル:"+ subject); out.println("</body></html>"); out.close(); } のように変更しても結果は同じでした。 冒頭という意味を取り間違えていますか?
m.ts10806

2018/06/16 02:42

doGet()実行が先に来てますよ。
m.ts10806

2018/06/16 02:43

それにdoGet()にそのまま投げるのでしたらdoPost()側のHTML出力は不要だと思います。
sena14

2018/06/16 02:43

ちなみに書籍だと"お問い合わせタイトル:"+ subjectのみが表示されているようですが、自分の場合Served at: /Sampleという表示も出てくるのですが何か関係していますか?
sena14

2018/06/16 02:45

doGet()を消したらできました。 自動で生成されたものだったので残しておいたのですが必要ないもの何ですか?
m.ts10806

2018/06/16 02:45

まあ response.getWriter() でその通り出力していますからね。出るのは当然です。 書籍参考はいいのですが、それぞれが何をやっているか理解してから書かれないと、自分がやりたいことをやろうとしたときに難しくなってきますよ。
m.ts10806

2018/06/16 02:50 編集

> 自動で生成されたものだったので残しておいたのですが必要ないもの何ですか? 場合によりです。 そもそもGET,POSTをきちんと理解したほうがいいかもしれません。 doGet(request, response); という記述はリクエストもレスポンスもdoPost()に渡されたものをそのままdoGet()に渡すような記述です。 例えば入力フォームも静的HTMLじゃなくサーブレットからjspなどを連携して作っている際にGETもPOSTも同じ画面を出力し、POSTの場合は入力内容のチェックを行ってエラーメッセージを出力する際に、doPost側からエラーメッセージのみjspに渡して画面出力はdoGet()に任せるような作りをすることもできます。 これはあくまで一例なので一概に「必要ないものだから消していい」わけではありません。 きちんと意図を以て使う、除くを切り分けてください。
sena14

2018/06/16 03:01 編集

なるほど。 今読んでいる参考書がmethod="POST"or"GET"でどちらが書かれているかで対応したものが呼ばれるという説明だったもので動的にGETとPOSTのどちらの可能性も考えられるというところまで考えが及んでいなかったです。勉強になります。 response.getWriter()で出力しているという件ですがresponse.getWriter()でoutに代入しているのは分かるのですが、doGet()を消すとServed at: /Sampleが消えるということからも、どこが表示するようなコードなのでしょうか出力先の文字列がページに表示される理由がわからなくて。
m.ts10806

2018/06/16 02:59

そうですねmethodがpostであれば送信された場合はdoPost getであればdoGet フォーム送信がない、単にページにアクセスされた場合はdoGetが呼ばれます。
m.ts10806

2018/06/16 03:04

> 出力先の文字列がページに表示される理由がわからなくて。 私のコメントに提示されたコードがそのままなら doPost()側にはそのServed atを出力するgetWriter()書いてないですよね。 その記述を書いているであろうdoGet()をdoPost()内で呼び出さないのであれば出力されないのは当然です。 画面出力、関数、というところ、あとサーブレットでの画面作成の基礎など一通りきちんと学んだほうがいいかと思います。 参考書籍がすべてではありません。 中にはネット上の記事の方がわかりやすく、的確である可能性もあります。 例: https://qiita.com/kazukichi/items/4325b64450f93f04e316 https://www.sejuku.net/blog/10496 書籍だけで詰め込んでしまうと、書籍にあること以外ができなくなります。 (いわゆる「写経」はプログラミングにおいてはほとんど成長のためになりません)
sena14

2018/06/16 03:12

"Served at:はdoGet()に書かれていたんですね。これも自動生成のため気づいていませんでした。 POSTを呼んでいるからとdoPostの中ばかり注目していました。 全てdoGet()を自動生成だからとまったく気にしていなかったことによる勘違いでした。 いろいろ納得できました。 doGet内のresponse.setContentType("text/html; charset = UTF-8");が呼ばれて文字列はちゃんと表示されるような気もするのですがそういうわけでもないんですね。
m.ts10806

2018/06/16 03:31

> "Served at:はdoGet()に書かれていたんですね。 sena14さんが提示されたコードをもとに話しているので他人事のように表現されると困りますね・・・。 > response.setContentType("text/html; charset = UTF-8");が呼ばれて文字列はちゃんと表示されるような気もするのですが 回答に提示した記事を確認されましたか? htmlからはPOSTでこのサーブレットが呼ばれているわけですから、doPostに入ります。 記事には > getWriterを呼び出す前に、charsetを指定しないと、defaultのISO-8859-1が設定されてしまう。 とありますよね。 質問に提示されているコードではdoPostの方ではいきなりdoGetを呼び出していますが、 doGetでもgetWriterが先に実行されているおりcharsetは効果がありませんので、上記記事の通りです。
m.ts10806

2018/06/16 03:34

自動生成であっても書籍からのコピーであってもコードは自身のものなので、一通り把握される必要があります。責任は自身にしかありません。 自動生成はあくまでお節介機能であり、必要な機能を確実に提供してくれるという保証はありません。 必要な機能かどうかは要件次第なので要不要は自身で判断してください。 そのためにコメントも自動生成されていると思います。 // TODO Auto-generated method stub ↑ これとか。
sena14

2018/06/16 03:42

すみません。 はい。記事を見て理解できました。response.getWriter().append("Served at: ").append(request.getContextPath());ここが一番の原因ということですよね。これがなければdoPost()内のdoGet()があってもうまくいくということですよね? response.setContentType("text/html; charset = UTF-8");が呼ばれて文字列はちゃんと表示されるような気もするのですがgetWriterを呼び出す前に、charsetを指定しないといけないという決まりがあったんですねと伝えたかったです。言葉足らずですみません。
sena14

2018/06/16 03:43

すみませんでした。
m.ts10806

2018/06/16 03:45

いえ、あやまらなくていいですよ。 最初はなかなか理解が追い付かないものだと思いますので、 1つ1つ着実におさえていってください。 プログラムは指示した通りにしか動きませんが、そのためのお作法というのものがありますので、 自身の感覚や思い込みで適当なコードを書いてしまうのが一番危険です。 1つ1つ着実におさえていってください。
sena14

2018/06/16 03:53

ありがとうございました。 頑張ります。
guest

0

おはようございます。
「サーブレット」「文字化け」で検索すると、対応策が見えると思います。

投稿2018/06/15 23:01

senior_golfer

総合スコア264

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sena14

2018/06/16 02:40

調べてはみたのですが、対応するようなものが見つからず困っています。 response.setContentType("text/html; charset=utf-8");をするなどの解決方法が出てくるのですが既に実行済みのため原因がわかりません。
sena14

2018/06/16 03:05

Served at:はdoGet()に書かれていたんですね。 これも自動生成のため気づいていませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問