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

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

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

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

servlet

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

Q&A

2回答

34482閲覧

ClassCastExceptionの発生と対処

RyoM

総合スコア90

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

servlet

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

0グッド

0クリップ

投稿2016/09/02 21:56

編集2022/01/12 10:55

お世話になります。
会員登録の更新部分を作っています。
一度目は更新できるのですが、連続して更新しようとすると
ClassCastExceptionの例外が発生してしまいます。
オブジェクトからのキャストミスの部分が分かりません。
もしお分かりの方がいらっしゃればご教授よろしくお願いいたします。
以下がソースです。

java

1HTTPステータス 500 - java.lang.Integer cannot be cast to java.lang.String 2 3type 例外レポート 4 5メッセージ java.lang.Integer cannot be cast to java.lang.String 6 7説明 The server encountered an internal error that prevented it from fulfilling this request. 8 9例外 10 11java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String 12 update.UpdateDb.doPost(UpdateDb.java:42) 13 javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 14 javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 15 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 16 encoding.EncodingFilter.doFilter(EncodingFilter.java:26)

java

1package update; 2 3import java.io.IOException; 4import java.sql.Connection; 5import java.sql.PreparedStatement; 6import java.sql.SQLException; 7 8import javax.servlet.RequestDispatcher; 9import javax.servlet.ServletConfig; 10import javax.servlet.ServletException; 11import javax.servlet.annotation.WebServlet; 12import javax.servlet.http.HttpServlet; 13import javax.servlet.http.HttpServletRequest; 14import javax.servlet.http.HttpServletResponse; 15import javax.servlet.http.HttpSession; 16 17import connect.ConnectMySql; 18 19 20@WebServlet("/UpdateDb") 21public class UpdateDb extends HttpServlet 22{ 23 private static final long serialVersionUID = 1L; 24 25 protected PreparedStatement ps = null; 26 protected Connection con = null; 27 28 29 30 public void init(ServletConfig config) throws ServletException 31 { 32 // データベースへ接続 33 con= ConnectMySql.getConnection(); 34 } 35 36 37 protected void doPost(HttpServletRequest request, 38 HttpServletResponse response) throws ServletException, IOException 39 { 40 HttpSession session = request.getSession(true); 41 42 String oldname =(String) session.getAttribute("name");//パラメータでユーザーIDをゲットする 43 String oldpass =(String) session.getAttribute("pass");//パラメータでいれたパスワードをゲットする 44 45 String newname = request.getParameter("user"); 46 String newpass = request.getParameter("password"); 47 String meruado = request.getParameter("address"); 48 String denwa = request.getParameter("denwa"); 49 String syokusyu = request.getParameter("syokugyo"); 50 51 int ocupation = Integer.parseInt(syokusyu); 52 53 try 54 { 55 con.setAutoCommit(false); 56 57 String sql = "UPDATE PERSONALS SET USERID=?,PASSWORD=?," 58 + "MAILADDRESS=?,PHONENUMBER=?,OCUPATIONID=? WHERE USERID=? && PASSWORD=?"; 59 ps = con.prepareStatement(sql); 60 ps.setString(1, newname); 61 ps.setString(2, newpass); 62 ps.setString(3, meruado); 63 ps.setString(4, denwa); 64 ps.setInt(5, ocupation); 65 ps.setString(6, oldname); 66 ps.setString(7, oldpass); 67 68 int num = ps.executeUpdate(); 69 // System.out.println(num); 70 71 try 72 { 73 74 con.commit(); 75 System.out.println("登録成功"); 76 77 } 78 catch (SQLException e) 79 { 80 con.rollback(); 81 System.out.println("登録失敗:ロールバック実行"); 82 e.printStackTrace(); 83 } 84 } 85 catch(SQLException e) 86 { 87 throw new ServletException(e); 88 } 89 finally 90 { 91 if(ps != null) 92 { 93 try 94 { 95 ps.close(); 96 } 97 catch(SQLException ignore) 98 {} 99 } 100 if(con != null) 101 { 102 try 103 { 104 con.close(); 105 } 106 catch(SQLException ignore) 107 {} 108 } 109 } 110 session.setAttribute("name", newname); 111 session.setAttribute("pass", newpass); 112 RequestDispatcher dis = request.getRequestDispatcher("/other/upfinish.jsp"); 113 dis.forward(request, response); 114 } 115 public void destory() throws SQLException 116 { 117 ps.close(); 118 con.close(); 119 120 121 } 122}

追記
jspのソースも載せておきます。

java

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 4<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5<html> 6<head> 7<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8<title>会員情報変更ページ</title> 9<link rel="stylesheet" type="text/css" href="css/basic.css"> 10</head> 11<body> 12<H1>会員情報を変更します</H1> 13<FORM ACTION="../UpdateDb" method="post"> 14<H3>ユーザーIDの変更</H3> 15<INPUT type="text" name="user"> 16<H3>パスワードの変更</H3> 17<INPUT type="password" name="password" maxlength="8"> 18<H3>電話番号の変更</H3> 19<INPUT type="text" name="denwa"> 20<H3>メールアドレスの変更</H3> 21<INPUT type="text" name="address"> 22<H3>職業の変更</H3> 23 <select name="syokugyo"> 24 <option value="0">--</option> 25 <option value="1">会社経営・自営</option> 26 <option value="2">自営業</option> 27 <option value="3">会社員(役員)</option> 28 <option value="4">会社員(管理職)</option> 29 <option value="5">会社員(一般社員)</option> 30 <option value="6">契約社員・派遣社員</option> 31 <option value="7">専門職(医師・弁護士など)</option> 32 <option value="8">公務員</option> 33 <option value="9">専業主婦・主夫・家事手伝い</option> 34 <option value="10">学生</option> 35 <option value="11">パート・アルバイト</option> 36 <option value="12">その他</option> 37 </select> 38<INPUT type="submit"> 39<INPUT type="reset"> 40</FORM> 41</body> 42</html>

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

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

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

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

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

guest

回答2

0

ソースコードが行がずれてなければ

java

1String oldname =(String) session.getAttribute("name");//パラメータでユーザーIDをゲットする

ここでエラーがでており、この name 属性に Integer のオブジェクトが保持されていたものと思われます。
ということはどこかで

java

1session.setAttribute("name", new Integer(x));

みたいな感じで Integer オブジェクトを入れているところがあるのではないでしょうか?
doPost 内では String しか入れてないので、別のところではないでしょうか。

セッションオブジェクトは Servlet/JSP 間で共有されます。他の Servlet/JSP 含めて犯人を探す必要があります。

JSPの場合、useBean タグを使っているかもしれません。以下の様なものがあれば、前記の setAttribute と同じことが起こります。

<jsp:useBean id="name" scope="session" type="java.lang.Integer"/>

参考:Sessionを使ったサーブレット・JSP間のオブジェクト共有

投稿2016/09/02 22:10

編集2016/09/03 00:59
mit0223

総合スコア3401

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

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

RyoM

2016/09/03 00:32

回答ありがとうございます!! その部分で間違いないです。 INT型のデータをString型にキャストできないという例外ということでしょうか? しかしながら、疑問点として それだと一回目の更新成功はなぜ出来るのでしょうか? String newname = request.getParameter("user");で前ページからパラメータでデータを持ってきて、その後にsession.setAttribute("name", newname);でセッションにセットするようにしているのですが、ここが間違っているということなのでしょうか?
mit0223

2016/09/03 00:45

いえ、 newname は String として宣言されているので、間違っても Integer オブジェクトが入っていることはありえません。HttpSession はサーバ側で利用者ごとに保持されているセッション情報なので、利用者がログインしている間はその属性を保持することになります。他のサーブレット/JSPからも同じものが見えるので、誰かが setAttribute("name", y) で Integer オブジェクトを設定しているんだと思います。他のサーブレット/JSP含めて setAttribute("name" で検索してみてはどうでしょう。
RyoM

2016/09/03 08:20

jspの部分を探してもuseBean タグは使った覚えがないんですが、どこかでIntegerオブジェクトを設定しているんでしょうか?何回か探してみてはみたんですが、もう一度探してみます、、、
mit0223

2016/09/03 08:35

そうですか。メッセージから見て Integer オブジェクトが入っていたことは間違いないと思うのですが。デバッガとかトレース出力で確かめることはできませんか?その値とかみると何かわかるかもしれませんし。ところで、この name は数値としてみることもできるような文字列なんでしょうか? 社員番号とか?
mit0223

2016/09/03 08:40

ソースが修正可能なら、とりあえず、直接キャストせずに Object obj = session.getAttribute("name"); String oldname =(String) obj; と2行に分けて、この間でブレークポイントで止めるとかトレースをいれるとかしてはどうでしょう。
RyoM

2016/09/03 10:21

nameにはユーザーネームをいれてもらうようにしているので、数値として見れるような文字列入れていません。あいうえおであったり、アンパンマンなどの文字列をデータベースに入れています。 一度、2つに分けてやってみたいと思います。
guest

0

型チェック実行+SQL実行が共通部の場合、以下のように setObject を使う方法もある

java

1Object oldname = session.getAttribute("name"); //パラメータでユーザーIDをゲットする 2Object oldpass = session.getAttribute("pass"); //パラメータでいれたパスワードをゲットする 3 4// 中略 5String sql = " 6UPDATE PERSONALS 7SET USERID=?, 8 PASSWORD=?, 9 MAILADDRESS=? 10 PHONENUMBER=?, 11 OCUPATIONID=? 12WHERE USERID=? AND PASSWORD=?"; 13 14ps = con.prepareStatement(sql); 15 16// 中略 17ps.setObject(1, newname); 18ps.setObject(2, newpass); 19ps.setObject(3, meruado); 20ps.setObject(4, denwa); 21ps.setObject(5, ocupation); 22ps.setObject(6, oldname); 23ps.setObject(7, oldpass);

また String は cast するのではなく String#valueOf(Object) を用いる

投稿2016/09/03 08:15

編集2016/09/03 08:23
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

RyoM

2016/09/03 10:23

回答ありがとうございます! そんなやり方もあるんですね、、、 一つ質問として SET USERID=?, PASSWORD=?, MAILADDRESS=? PHONENUMBER=?, OCUPATIONID=? WHERE USERID=? AND PASSWORD=?"; の部分の最初のSETの部分は String oldname =(String) session.getAttribute("name");//パラメータでユーザーIDをゲットする String oldpass =(String) session.getAttribute("pass");//パラメータでいれたパスワードをゲットする String newname = request.getParameter("user"); String newpass = request.getParameter("password"); String meruado = request.getParameter("address"); String denwa = request.getParameter("denwa"); String syokusyu = request.getParameter("syokugyo"); この部分を表していると考えて大丈夫ですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問