• 締切済み

Java初心者です。勉強のためにJavaを使ったアプリケーションの開発

Java初心者です。勉強のためにJavaを使ったアプリケーションの開発をしています。DBから取得した日本語文字列が文字化けしてしまうので、アドバイスを頂きたいです。 【環境】 Win XP Pro SP2 Eclipse 3.4.2 tomcat 6.0 JDK 1.6.0_14 Struts 1.3.10 Access 2000 上記の環境で簡単なログインページを作成しています。IDとパスワードを入力して、DB認証がOKならユーザ名称を取得してメニュー画面に遷移し、取得したユーザ名称を表示するという仕様です。 デバッグして追っていくと、以下のことが分かりました。 (1)ログイン画面で入力したID・パスワードは正しくサーブレットに渡っている (2)SQLを発行してDBよりデータを取得する段階で文字化けが発生している (2)でデータを取得する時に、HashMapのgetメソッドを使っています。文字化けしたデータは ???????G となってしまっています。DB(Access)からUnicodeへのエンコードがうまくいっていないのでしょうか?恥ずかしながらDB(Access)の文字コードの調べ方が分かりません。 ※ドライバはsun.jdbc.odbc.JdbcOdbcDriverを使用しています。 【Login_Anken_Business.java】 public class Login_Anken_Business extends BaseBusiness { public String getLoginUserName(String userid, String password) { StringBuilder sbQuery = new StringBuilder(); sbQuery.append("SELECT"); sbQuery.append(" m04_name_user "); sbQuery.append("FROM"); sbQuery.append(" M04_USER "); sbQuery.append("WHERE"); sbQuery.append(" m04_id_user = '"); sbQuery.append(userid); sbQuery.append("' "); sbQuery.append("AND"); sbQuery.append(" m04_txt_password = '"); sbQuery.append(password); sbQuery.append("' "); HashMap<String, String> result = selectOneRecord(sbQuery.toString()); if (result == null) { return null; } else { return result.get("m04_name_user"); → ここで文字化け発生 } } }

  • Java
  • 回答数1
  • ありがとう数8

みんなの回答

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

確か、Access 2000の文字データはSJIS?EUC?JIS位まで疑っておけば良いのかなと思いますけど。 http://www.atmarkit.co.jp/fwin2k/win2ktips/312charcode/charcode.html

関連するQ&A

  • Java初心者です。勉強のためにJavaを使ったアプリケーションの開発

    Java初心者です。勉強のためにJavaを使ったアプリケーションの開発をしています。DBから取得した日本語文字列が文字化けしてしまうので、アドバイスを頂きたいです。 【環境】 Win XP Pro SP2 Eclipse 3.4.2 tomcat 6.0 JDK 1.6.0_14 Struts 1.3.10 Access 2000 上記の環境で簡単なログインページを作成しています。IDとパスワードを入力して、DB認証がOKならユーザ名称を取得してメニュー画面に遷移し、取得したユーザ名称を表示するという仕様です。 デバッグして追っていくと、以下のことが分かりました。 (1)ログイン画面で入力したID・パスワードは正しくサーブレットに渡っている (2)SQLを発行してDBよりデータを取得する段階で文字化けが発生している (2)でデータを取得する時に、HashMapのgetメソッドを使っています。文字化けしたデータは ???????G となってしまっています。DB(Access)からUnicodeへのエンコードがうまくいっていないのでしょうか?恥ずかしながらDB(Access)の文字コードの調べ方が分かりません。 ※ドライバはsun.jdbc.odbc.JdbcOdbcDriverを使用しています。 【Login_Anken_Business.java】 public class Login_Anken_Business extends BaseBusiness { public String getLoginUserName(String userid, String password) { StringBuilder sbQuery = new StringBuilder(); sbQuery.append("SELECT"); sbQuery.append(" m04_name_user "); sbQuery.append("FROM"); sbQuery.append(" M04_USER "); sbQuery.append("WHERE"); sbQuery.append(" m04_id_user = '"); sbQuery.append(userid); sbQuery.append("' "); sbQuery.append("AND"); sbQuery.append(" m04_txt_password = '"); sbQuery.append(password); sbQuery.append("' "); HashMap<String, String> result = selectOneRecord(sbQuery.toString()); if (result == null) { return null; } else { return result.get("m04_name_user"); → ここで文字化け発生 } } }

  • final修飾子を使用した場合で

    お世話になっています。 finalクラスとfinalメソッドの利用目的の考え方を踏まえて、 id/passwordを「新規」、「更新」、「削除」したい場合で、 開発者側から判定してほしいのですが。 ※更新、削除が複数実行されることを考慮する dbへのユーザーの追加方法だけ、決定事項として実行する(finalメソッド) public class LoginAction { public static void main(String[] args) { User login = new Login("test","test"); //サブクラスを親クラスにインスタンス化する int key = 0; String id="test"; String password="test"; login.check(key, id, password); } } public class Login extends User { public Login(String id, String password) { super(id, password); } //処理判断 @Override public void check(int key, String id, String password) { if(key==0){ insertUser(id,password); }else if(key==0){ deleteUser(id,password); }else if(key==2){ updateUser(id,password); } } } public class User { public User(String id,String password) {} /** * ユーザーの追加(一件) */ public final void insertUser(String id, String password) { //DBに登録 } /** * ユーザーの削除(1件) */ public final void deleteUser(String id,String password) { //DBからデータ削除 } /** * ユーザーの更新(1件) */ public final void updateUser(String id, String password) { //DBの更新 } //処理判断 public void check(int key, String id, String password) { //サブクラスに預ける } } また、この時に、check()メソッドでどの処理かを判断し、メソッドのわたしているのですが、それをコンストラクタで渡したら、 無駄なロスが出そうな気がするのですが。 他に、サブクラスで設定し、親クラスにインスタンス化を実行すると、 何がいいのかがよくわかりません。 親クラスはサブクラスのデータを持っていて、そうすることで最終的に 親クラスから、サブクラスのデータが取れるという感じなのですが。 宜しくお願いします。

    • ベストアンサー
    • Java
  • StringBuilderをStringに代入

    StringBuilderを使って文字列連結して、それをSQL文(String型)として利用するプログラムを作りました。 ※SQLはループ処理で約10万個ぐらい発行→実行します StringBuilderの文字列を、最終的にString型の変数(strSql)に代入するのですが、 下記のどちらで代入する方がコスト掛からないでしょうか? A案. ---------- StringBuilder sb = new StringBuilder(); sb.append(変数a); sb.append(変数b); sb.append(変数c); String sqlStr = new String(sb); ---------- B案. ---------- StringBuilder sb = new StringBuilder(); sb.append(変数a); sb.append(変数b); sb.append(変数c); String sqlStr = sb.toString(); ---------- 教えてください。

    • ベストアンサー
    • Java
  • php sqlでログイン認証システムについてです。

    このようなソースを書いてログインシステムを書いています。 ここで接続はできたのですが、クエリーが失敗しましたと出てきます。 このソースをどのように修正すればよいのかアドバイスお願いできないでしょうか。よろしくお願いします。 <?php session_start(); $link = mysql_connect('localhost', 'root', 'root'); if (!$link) { die('接続失敗です。'.mysql_error()); } $db_selected = mysql_select_db('mydb', $link); if (!$db_selected){ die('データベース選択失敗です。'.mysql_error()); } mysql_set_charset('utf8'); // エラーメッセージの初期化 $errorMessage = ""; // ログインボタンが押された場合 if (isset($_POST["login"])) { // 1.ユーザIDの入力チェック if (empty($_POST["userid"])) { $errorMessage = "ユーザIDが未入力です。"; } else if (empty($_POST["password"])) { $errorMessage = "パスワードが未入力です。"; } // 2.ユーザIDとパスワードが入力されていたら認証する if (!empty($_POST["userid"]) && !empty($_POST["password"])) { // mysqlへの接続 $mysqli = new mysqli($db['localhost'], $db['root'], $db['root']); if ($mysqli->connect_errno) { print('<p>データベースへの接続に失敗しました。</p>' . $mysqli->connect_error); exit(); } // データベースの選択 $mysqli->select_db($db['mydb']); // 入力値のサニタイズ $userid = $mysqli->real_escape_string($_POST["userid"]); // クエリの実行 $query = "SELECT * FROM db_user WHERE name = '" . $userid . "'"; $result = $mysqli->query($query); if (!$result) { print('クエリーが失敗しました。' . $mysqli->error); $mysqli->close(); exit(); } while ($row = $result->fetch_assoc()) { // パスワード(暗号化済み)の取り出し $db_hashed_pwd = $row['password']; } // データベースの切断 $mysqli->close(); // 3.画面から入力されたパスワードとデータベースから取得したパスワードのハッシュを比較します。 //if ($_POST["password"] == $pw) { if (password_verify($_POST["password"], $db_hashed_pwd)) { // 4.認証成功なら、セッションIDを新規に発行する session_regenerate_id(true); $_SESSION["USERID"] = $_POST["userid"]; header("Location: main.php"); exit; } else { // 認証失敗 $errorMessage = "ユーザIDあるいはパスワードに誤りがあります。"; } } else { // 未入力なら何もしない } } ?>

    • 締切済み
    • PHP
  • ユーザー定義関数の意味

    下記のユーザー定義関数の意味を自分なりに解釈しました。 下記の意味で合っていますか? // $dbと$user_idを受け取ったget_user関数は、$dbと$sqlを受け取ったユーザーの情報を取り出す function get_user($db, $user_id){ // データベースに接続してusersテーブルからuser_idが$user_idに一致するuser_id、name、password、typeを1行だけ表示する $sql = " SELECT user_id, name, password, type FROM users WHERE user_id = {$user_id} LIMIT 1 "; return fetch_query($db, $sql); } // $dbを受け取ったget_login_user関数は、変数dbと変数login_user_idを受け取ったget_user関数を返す function get_login_user($db){ // 変数login_user_idをセッションのユーザーIDと定義する $login_user_id = get_session('user_id'); return get_user($db, $login_user_id); }

    • ベストアンサー
    • PHP
  • はじめましてJava初心者のものです。

    はじめましてJava初心者のものです。 現在、日報管理システムを作成しているのですが、日報をウェブ上で書き、その内容を閲覧者へ送信するというようなものです。 その時に、もし今日より前の日に、日報を書き忘れて、送信していない場合に、トップページに、「○○さんの○月○日の日報の提出が未提出です」というようなアラートメッセージを表示させたいのですが、どのようにDBから取得しそれを表示するのか方法がわかりません。 DBにはあらかじめ、以下のようなカラムを用意し、中身は空の状態にしています。これで日報を書き、送信したら、DBに登録されるようにしたいと考えています。 どうかアドバイス宜しくお願い致します。 書き込まれた日報のID(int型) 日報を書いたユーザのID(int型) 日報を書いた人の名前(String型) 日報の内容(TEXT型) 書いた日の日付(DATE型) また、システムにログインできるユーザテーブルを別に作成しています。 ユーザのIDと日報を書いた人の名前はそこのテーブルと紐付けて取得させようと思っています。 説明がうまくなくて申し訳ないですがよろしくお願い致します。

  • はじめましてJava初心者のものです。

    はじめましてJava初心者のものです。 現在、日報管理システムを作成しているのですが、日報をウェブ上で書き、その内容を閲覧者へ送信するというようなものです。 その時に、もし今日より前の日に、日報を書き忘れて、送信していない場合に、トップページに、「○○さんの○月○日の日報の提出が未提出です」というようなアラートメッセージを表示させたいのですが、どのようにDBから取得しそれを表示するのか方法がわかりません。 DBにはあらかじめ、以下のようなカラムを用意し、中身は空の状態にしています。これで日報を書き、送信したら、DBに登録されるようにしたいと考えています。 どうかアドバイス宜しくお願い致します。 書き込まれた日報のID(int型) 日報を書いたユーザのID(int型) 日報を書いた人の名前(String型) 日報の内容(TEXT型) 書いた日の日付(DATE型) また、システムにログインできるユーザテーブルを別に作成しています。 ユーザのIDと日報を書いた人の名前はそこのテーブルと紐付けて取得させようと思っています。 説明がうまくなくて申し訳ないですがよろしくお願い致します。

  • java HashMapで数値データを取り出すには

    HashMapの使い方について教えてください。 DBのテーブルから、「SEMINAR_TITLE」「SEMINAR_PRESENTER_NAME」「SEMINAR_NUM」の 値を取得して、HashMapにセットしようと考えてます。 「SEMINAR_NUM」だけ、数値型となっており、他の2つは文字列となっています。 ------------------------------------------------------------------------------------------- HashMap seminar_list = new HashMap(); //DBから値を取得して、seminar_listにセットする。 seminar_list = dbControl.get_SEMINAR_LIST("001"); String seminar_title = (String)seminar_list.get("SEMINAR_TITLE"); String seminar_presenter_name = (String)seminar_list.get("SEMINAR_PRESENTER_NAME"); int seminar_num = (int)seminar_list.get("SEMINAR_NUM"); ------------------------------------------------------------------------------------------- のような式を書いてみましたが、 int seminar_num = (int)seminar_list.get("SEMINAR_NUM"); のところでエラーとなってしまいます。 (他の2つの値は取得する事ができています) 数値データを取り出すにはどのようにすればよいのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 【ASP.NET】 ログインコントロールにおいて

    おせわになります。 Visualstudio 2005 のASP.NET VB でWEBサイトを作成しております。 ASP.NET  で ログインコントロールを使って、認証ページを作っているのですが。 ID PASSWORD この2つのIDをログインコントロール内で、使用しているのは分かるのですが、 このIDに加え ID 名前 PASSWORD という3つのデータによって、ログイン制御を行いたいと考えております。 ログインコントロール内で、テーブルを追加して、「名前」を増やした所、 このIDをVB.NET側で、受け取れません。 ASP.NET 側の ログインコントロールのソースは /////// ここからが問題の箇所 ///////////// <tr> <td align="right" style="height: 24px; width: 149px;"> <asp:Label ID="Label2" runat="server" AssociatedControlID="USERID">ID: </asp:Label></td> <td style="height: 24px; width: 312px;"> <asp:TextBox ID="USERID" runat="server" MaxLength="5" OnTextChanged="USERID_TextChanged" Width="152px"> </asp:TextBox> <asp:RangeValidator ID="RangeValidator1" runat="server" ControlToValidate="USERID" ErrorMessage="ユーザーIDは5文字以下にしてください。" ToolTip="ユーザーIDは10文字以下にしてください" Type="String" ValidationGroup="Login1">*</asp:RangeValidator> </td> </tr> /////// ここまでが問題の箇所 //////////// /////// ここからは通常に起動 ///////////// <tr> <td align="right" style="height: 24px; width: 149px;">  <asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserName">氏名(カナ):</asp:Label></td> <td style="height: 24px; width: 312px;"> <asp:TextBox ID="UserName" runat="server" Width="152px" OnTextChanged="UserName_TextChanged" MaxLength="10"> </asp:TextBox> <asp:RangeValidator ID="UserNameRequired" runat="server" ControlToValidate="UserName" ErrorMessage="ユーザー名は10文字以下にしてください。" Type ="String" ToolTip="ユーザー名は10文字以下にしてください" ValidationGroup="Login1"> *</asp:RangeValidator> </td> </tr> <tr> <td align="right" style="height: 29px; width: 149px;"> <asp:Label ID="PasswordLabel" runat="server" AssociatedControlID="Password">パスワード: </asp:Label> </td> <td style="width: 312px; height: 29px;"> <asp:TextBox ID="Password" runat="server" TextMode="Password" Width="152px"> </asp:TextBox> <asp:RequiredFieldValidator ID="PasswordRequired" runat="server" ControlToValidate="Password" ErrorMessage="パスワードが必要です。" ToolTip="パスワードが必要です。" ValidationGroup="Login1"> * </asp:RequiredFieldValidator> </td> </tr> <tr> <td align="center" colspan="2" style="color: red"> <asp:Literal ID="FailureText" runat="server" EnableViewState="False"></asp:Literal> </td> </tr> VB.NET 側では以下のスクリプトで指定しています。 Protected Sub LoginButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Login1.LoggedIn ////////// 受け取れない ////////////////// Dim strID As String = Login1.UserID.ToString ////////// 受け取れる ////////////////// Dim strID As String = Login1.UserName.ToString ////////// 受け取れる ////////////////// Dim strID As String = Login1.Password.ToString このように、LOGIN コントロールに UserIDを追加できません。 よって、session などに、 UserID のVALUE を受け取れるようにしたいのですが、 asp.net側の 設定はどのようにしたらよろしいのでしょうか。 ログインコントロールは あきらめて、通常の独自の認証システムを作るべきですかね。 ログインコントロールに 通常のテキストボックスとして、追加はできないものでしょうか。 どなたかご存知の方、いらっしゃいましたら、教えていただけますと幸いです。 どうぞ宜しくお願いいたします。

  • 【初心者】javaコンパイルエラー scp.put

    自動的にファイルがアップロードされる機能をjavaで作りたいと思っています。 いろいろ調べながら書いたのですが、 コンパイルエラーになってしまい、どこがおかしいのか分かりません。 下にあるようなソースを書いていているのですが、 以下のようなコンパイルエラーになってしまいます。 ご教授いただけると幸いです。 ----- シンボルを見つけられません。 シンボル:クラス Connection 場所  :ScpTestのクラス ----- import java.io.IOException; import ch.ethz.ssh2.*; public class ScpTest { private static final String hostname = "***.***.***.***(ホスト名)"; private static final String userid = "ユーザー名"; private static final String password = "パスワード"; public static void main(String[] arg) { try { ScpTest test = new ScpTest(); test.doProc(); } catch (IOException ex) {ex.printStackTrace();} } public void doProc() throws IOException { // connect & login Connection conn = new Connection(hostname); ConnectionInfo info = conn.connect(); boolean result = conn.authenticateWithPassword(userid, password); if (result) { // scp SCPClient scp = conn.createSCPClient(); scp.put("ローカルフォルダのファイルパス", "リモート側のファイルパス"); } conn.close(); } }

    • ベストアンサー
    • Java

専門家に質問してみよう