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

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

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

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

Q&A

解決済

2回答

1909閲覧

Java電卓【ステータス404エラー】②

jogduer

総合スコア14

Java

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

0グッド

0クリップ

投稿2017/10/17 02:27

編集2017/10/17 05:42

###前提・実現したいこと

Eclipseの環境でjavaの電卓アプリの件で以前質問させていただいたものです。
その際に、web上で動くためのソースコードが足りてないとの指摘から、そのためのソースコードを調べて追加しました。
再度、ステータス404のエラーが出て原因がわからなく、どう対処すればいいかわからない状態です。
エラー解決してちゃんと電卓アプリが動くようにするにはどうすればいいでしょうか。
###発生している問題・エラーメッセージ

HTTPステータス 404 - Not Found Type ステータスレポート メッセージ /Dentaku3/servletpack2.DentakuServlet 説明 The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.

###該当のソースコード

Java //概要部分 //APIをインポートをする import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.JFrame; import java.awt.BorderLayout; import javax.swing.JTextField; import javax.swing.JPanel; import javax.swing.JLabel; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.annotation.WebServlet @WebServlet("/Dentaku") //URLパターンの設定 //HttpServletの継承 public class DentakuServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("..."); out.println("</html>"); } } //レイアウト部分 public static void main(String args[]){ Dentaku c = new Dentaku(); c.show(); } //フレームを作成する public class DentakuFrame extends JFrame { private static final long serialVersionUID = 1L; JPanel contentPane = new JPanel(); BorderLayout borderLayout1 = new BorderLayout(); JTextField result = new JTextField(""); //計算結果を表示するテキストフィールド double stackedValue = 0.0; boolean isStacked = false; boolean afterCalc = false; String currentOp = ""; //フレームのビルド public DentakuFrame() { contentPane.setLayout(borderLayout1); this.setSize(new Dimension(250, 300)); this.setTitle("電卓"); this.setContentPane(contentPane); contentPane.add(result, BorderLayout.NORTH); //テキストフィールドを配置 JPanel keyPanel = new JPanel(); //ボタンを配置するパネルを用意 keyPanel.setLayout(new GridLayout(4, 4)); contentPane.add(keyPanel, BorderLayout.CENTER); keyPanel.add(new NumberButton("7"), 0); keyPanel.add(new NumberButton("8"), 1); keyPanel.add(new NumberButton("9"), 2); keyPanel.add(new CalcButton("÷"), 3); keyPanel.add(new NumberButton("4"), 4); keyPanel.add(new NumberButton("5"), 5); keyPanel.add(new NumberButton("6"), 6); keyPanel.add(new CalcButton("×"), 7); keyPanel.add(new NumberButton("1"), 8); keyPanel.add(new NumberButton("2"), 9); keyPanel.add(new NumberButton("3"), 10); keyPanel.add(new CalcButton("-"), 11); keyPanel.add(new NumberButton("0"), 12); keyPanel.add(new NumberButton("."), 13); keyPanel.add(new CalcButton("+"), 14); keyPanel.add(new CalcButton("="), 15); contentPane.add(new ClearButton(), BorderLayout.SOUTH); this.setVisible(true); } /* テキストフィールドに引数の文字列をつなげる */ public void appendResult(String c) { if (!afterCalc) //演算子ボタンを押した直後でないなら{ result.setText(result.getText() + c); } else { result.setText(c); afterCalc = false; } } /* 数字を入力ボタンの定義 */ public class NumberButton extends JButton implements ActionListener { private static final long serialVersionUID = 1L; public NumberButton(String keyTop) { super(keyTop); this.addActionListener(this); } } public class NumberButton extends JButton implements ActionListener { private static final long serialVersionUID = 1L; public NumberButton(String keyTop) { super(keyTop); this.addActionListener(this); } public void actionPerformed(ActionEvent evt) { String keyNumber = this.getText(); appendResult(keyNumber); } } /* 演算子ボタンを定義 */ public class CalcButton extends JButton implements ActionListener { private static final long serialVersionUID = 1L; public CalcButton(String op) { super(op); this.addActionListener(this); } public void actionPerformed (ActionEvent e) { if (isStacked) { //以前に演算子ボタンが押されたのなら計算結果を取り出す double resultValue = (Double.valueOf(result.getText())) .double Value(); if (currentOp.equals("+")) //演算子に応じて計算する stackedValue += resultValue; else if (currentOp.equals("−")) stackedValue −= resultValue; //プラス else if (currentOp.equals("×")) stacked Value *= resultValue; else if (currentOp.equals("÷")) stacked Value /= resultValue; result.setText(String.valueOf(stackedValue)); //計算結果をテキストフィールドに設定 } currentOp = this.getText(); //ボタン名から押されたボタンの演算子を取り出す stackedValue = (Double.valueOf(result.getText())).doubleValue(); afterCalc = true; if (currentOp.equals("=")) isStacked = false; else isStacked = true; } } /* クリアボタンの定義 */ public static ClassButton extends JButton implements ActionListener { private static final long serealVersionUID = 1L; public ClassButton() { super("C"); this.addActionListener(this); } public void actionPerformed(ActionEvent evt) { stackedValue = 0.0; afterCalc = false; isStacked = false; result.setText(""); } } }

###試したこと
スッキリわかるサーブレット&JSP入門の本をみてweb上で動くためのソースコードを追加しました。

###補足情報(言語/FW/ツール等のバージョンなど)

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

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

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

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

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

kei344

2017/10/17 05:14

バッククオート3つの前後には改行を入れてください。記入エリアの右部分あたりにリアルタイムに結果が表示されていると思うので、そこを見ながら調整してください。
jogduer

2017/10/17 05:25

修正依頼ありがとうございます。次回から気をつけます。
KSwordOfHaste

2017/10/17 05:32

質問は編集できますので、こうした間違いについては次回からではなく、本質問を編集したほうがよいですよ。
jogduer

2017/10/17 05:33

ご指摘ありがとうございます。質問は編集できるんですね。今すぐ修正します。
guest

回答2

0

ベストアンサー

訂正:失礼しました「スッキリわかるサーブレット&JSP入門の本をみてweb上で動くためのソースコードを追加しました。」を見落としてました。Webアプリを作るための参考書を使って取り組んでおられるのですね・・・一部訂正しました。


tkrurboさんがすでに回答しておられますが・・・

質問者さんが最初の質問を発した状況は以下のようなものだったと思います

  1. ブラウザー上で動く何か簡単なアプリケーションを作ろうと考えた
  2. Eclipseを使うとそれが簡単にできるという情報を得た
  3. そこでEclipseをインストールしてとりあえず作り始めた

おそらく、作り始める前に「Webアプリとは何か、どうやってサーバーサイドを作るか」などの知識は仕入れておられないと思います。
4. インターネット上にある「電卓」のサンプルコードを入手してプロジェクトに張り付けた

自分はServlet云々より先に「Webアプリケーションのなんたるか」のところをもう少し詳しく確認・把握されることをお勧めします。現状の質問者さんのコメントを拝見していると「Servletはrequestを通信で受け取り、それに対するresponseを応答する」「reqeust/responseは単なるテキスト」「servlet上ではGUI(swingなど)は用いない」「GUIはresponseであるHTMLにより表現される」といった基本事項の知識が欠落しているようです。

また、質問者さんの動機・目的によっては「何を作るか」にも再考の余地があると思います。

  • Webアプリケーションを作ってみたい

本格的にサーバーサイドの処理をJava(Servlet)で作り始める前に、まずはHTMLやJavascriptに取り組んでみてはいかがでしょうか。どのみちWebアプリケーションを作るならこの2つは必須知識ですし、電卓程度ですと単一のHTMLファイルのみで作れてしましますので、Webサーバーもとりあえずは必要なく、そのHTMLファイルをPC上においてブラウザーから読み込んでやれば足ります。

  • Javaで何か簡単なアプリケーションを作ってみたい

Webアプリケーションは将来トライすることにして、一旦スタンドアロンアプリケーションに挑戦するとよいと思います。提示しておられるコードはスタンドアロンアプリケーション専用のソースコードなのでそれを活用できます。

追記:自分が見落としてました。後者の目的はないのですね。こちらはスルーしてください。


※: EclipseでWebアプリケーションをあてずっぽうで作ってみる

というのは少々失礼な言い方ですが、提示しておられるソースコードは純然たるスタンドアロン専用のコードであり、Webアプリケーションの一部を構成するようなものでは全然ありません。つまりトライしておられることとソースコードがあまりにかい離しています。その点から「適当にやってみている」という印象を受けました。

投稿2017/10/17 05:08

編集2017/10/17 05:18
KSwordOfHaste

総合スコア18394

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

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

KSwordOfHaste

2017/10/17 05:25

解答直後に「自分が質問を見落としていて内容におかしな指摘がある」と考えたためかなり訂正してしまいました。前後して「+」を付与してくださった方がおられたため、少々あわてております。回答の不手際をお詫びいたします。
jogduer

2017/10/17 05:45

早々の回答ありがとうございます。 スタンドアローンとwebアプリケーションのコードでまた書き方が違うんですね。 それすらも知りませんでした。 ご指摘ありがとうございます。 指摘のあった「webアプリケーションがなんたるか」の基本事項の部分が理解できてないので、 そこの部分をもう一度調べてみます。
KSwordOfHaste

2017/10/17 05:56

ご質問にあるソースでいえばmainメソッド(クラスの内側にないので少々おかしなmainメソッドですが)以降がスタンドアロン専用のコードになり、本件では利用できません。もったいないようですがmainメソッド以降はそっくり削除することになるかと思います。 先頭付近にあるDentakuServletクラスのみがWebアプリケーション用のコードということになります。
jogduer

2017/10/17 06:05

ご指摘ありがとうございます。 まさにスタンドアローン専用のmainメソッド以降のコードはサーブレットでは使用出来ないんですね、わかりました。
guest

0

HTTPステータス 404 - Not Found Type ステータスレポート メッセージ /Dentaku3/servletpack2.DentakuServlet

java servlet はブラウザで特定のURLにアクセスすると処理結果を返すものですが、まずアクセスするべきURLが間違っています。

@WebServlet("/Dentaku") //URLパターンの設定

↑このURLにアクセスするんじゃないの?

また、

import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.JFrame; import java.awt.BorderLayout; import javax.swing.JTextField; import javax.swing.JPanel; import javax.swing.JLabel; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.annotation.WebServlet

いろいろimportしてますが、servletが返すのは基本的に文字データです。
swingのGUIなんて返ってきませんよ?

まずは「servletって何をするものなの?」というところから再確認されることをお勧めします。

投稿2017/10/17 02:41

tkturbo

総合スコア5572

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

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

jogduer

2017/10/17 05:06

早々の回答ありがとうございます。 URLが間違ってたんですか。ありがとうございます。どこがどの意味なのかわかっていなくてそれすらも把握できてなかったです。 URLの変更の方法を調べてみたんですが、わからなかったので再度質問です。 どうすればパターン設定した URLにつながるように設定できますでしょうか? サーブレット自体の理解ができてないため全然トンチンカンなことをしているみたいですね・・・。 サーブレットについて改めて調べてみたところ、 一言で言うと 「サーブレットはブラウザからのリクエストによって実行され、その実行結果をHTMLで返す。」 あとは、 ①ライフサイクル管理 ②マルチスレッド対応 ③プラットフォーム非依存 ということがわかりました。 他にもサーブレットのことを本やネットで検索して 調べてみましたが、なぜGUIが返ってこないのかわかりませんでした。 その代わりにどうすればいいのかもわかりませんでした。 servletで電卓機能作成する場合にはどうすればいいでしょうか? また、どのインポートがどの機能のためだったかきちんと理解できてないため、どのインポートを削除していいかわからずインポート全部残しています。
jogduer

2017/10/17 23:17

調べてみたら、Java SE と Java EE があり、今回作成しているwebアプリは Java EE の技術が必要で、 GUI は Java SE の技術なのでwebアプリ作成するためのサーブレット上では機能しないということがわかりました。サーブレットの doGet や doPost などのクラスで作成できるみたいなので、作成し直します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問