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

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

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

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

servlet

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

Q&A

解決済

2回答

6195閲覧

Javaの文字変換ライブラリICU4Jを用いてひらがな、カタカナをローマ字に変換したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

servlet

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

0グッド

0クリップ

投稿2020/01/16 12:50

イタリックテキスト### 前提・実現したいこと

ここに質問の内容を詳しく書いてください。

MVCモデルでフォームに入力した文字(ひらがな、カタカナ)をローマ字に
変換したい。

Javaの文字変換ライブラリICU4JのjarファイルをHPからダウンロードし、
プロジェクトに読み込んで、ライブラリの変換を実装中に以下のエラーメッセージが発生しました。
非常に初歩的な問題で申し訳ないのですがご指導いただければ嬉しいです。
よろしくお願い致します。

発生している問題・エラーメッセージ

タイプ 例外報告 メッセージ サーブレットの実行により例外を投げました 説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。 例外 javax.servlet.ServletException: サーブレットの実行により例外を投げました org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 根本原因 java.lang.NoClassDefFoundError: com/ibm/icu/text/Transliterator servlet.KensakuGamen.doPost(KensakuGamen.java:53) javax.servlet.http.HttpServlet.service(HttpServlet.java:660) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 根本原因 java.lang.ClassNotFoundException: com.ibm.icu.text.Transliterator org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1365) org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188) servlet.KensakuGamen.doPost(KensakuGamen.java:53) javax.servlet.http.HttpServlet.service(HttpServlet.java:660) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 注意 原因のすべてのスタックトレースは、サーバのログに記録されています

該当のソースコード

java

1package model; 2 3import com.ibm.icu.text.Transliterator; 4 5public class Henkan { 6 public static void henkan(String word) { 7 8 //リクエストパラメーターwordをローマ字に変換 9 10 String before; 11 String result; 12 Transliterator trans; 13 14 trans = Transliterator.getInstance("Hiragana-Latin"); 15 before = word; 16 result = trans.transliterate(before); 17 System.out.println(before + " → " + result); 18 19} 20 21 22 // TODO 自動生成されたメソッド・スタブ 23 24 } 25 26 27 28 29

servlet

1 2package servlet; 3 4import java.io.IOException; 5import java.io.PrintWriter; 6import java.util.regex.Matcher; 7import java.util.regex.Pattern; 8 9import javax.servlet.ServletException; 10import javax.servlet.annotation.WebServlet; 11import javax.servlet.http.HttpServlet; 12import javax.servlet.http.HttpServletRequest; 13import javax.servlet.http.HttpServletResponse; 14import javax.servlet.http.HttpSession; 15 16import com.ibm.icu.text.Transliterator; 17 18/** 19 * Servlet implementation class KensakuGamen 20 */ 21@WebServlet("/KensakuGamen") 22public class KensakuGamen extends HttpServlet { 23 24 private static final long serialVersionUID = 1L; 25 26 protected void doPost(HttpServletRequest request, HttpServletResponse response) 27 throws ServletException, IOException { 28 29 //リクエストパラメーターを取得 30 request.setCharacterEncoding("UTF-8"); 31 String word = request.getParameter("word"); 32 33 // 正規表現のパターンを作成 34 35 Pattern p = Pattern.compile("[あ-ン]");//正規表現の範囲を設定[あ-ん]と[ア-ン]を合成 36 Matcher m = p.matcher(word); 37 38 //リクエストパラメーターがnullでないかつ正規表現であるかのチェック 39 40 String errorMsg = ""; 41 if (word == null || word.length() == 0) { 42 errorMsg += "単語が入力されていません<br>"; 43 } 44 else if (m.find() == false) { 45 errorMsg += "ひらがな、カタカナ以外が入力されています<br>"; 46 System.out.println(m.find()); 47 } 48 49 50 51 //リクエストパラメーターwordをローマ字に変換 52 53 //HttpSession session=request.getSession();//セッションスコープを用意 54 //session.setAttribute("String", result);//セッションスコープに保存 55 //Henkan.henkan(word); 56 //Henkan h=new Henkan();//henkanクラスのインスタンスを生成 57 //h.henkan(word);//henkanクラスのメソッドを利用 58 59 60 61 62 //表示するメッセージを設定 63 String msg = word+"("+result+")" + "で検索を開始します"; 64 if (errorMsg.length() != 0) { 65 msg = errorMsg; 66 } 67 68 //HTMLを出力 69 70 response.setContentType("text/html; charset=UTF-8"); 71 PrintWriter out = response.getWriter(); 72 73 out.println("<!DOCTYPE html>"); 74 out.println("<html>"); 75 out.println("<head>"); 76 out.println("<meta charset=\"UTF-8\">"); 77 out.println("<title>ワード検索画面</title>"); 78 out.println("</head>"); 79 out.println("<body>"); 80 out.println("<p>" + msg + "</p>"); 81 out.println("</body>"); 82 out.println("</html>"); 83 } 84} 85 86 87

jsp

1 2<%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4<!DOCTYPE html> 5<html> 6<head> 7<meta charset="UTF-8"> 8<title>ワード検索機能</title> 9</head> 10<body> 11<form action="/word/KensakuGamen" method="post"> 12検索したい言葉:<br> 13<input type="text" name="word"><br> 14 15<input type="submit" value="検索"> 16</form> 17 18</body> 19</html> 20

試したこと

Henkan.henkan(word);でHenkanクラスのメソッド呼び出し⇒NG

Henkan h=new Henkan();⇒Henkanクラスのインスタンスを作りメソッド呼び出し⇒NG
h.henkan(word);

HttpSession session=request.getSession();⇒セッションスコープを用意して利用NG
session.setAttribute("String", result);

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

ICU4Jのバージョンは65.1です

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

Webアプリケーションなので、WEB-INF/lib に icu4jのjarファイルを配置すれば解決します。

投稿2020/01/17 01:04

A-pZ

総合スコア12011

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

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

退会済みユーザー

退会済みユーザー

2020/01/17 10:39

その方法も試してみたのですが、Apache tomcatのフォルダの中に直接icu4jのjarファイルを配置する方法 以外ではプログラムが回らないようでした。またjavaのバージョンが11の場合だと同じ場所に配置しても500エラーが出ていたのでバージョンの問題もあるのかもしれないです。
guest

0

ベストアンサー

出力されているエラーはサーブレットで実行した際にICU4Jのクラスが見つからないという物です。
開発環境ではICU4Jのライブラリを設定しているが、
実行しているWebサーバーの方にライブラリを設定をしてないというケースだと推察します。

投稿2020/01/16 13:02

yureighost

総合スコア2183

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

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

退会済みユーザー

退会済みユーザー

2020/01/16 16:29

回答ありがとうございます。eclipse上のビルドパスの設定ではICU4Jのライブラリをインストールできなかったので、直接Apache tomcatのlibフォルダにICU4Jのライブラリを入れたのち再起動して再度実行しましたがやはり実行できませんでした。 そのため実行環境がおかしいのかもと考えてjava11をjava13に変え、プロジェクトももう一度一から作り直したところ問題なく動きました。 ただ最初の方のプロジェクトは全く同じファイルにも関わらずデプロイメント記述子がwordからワードに 書き変わっていたり、modelクラスとservletクラスのjavaファイルの import com.ibm.icu.text.Transliterator; の部分がエラー表示になったり結局どこがおかしいのかわからないままです。 モジュールパスやクラスパスにライブラリICU4Jをどこに配置すべきかわからないまま インストールしてしまったのが原因なのでしょうか? 少し混乱してしまって要領を得ない返事になってしまい申し訳ありません。
yureighost

2020/01/16 23:11

tomcatの場合、server.xml、もしくはコンテキストファイルから実行コンポーネントが入ってるディレクトリのパスを設定する方法と、プロジェクトからwarファイルを生成してデプロイする二つの方法があって、どちらのやり方を使ってるかでlibの置き場所や設定方法も変わります。どちらを使っているかわかりますでしょうか。
退会済みユーザー

退会済みユーザー

2020/01/17 11:06 編集

プロジェクトを右クリックして出るメニュー中のビルドパスの指定から、クラスパスを選んで外部jarファイルを読み込んでいます。動かなかった方のプロジェクトのjarファイルはjavaリソース¥ライブラリ¥の参照ライブラリ直下、ちゃんと動いた方のプロジェクトのjarファイルはjavaリソース¥ライブラリ¥以下のApache tomcat直下と参照ライブラリ直下に置かれていました。デプロイメント記述子が書き変わっていたのは書き換えた覚えがないのですが、もしかしたらいろいろ操作してるうちに変更してしまったのかもしれなくて自分でも原因が特定できませんでした。 ですが上記二つの方法はともに試していないと思います。
yureighost

2020/01/17 11:16

デプロイメント記述子がある時点で動的Webプロジェクトでwarを生成してデプロイする方式ですね。 その方式での結論で言ってしまうと、A-pZさんと同じ回答になってしまいますね。 正確には「プロジェクト>WebContent>WEB-INF>lib」の配下に必要なjarを入れておけばwarを生成する時にjarを含めてくれるはずです。
退会済みユーザー

退会済みユーザー

2020/01/17 12:11

何度もありがとうございます。MVCモデルでの動的プロジェクト作成についてまだ全体の構成がよくわかってなかったのですが、段階を踏んで回答してくださったおかげでなんとか理解することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問