CALENDAR
S M T T F S
    123
45678910
11121314151617
18192021222324
25262728293031
<< October 2020 >>
ARCHIVES
CATEGORIES
RECOMMEND
RECOMMEND
Javaデザインパターン徹底攻略 (標準プログラマーズライブラリ)
Javaデザインパターン徹底攻略 (標準プログラマーズライブラリ) (JUGEMレビュー »)
日立ソフトウェアエンジニアリングインターネットビジネス部
RECOMMEND
RECOMMEND
独習Java第3版
独習Java第3版 (JUGEMレビュー »)
ジョゼフ・オニール
MOBILE
qrcode
guice=guice
これの続き

今度はサーブレットとして使用する方法です

まずは、準備としてWebContent/WEB-INF/libに以下のjarファイルを入れてください
(不要なものもあるかもしれませんが・・・・)

・aopalliance.jar
・guice-3.0.jar
・guice-assistedinject-
・guice-multibindings-3
・guice-persist-3.0.jar
・guice-servlet-3.0.jar
・javax.inject.jar

作成するのはテキストボックスに入力した文字を表示します。

 

まず、web.xml
以下の<filter>タグを追加してください
------------------------------------
  <filter>
    <filter-name>GuiceFilter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>GuiceFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
-------------------------------------

続いてweb.xmlに設定したDIを設定するリスナークラス
-------------------------------------
package config;

import javax.servlet.annotation.WebListener;

import module.GuiceServletModule;

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.servlet.GuiceServletContextListener;

@WebListener
public class GuiceServletConfig extends GuiceServletContextListener {

    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new GuiceServletModule());
    }
}
-------------------------------------

リスナークラスに設定した(上記赤文字部分)
GuiceServletModuleクラス(ServletModuleを実装)
-------------------------------------
package module;

import java.util.HashMap;
import java.util.Map;

import servlet.IndexServlet;
import servlet.ViewServlet;

import com.google.inject.servlet.ServletModule;

import filter.EncodingFilter;

public class GuiceServletModule extends ServletModule{

    @Override
    protected void configureServlets() {

        // 初期パラメータ設定
        // withの第2引数にパラメータを渡すことで初期パラメータ設定は設定できる
        Map<String, String> initParam = new HashMap<>();
        initParam.put("encoding", "MS932");
        initParam.put("initParam", "初期パラメータ");

        // フィルター
        filter("/*").through(EncodingFilter.class , initParam);

        // 初期ページ
        serve("/index").with(IndexServlet.class , initParam);
        // 入力後のページ
        serve("/inputText").with(ViewServlet.class);
    }
}
-------------------------------------

初期ページ用のサーブレット(IndexServlet.java)
-------------------------------------
package servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.inject.Singleton;

@Singleton
public class IndexServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public IndexServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 初期パラメータ取得処理
        // ServletConfigの取得
        ServletConfig config = this.getServletConfig();

        // ServletConfigから初期値パラメータの取得
        String initParam = config.getInitParameter("initParam");
        request.setAttribute("initParam", initParam);


        RequestDispatcher rd = request.getRequestDispatcher("index.jsp");
        rd.forward(request, response);
    }
}
-------------------------------------
@Singletonをつけないとエラーになります。
青文字部分でコメントにあるようにGuiceServletModuleクラスで指定した
初期パラーメータを取得できます。
上記ソースではその後リクエストパラメータにセットしています。
    

入力後のページ用サーブレット(ViewServlet.java)
-------------------------------------
package servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import provider.ViewMain;

import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;

@Singleton
public class ViewServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Inject
    private Provider<ViewMain> provider;


    public ViewServlet() {
        super();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        ViewMain main = provider.get();
        String message = main.execute();


        request.setAttribute("message", message);

        RequestDispatcher rd = request.getRequestDispatcher("view.jsp");
        rd.forward(request, response);

    }
}
-------------------------------------
@Singletonをつけないとエラーになります。
青文字部分はサーブレットでインジェクトしているクラスです
@Inject
private Provider<ViewMain> provider;


ここでProviderクラスをインジェクトしています。
ViewMain main = provider.get();
インジェクトしたProviderクラスからViewMainクラスを取得し
executeメソッドを実行します。

provider.get();
インジェクトを指定するときジェネリクスで指定したクラスを取得します。
この場合、Provider<ViewMain>となっているので戻り値はViewMainとなります


続いてViewMainクラス
-------------------------------------
package provider;

import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.inject.Inject;
import com.google.inject.servlet.RequestParameters;
import com.google.inject.servlet.RequestScoped;

@RequestScoped
public class ViewMain {

    @Inject
    private HttpServletRequest request;
    @Inject
    private HttpServletResponse response;


    // リクエストパラメータの取得
    @Inject @RequestParameters
    private Map<String, String[]> parameterMap;


    public String execute() throws IOException, ServletException {

        // リクエストパラメータの取得
        String[] messages = this.parameterMap.get("inputText");
        String message = messages[0];


           return message;
    }
}
-------------------------------------
インジェクトするためのクラスはリクエストスコープを持たせないと駄目らしいので
@RequestScopedをつけます。
また、リクエストおよびレスポンスをインジェクトすることが出来ます。
@Inject
private HttpServletRequest request;
@Inject
private HttpServletResponse response;


リクエストパラメータの取得は
@Inject @RequestParameters
private Map<String, String[]> parameterMap;

で行います。
パラメータはマップで取得され、配列に格納されています。

なので
String[] messages = this.parameterMap.get("inputText");
String message = messages[0];

で取得します。

続いて、jsp
初期表示用jsp(index.jsp)
------------------------------------
 <%@ page language="java" contentType="text/html; charset=windows-31j"
    pageEncoding="windows-31j"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>入力ページ</title>
</head>
<body>
<%
    String initParam = (String)request.getAttribute("initParam");
%>
<br>初期パラメータ<%=initParam %>
<br>

<form method="post" action="./inputText" name="input">
    <input type="text" name="inputText" />
    <input type="submit" name="inputValue" value="入力"/>
</form>

</body>
</html>
------------------------------------
inputTextがリクエストパラメータのキーになります。
ViewMainクラスのマップのキーに指定します。
./inputTextはGuiceServletModuleの入力後のページのマッピングになります。


入力文字表示用jsp(view.jsp)
------------------------------------
 <%@ page language="java" contentType="text/html; charset=windows-31j"
    pageEncoding="windows-31j"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>入力文字</title>
</head>
<body>
<%
    String message = (String)request.getAttribute("message");
%>
入力した文字は : <%=message %> です。
</body>
</html>
------------------------------------

最後にエンコーディングフィルター
(GuiceServletModuleで指定した、filter("/*").through(EncodingFilter.class , initParam);の部分)
------------------------------------
package filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import com.google.inject.Singleton;

@Singleton
public class EncodingFilter implements Filter {

     private String encoding = null;

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

         //リクエストに対してエンコーディングをMS932にセット
          request.setCharacterEncoding(encoding);
          //レスポンスに対してエンコーディングををMS932にセット
          response.setCharacterEncoding(encoding);

          chain.doFilter(request, response);

    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

         //パラメータから値を読み込みセット
          encoding = filterConfig.getInitParameter("encoding");

    }
}
------------------------------------
@Singletonをつけないとエラーになります。
encoding = filterConfig.getInitParameter("encoding");
ここでGuiceServletModule で指定した"encoding"を取得しています。

これで、テキストボックスに入力した文字を表示できます。
起動URLは
http://localhost:8080/guiceWeb/index
guiceWebは環境に応じて変更してください。




インターフェイスをバインドしたりインターセプターを使用する場合は
GuiceServletModuleクラスに以下のように指定します。

// インターフェイスをバインドする
bind(HelloService.class).to(HelloServiceImple.class);
// インターセプター
bindInterceptor(new MyMatcherClass(), new MyMatcherMethod(), new MyInterceptor());


例:GuiceServletModule に追加した場合
------------------------------------
public class GuiceServletModule extends ServletModule{

    @Override
    protected void configureServlets() {

        // 初期パラメータ設定
        // withの第2引数にパラメータを渡すことで初期パラメータ設定は設定できる
        Map<String, String> initParam = new HashMap<>();
        initParam.put("encoding", "MS932");
        initParam.put("initParam", "初期パラメータ");

        // フィルター
        filter("/*").through(EncodingFilter.class , initParam);

        // 初期ページ
        serve("/index").with(IndexServlet.class , initParam);
        // 入力後のページ
        serve("/inputText").with(ViewServlet.class);

        // インターフェイスをバインドする
        bind(HelloService.class).to(HelloServiceImple.class);
        // インターセプター
        bindInterceptor(new MyMatcherClass(), new MyMatcherMethod(), new MyInterceptor());


// 以下略

------------------------------------


バインドされたインターフェイスを使用するには
前にやった時と同様に、使用したいクラスで以下のように指定すれば使用できます

@Inject
private HelloService service;


例:ViewMainクラスに追加した場合、
------------------------------------
public class ViewMain {

    @Inject
    private HttpServletRequest request;
    @Inject
    private HttpServletResponse response;
  @Inject
  private HelloService service;


    // リクエストパラメータの取得
    @Inject @RequestParameters
    private Map<String, String[]> parameterMap;

    public String execute() throws IOException, ServletException {

        // リクエストパラメータの取得
        String[] messages = this.parameterMap.get("inputText");
        String message = messages[0];
       
         // インジェクトされたインターフェイスの使用
         service.execute();


           return message;
    }
}
------------------------------------


こんなところですね。

なお、当記事を作成するに当たり以下のサイトを参考にしました。

TomcatでGoogleGuiceを使う
山本大@クロノスの日記


JUGEMテーマ:Java
| JAVAとか | 07:45 | comments(0) | trackbacks(0) | pookmark |
<< 人気のお菓子が・・・ | main | カーフ・ブランディング >>
コメント
コメントする









この記事のトラックバックURL
トラックバック機能は終了しました。
トラックバック