カテゴリー「Java-プログラム」の10件の記事

2012年2月13日 (月)

jconsol の起動

メモリの使用量やCPU使用率等をグラフィカルに見るためのツールとして「jconsol」があります。下記はWindowsマシンでの「jconsol」起動までの設定です。

■起動パラメータの設定

eclipse でTomcatの起動パラメータを指定する

1.ウィンドウ⇒設定
2.Tomcat⇒JVM設定
3.下記のパラメータを追加

  -Dcom.sun.management.jmxremote
  -Dcom.sun.management.jmxremote.port=7900
  -Dcom.sun.management.jmxremote.ssl=false
  -Dcom.sun.management.jmxremote.authenticate=false

Photo_3

※ jmxremote.port=7900 としていますが、空いているポートを指定してください


■jconsoleの起動

1.[JDKインストールディレクトリ]/bin/jconsole.exe を起動
2.ホスト名とポートを指定して起動する

※ホストは何も触っていないなら「127.0.0.1」
※ポートは起動パラメータで「7900」を指定済
※ユーザ名・パスワードは指定なし

Photo_5


起動すると下記のような画面が表示される

Photo_6

2012年1月23日 (月)

Java Doc の書き方 (随時更新)

■クラスコメント

 @author [作成者]       クラスの作成者を記述(複数行で複数人を記述できる)

■メソッドコメント

 @param [変数名] [説明文]  メソッドの引数の説明

 @return [説明文]        メソッドの戻り値の説明

■その他

 @see [クラス名等]       関連項目を記述(JavaDocに関連項目が作成される)

 {@link [クラス名等] }      文章中に参照リンクを作成する

2012年1月12日 (木)

struts-config.xml メモ

<struts-config>

  <form-beans>

    <!--アクションフォームBean定義 -->
    <form-bean
              name="【 名称 例:ExAction 】"

              type="【 クラス名 例:struts.ExActionForm 】"/>

  </form-beans>

  <action-mappings>

    <!-- アクションの処理設定 -->
    <action

         path="【 JSPのフォーム画面から指定される値 例:/ExAction 】"

         type="【 アクションを処理するクラス名 例:struts.ExActionAction 】"

         className="【ActionMappingクラスの完全修飾名】"

         name="【 アクションフォームBeanの名前 例:ExAction 】"

         scope="【 アクションフォームBeanのライフサイクル (request、session)】"

    parameter="【 アクションで取得できるパラメータ】"

    validate="【 入力検証機能 (true:行う、false:行わない)】"

         input="【入力検証時のエラー時に遷移するjsp(validate="true"の場合のみ有効)】">

      <set-property property="【プロパティ名】" value="【値】" />

      <!-- アクション・クラス実行後の遷移先を指定 -->
      <forward name="【遷移先指定名称 例:success】" path="【実際のパス】" />

    </action>

  </action-mappings>

2011年2月23日 (水)

Mysql + Java で CommunicationsException が発生

MySQL+Javaのローカル環境で負荷をかけたところ下記のエラーが発生

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The driver was unable to create a connection due to an inability to establish the client portion of a socket.

This is usually caused by a limit on the number of sockets imposed by the operating system. This limit is usually configurable.

For Unix-based platforms, see the manual page for the 'ulimit' command. Kernel or system reconfiguration may also be required.

For Windows-based platforms, see Microsoft Knowledge Base Article 196271 (Q196271).
    at sun.reflect.GeneratedConstructorAccessor16.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1118)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:343)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2308)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2122)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:774)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49)
    at sun.reflect.GeneratedConstructorAccessor12.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:375)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:289)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
       :

色々なサイトを見ていると、下記のサイトを発見

5000 を超える番号の TCP ポートから接続しようとすると 'WSAENOBUFS (10055)' エラーが表示される
http://support.microsoft.com/kb/196271/ja

実際に「netstat」コマンドを実行し、
番号を確認したところ、5000になると同じ事象が発生していたため、
同様の事象であることを確認

上記サイトに書かれた通りにレジストリを変更したところ、エラーは発生しなくなった・・・

2011年2月17日 (木)

Eclipse で作成したプロジェクトを Tomcat で公開する

Eclipse 上で作成したプロジェクトは、Eclipse (内部)の Tomcat でデバック・動作確認ができます。しかし、そのままでは通常の (公開)Tomcat サービスを起動してもデバック・動作確認できません。

「動かす時だけ、Eclipse から Tomcat を起動すれば・・・」

まぁ、それでも良いですけど、せっかくならサービスを「自動起動」にしたり、

公開  Tomcat:本番環境
EclipseTomcat:開発環境

・・・なんて運用も良いと思います。

上記設定が、Eclipse のエクスポート (Export) 機能を利用すれば簡単に行えます。

1.プロジェクトを右クリック→エクスポート

2.「Web」→「WARファイル」を選択して「次へ」を選択

Export1

3.エクスポートの必要な値を入力して「完了」ボタンを押下する

Export1_3 

  • Webプロジェクト:プロジェクト名を入力(自動セット)
  • 宛先:Tomcat のインストール先を入力
  • ターゲットランタイム:ランタイムを選択(自動セット)

 ※今回は、「ソースファイルのエクスポート」、
  「既存ファイルを上書き」にもチェックをつけています

4.コントロールパネル→管理ツール→サービス を選択

5.Tomcatのサービスを起動する

Export1_5

6.今までの開発で確認してきたURLを入力し、画面が表示できれば完了です。

※スタートアップの種類を「自動」にしておけば、パソコン起動時にサービスが起動します。

2011年2月 4日 (金)

JSP→サーブレットで、日本語のリクエストパラメータを受けとる(修正)

■POSTの場合

サーブレットで日本語のリクエストパラメータを受ける際、
何も気にせず取得すると「?」を含んだ文字に化けてしまう。
これは受けとる文字コード等が原因なのだが、

getParameter("XXXXX")

で全角文字を受け取る前に

request.setCharacterEncoding("文字コード");

で受け取る文字コードを指定すれば回避できる。

下記サイトはパターン毎の説明があり、
大変わかりやすかったので、私が説明するより
下記サイトを見た方が早いと思いますw

http://ameblo.jp/archive-redo-blog/theme-10003613179.html

■GETの場合

Get型で日本語のパラメータを受け取る場合、
上記対策のほか、 server.xml を変更する必要がある。

<connector connectiontimeout="60000"
                port="8080"
                protocol="org.apache.coyote.http11.Http11NioProtocol"
                redirectport="8443"
                usebodyencodingforuri="true" >

※上記赤文字の「usebodyencodingforuri="true"」を追加する

2011年2月 1日 (火)

localhost では正常に動くのに マシン名でアクセスするとセッションを取得できない?

現在Javaの開発中で下記のような現象が発生しました。

  1. localhost では正常に動く
  2. 他端末からマシン名でアクセスすると正常に動く
  3. 自端末からマシン名でアクセスするとセッションが取得できない

理由がわからず、サイトを探していると下記の記事を発見

http://www.javaroad.jp/bbs/answer.jsp?q_id=20081021120508288

どうやらマシン名(URL)に「_」(アンダースコア)が入っていると
セッションが正常に取得できない場合があるらしい。
試しにマシン名から「_」(アンダースコア)を消したところ、
正常に動くようになった。

詳しい原因まで調査はしていないが、URLにアンダースコアを入れるのは控えた方がよさそうです。

2011年1月25日 (火)

getRequestDispatcher と sendRedirect の違い

サーブレッドからのページ遷移には「getRequestDispatcher(フォワード)」と「sendRedirect(リダイレクト)」の2つがある。

■フォワード

   // 画面遷移
   RequestDispatcher rd = request.getRequestDispatcher("遷移先URL");
   rd.forward(request, response);

■リダイレクト

  // 画面遷移
   ((HttpServletResponse)response).sendRedirect("遷移先URL");

※2つの主な違いは以下の通り

  1. リダイレクトよりもフォワードの方がパフォーマンスが良い
  2. フォワードはサーバ内部の転送にのみ使用できる(別サーバに転送できない)
  3. リクエスト情報を引き継げるのはフォワードのみ

2011年1月20日 (木)

JSP にて Servlet で設定された値を利用する。

① Servlet 側 --------------------------------------------------

  :
request.setAttribute("inpNumber", "100");
  :

※リクエストに 「inpNumber」という名前で「100」を設定する

② JSP 側 --------------------------------------------------

  :
<!-- ${変数名} で利用 -->
<input type="text" name="inpNumber" value="${inpStockNumber}">
  :
<!-- requestから直接取得する -->
<%= request.getAttribute("inpStockNumber") %>
  :

2011年1月19日 (水)

JSPにてJavaで宣言したenum定数を利用する

① 定数クラスを作成(enumを使用)

package common;

public class FixedValues {

/**
  * エラーレベル
  * 通常:NORMAL(0)
  * 警告:WARNING(1)
  * 異常:ERR(9)
  * @author yamamoto
  *
  */
public enum ERRLEVEL{
  NORMAL(0) ,
  WARNING(1) ,
  ERR(9) ;

  ERRLEVEL(final int level){
   intValue = level ;
  }

  // enum定数から整数へ変換
     public int getIntValue() {
         return intValue;
     }

     // 整数からenum定数へ変換
     public static ERRLEVEL valueOf(final int anIntValue) {
         for (ERRLEVEL d : values()) {
             if (d.getIntValue() == anIntValue) {
                 return d;
             }
         }
         return null;
     }
  private int intValue;
}
}

②エラーBeanを作成する

package beans;

import common.FixedValues;

/**
  * エラー情報Bean<br>
  *   エラーID、エラーメッセージ、エラーレベルを所持する
  * @author yamamoto
  *
  */
public class ErrBean {

  /** エラーID */
  private String errid;

  /** エラーレベル */
  private FixedValues.ERRLEVEL errlevel;

  /** エラーメッセージ */
  private String errmsg;

  /**
    * エラーID取得
    * @return エラーID
    */
  public String getErrid() {
  return errid;
  }
  /**
  * エラーID設定
  * @param errid エラーID
    */
  public void setErrid(String errid) {
  this.errid = errid;
  }

  /**
  * エラーレベル取得
  * @return エラーレベル(定数)
  */
  public FixedValues.ERRLEVEL getErrlevel() {
    return errlevel;
  }
  /**
    * エラーレベル設定(数値)
    *  0:Normail、
    *  1:Warning、
  *  9:Err
  * @param errlevel エラーレベル(数値)
    */
  public void setErrlevel(int errlevel) {
    this.errlevel = FixedValues.ERRLEVEL.valueOf(errlevel);
  }
  /**
    * エラーレベル設定(定数)
    * @param errlevel エラーレベル(定数)
    */
  public void setErrlevel(FixedValues.ERRLEVEL errlevel) {
    this.errlevel = errlevel;
  }

  /**
    * エラーメッセージ取得
    * @return エラーメッセージ
    */
  public String getErrmsg() {
    return errmsg;
  }
  /**
    * エラーメッセージ設定
    * @param errmsg エラーメッセージ
    */
  public void setErrmsg(String errmsg) {
    this.errmsg = errmsg;
  }

}

③ JSPで宣言、利用する

<%-- タグライブラリの宣言 --%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<%--インポート(errlevelを宣言しているBeansクラスを前もって作成しておく) --%>
<%@ page import="beans.*" %>
<jsp:useBean id="reqErrBean" class="beans.ErrBean" scope="request" />

<%--インポート(enum定数クラスをインポート) --%>
<%@ page import="common.FixedValues" %>

<%-- Beanクラスの値を変数に設定(型 FixedValues.ERRLEVEL ) --%>
<c:set var="plevel" value="${reqErrBean.errlevel}" />

<%--再度宣言しなおす --%>
<c:set var="LEVELNORMAL" value="<%= ERRLEVEL.NORMAL %>" />
<c:set var="LEVELWARNING" value="<%= ERRLEVEL.WARNING %>" />
<c:set var="LEVELERR" value="<%= ERRLEVEL.ERR %>" />
 :
  <c:choose>
    <%-- エラーレベルの比較を行う --%>
    <c:when test="${plevel==LEVELNORMAL}">
      情報
    </c:when>
    <c:when test="${plevel==LEVELWARNING}">
      警告
    </c:when>
    <c:otherwise>
      エラー
    </c:otherwise>
  </c:choose>

宣言しなおすことで、単純な名前(定数)として使用可能となる