« 2010年12月 | トップページ | 2011年2月 »

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>

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

JFreeChartを使用したサンプルプログラム

JFreeChartを使用したサンプルプログラム

① JSPファイルでIMGタグ追加

       <img src="/xxx/SimpleViewer">

※サーブレット「SimpleViewer」を呼び出す為、Web.xmlも変更する

    <servlet>
      <description></description>
      <display-name>SimpleViewer</display-name>
      <servlet-name>SimpleViewer</servlet-name>
      <servlet-class>xxx.SimpleViewer</servlet-class>
    </servlet>
    <servlet-mapping>
      <servlet-name>SimpleViewer</servlet-name>
      <url-pattern>/SimpleViewer</url-pattern>
    </servlet-mapping>

② Javaプログラム作成

    /**
     * Get処理
     */
    protected void doGet(
      HttpServletRequest request,
      HttpServletResponse response)
    throws ServletException, IOException {
       View(request,response);
    }

/**
  * 出力共通処理
  * @param request リクエスト
  * @param response レスポンス
  * @throws ServletException
  * @throws IOException
  */
public void View(
   HttpServletRequest request,
   HttpServletResponse response)
throws ServletException, IOException {

  // セッション取得
  HttpSession session = request.getSession();

  // データの取得(事前に配列型データをセッションに設定しておく)
  Object objectList = session.getAttribute("sesXxxxBean") ;

  // データの設定(前もってGetter/Setterを持ったBeanを作成)
  @SuppressWarnings("unchecked")
  ArrayList<XxxxBean> stocklist = (ArrayList<XxxxBean>) objectList ;

  // 3D棒グラフの作成の場合コメントアウトを外す
  ViewCreateBarChart3D(
    request,
    response,
    stocklist);

  // 3D円グラフの作成の場合コメントアウトを外す
//  ViewCreatePieChart3D(
//    request,
//    response,
//    stocklist);

  // レーダチャートの作成の場合コメントアウトを外す
//  ViewCreateSpiderWebPlot(
//    request,
//    response,
//    stocklist);
 
}

/** ------------------------------------------------------------
  * 3次元棒グラフを生成
  * @param request  リクエスト
  * @param response  レスポンス
  * @param stocklist データ
  * @throws IOException
  */
public void ViewCreateBarChart3D(
   HttpServletRequest request,
   HttpServletResponse response,
   ArrayList<XxxxBean> stocklist) throws IOException{

  //レガシーテーマを設定する
  ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());

  // 棒グラフの基となるデータセットを用意
     DefaultCategoryDataset objDpd = new DefaultCategoryDataset();

     // データセットに項目名と値を順にセット
     // 引数1 値
     // 引数2 系列
     // 引数3 項目
     for(int i=0;i< userstocklist.size(); i++){
       // get(i) で取得できるGetterを作成しておく
       objDpd.addValue(
         userstocklist.get(i).getStocknumber(),
         userstocklist.get(i).getStockbean().getStockname(),
         userstocklist.get(i).getStockbean().getStockname());
     }

     // 3次元棒グラフを生成
     //  第1引数 グラフタイトル、
     //  第2引数 横軸
     //  第3引数 縦軸
     //  第4引数 データ
     //  第5引数 VERTICAL:縦棒グラフ 、HORIZONTAL:横棒グラフ
     //  第6引数 判例を表示するか
     //  第7引数 ツールチップを表示するか
     //  第8引数 URLを動的に生成するか
     JFreeChart objCht=ChartFactory.createBarChart3D(
       "保有アイテム",
       "アイテム",
       "数量",
       objDpd,
       PlotOrientation.VERTICAL ,
       true,false,false);

     // JPEG形式で画像を出力
     writeChart(request,response,objCht);
}

/** ------------------------------------------------------------
  * 3次元円グラフを生成
  * @param request  リクエスト
  * @param response  レスポンス
  * @param stocklist データ
  * @throws IOException
  */
public void ViewCreatePieChart3D(
   HttpServletRequest request,
   HttpServletResponse response,
   ArrayList<XxxxBean> stocklist) throws IOException{

  //レガシーテーマを設定する
  ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());

  // 円グラフの基となるデータセットを用意
  DefaultPieDataset objDpd = new DefaultPieDataset();

     // データセットに項目名と値を順にセット
     // 引数1 項目
     // 引数2 値
     for(int i=0;i< userstocklist.size(); i++){
       objDpd.setValue(
         userstocklist.get(i).getStockbean().getStockname(),
         userstocklist.get(i).getStocknumber() );
     }

     // 3次元円グラフを生成
     //  第1引数 グラフタイトル、
     //  第2引数  データ
     //  第3引数 判例を表示するか
     //  第4引数 ツールチップを表示するか
     //  第5引数 URLを動的に生成するか
     JFreeChart objCht=ChartFactory.createPieChart3D(
       "保有アイテム",
       objDpd,
       true,false,false);

     // JPEG形式で画像を出力
    writeChart(request,response,objCht);
}

/** ------------------------------------------------------------
  * レーダーチャートを生成
  * @param request  リクエスト
  * @param response  レスポンス
  * @param stocklist データ
  * @throws IOException
  */
public void ViewCreateSpiderWebPlot(
   HttpServletRequest request,
   HttpServletResponse response,
   ArrayList<XxxxBean> stocklist) throws IOException{

  // 最大値
  int maxValue = 0 ;
 
  // レガシーテーマを設定する
  ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());

  // レーダーチャートの基となるデータセットを用意
     DefaultCategoryDataset objDpd = new DefaultCategoryDataset();

     // データセットに項目名と値を順にセット
     // 引数1 値
     // 引数2 系列
     // 引数3 項目
     for(int i=0;i< userstocklist.size(); i++){
      // 最大値の設定
      if( maxValue < userstocklist.get(i).getStocknumber() ){
       maxValue = userstocklist.get(i).getStocknumber() ;
      }
   objDpd.addValue(
     userstocklist.get(i).getStocknumber(),
     "Aさん",
     userstocklist.get(i).getStockbean().getStockname());
     }

     // 蜘蛛の巣プロットを生成
     SpiderWebPlot sp = new SpiderWebPlot(objDpd);
     // 最大値を設定
     sp.setMaxValue(maxValue);

     // レーダーチャートを生成
     //  第1引数 グラフタイトル、
     //  第2引数 ???
     //  第3引数 データ
     //  第4引数 ???
     JFreeChart objCht = new JFreeChart(
             "保有アイテム",
             JFreeChart.DEFAULT_TITLE_FONT,
             sp,
             true
         );

     // JPEG形式で画像を出力
     writeChart(request,response,objCht);

}

/** ------------------------------------------------------------
  * 画像を出力
  * @param request リクエスト
  * @param response レスポンス
  * @throws IOException
  */
public void writeChart(
   HttpServletRequest request,
   HttpServletResponse response,
   JFreeChart objCht)
throws IOException{

  // バイナリ出力ストリームにJPEG形式で画像を出力(360×240ピクセル)
     response.setContentType("image/jpeg");
     ServletOutputStream objSos=response.getOutputStream();
     ChartUtilities.writeChartAsJPEG(objSos,objCht,360,240);
}

※Get(Post)処理でサーブレットを呼び出し、サーブレット側で描画を行う。

« 2010年12月 | トップページ | 2011年2月 »