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

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

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

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

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

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

解決済

3回答

4018閲覧

Servlet フィルターについて

n000n00

総合スコア25

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

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

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

0クリップ

投稿2017/01/27 05:22

編集2017/01/28 13:28

前回質問させた頂いた続きになります。

編集中のページに、別のユーザーで編集ページに入らせない処理を書いています。

編集ページを抜けた判定を、フィルターで実装しようと処理を書いてみましたが、フィルターを実行すると、NullPointerException で処理が止まってします状況です。

そもそもフィルターで実装は不可能なのでしょうか
知恵をお貸しいただけないでしょうか。

また、フィルターのdestroyはいつ実行されるかご教授いただけないでしょうか(Servletのdestroyとの違い等)

よろしくお願いします。

前回の質問

Java

1package fw; 2 3import java.io.IOException; 4import java.util.Map; 5 6import javax.servlet.Filter; 7import javax.servlet.FilterChain; 8import javax.servlet.FilterConfig; 9import javax.servlet.ServletContext; 10import javax.servlet.ServletException; 11import javax.servlet.ServletRequest; 12import javax.servlet.ServletResponse; 13import javax.servlet.http.HttpServlet; 14 15import wiki.WikiBean; 16 17public class PostProcessing extends HttpServlet implements Filter { 18 19 public void init(FilterConfig filterConfig) 20 throws ServletException { 21 } 22 23 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 24 throws IOException, ServletException { 25 System.out.println("後処理フィルター"); 26 27 /* 編集ページのアクセスの履歴があれば、mapからidを削除 */ 28 ServletContext sc = null; 29 if (getServletContext() == null) { 30 }else{ 31 sc = getServletContext(); 32 String name = request.getParameter("name"); 33 if (sc.getAttribute("tmpMap") != null) { 34 int id = -1; 35 if (request.getParameter("id") == null || request.getParameter("id").isEmpty()) { 36 id = 0; 37 } else { 38 id = Integer.parseInt(request.getParameter("id")); 39 } 40 41 Map<String, Integer> map = WikiBean.autoCast(sc.getAttribute("tmpMap")); 42 if (map.containsKey(name)) { 43 if (map.get(name) == id) { 44 map.remove(name); 45 sc.setAttribute("tmpMap", map); 46 } 47 } 48 } 49 50 } 51 chain.doFilter(request, response); 52 } 53 54 public void destroy() { 55 ServletContext sc = null; 56 if (getServletContext() != null) { 57 sc = getServletContext(); 58 } 59 if (sc.getAttribute("tmpMap") != null) { 60 sc.removeAttribute("tmpName"); 61 } 62 } 63}

web.xml

1<?xml version="1.0" encoding="UTF-8"?> 2<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 4 version="2.5"> 5 6 <!-- セッションタイムアウト設定 --> 7 <session-config> 8 <session-timeout>300</session-timeout> 9 </session-config> 10 11 <!-- フィルター --> 12 <filter> 13 <filter-name>EncodingFilter</filter-name> 14 <filter-class>fw.EncodingFilter</filter-class> 15 <init-param> 16 <param-name>encode</param-name> 17 <param-value>UTF-8</param-value> 18 </init-param> 19 </filter> 20 21 <filter-mapping> 22 <filter-name>EncodingFilter</filter-name> 23 <url-pattern>/*</url-pattern> 24 </filter-mapping> 25 26<!-- 27 <filter> 28 <filter-name>PostProcessing</filter-name> 29 <filter-class>fw.PostProcessing</filter-class> 30 </filter> 31 32 <filter-mapping> 33 <filter-name>PostProcessing</filter-name> 34 <url-pattern>/*</url-pattern> 35 </filter-mapping> 36 --> 37途中省略

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

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

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

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

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

7tsuno

2017/02/04 09:07

NullPointerExceptionが発生している箇所を特定することは可能でしょうか?エラー内容から行数など特定できるはずです。
n000n00

2017/02/04 23:14

回答ありがとうございます。恐らく29行目のgetServletContext() です。java.lang.NullPointerException javax.servlet.GenericServlet.getServletContext(GenericServlet.java:123) fw.PostProcessing.doFilter(PostProcessing.java:29) fw.EncodingFilter.doFilter(EncodingFilter.java:34)
guest

回答3

0

ベストアンサー

Before

java

1public class PostProcessing extends HttpServlet implements Filter { 2 3 public void init(FilterConfig filterConfig) 4 throws ServletException { 5 } 6 7 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 8 throws IOException, ServletException { 9 10(中略) 11 12 if (getServletContext() == null) { 13 }else{ 14 15(中略) 16 17 } 18 chain.doFilter(request, response); 19 } 20 21 public void destroy() { 22 ServletContext sc = null; 23 if (getServletContext() != null) { 24 sc = getServletContext(); 25 } 26 if (sc.getAttribute("tmpMap") != null) { 27 sc.removeAttribute("tmpName"); 28 } 29 }
After

java

1public class PostProcessing implements Filter { 2 3 private FilterConfig filterConfig = null; 4 5 public void init(FilterConfig filterConfig) throws ServletException { 6 this.filterConfig = filterConfig; 7 } 8 9 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 10 throws IOException, ServletException { 11 12(中略) 13 14 /* 他の全ての箇所の getServletContext() の呼出しも、同様に修正。 */ 15 if (filterConfig.getServletContext() == null) { 16 }else{ 17 18(中略) 19 20 } 21 chain.doFilter(request, response); 22 } 23 24 public void destroy() { 25 26 /* 必要か否か不明。ご自分で検証・判断してください。 */ 27 // if (sc.getAttribute("tmpMap") != null) { 28 // sc.removeAttribute("tmpName"); 29 // } 30 31 filterConfig = null; 32 }

getServletContext() は HttpServletクラス(が継承している GenericServletクラス)のメソッドです。
http://mergedoc.osdn.jp/tomcat-servletapi-5-ja/javax/servlet/GenericServlet.html#getServletContext()

しかし、PostProcessingクラスは Filter インターフェースの実装クラスとして使用しているため、
HttpServletクラスとしての初期化処理は実行されません。
そのため、getServletContext() メソッドの実行で NullPointerException が発生します。

代わりに、上述のように init() メソッドの引数に渡された FilterConfig インスタンスをメンバーフィールドに保持し、
その FilterConfig インスタンスの getServletContext() メソッドを使用すれば、正常に ServletContext インスタンスにアクセスできるはずです。
http://mergedoc.osdn.jp/tomcat-servletapi-5-ja/javax/servlet/FilterConfig.html#getServletContext()

投稿2017/02/07 14:18

KiyoshiMotoki

総合スコア4791

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

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

n000n00

2017/02/10 07:03

回答ありがとうございます。 本日実装して、無事動きました。遅くなり、申し訳ございません。 大変勉強になりました。ありがとうございました。
guest

0

Servlet の init メソッド内で super.init(config) を呼びだしていないとconfigが設定されず、 getServletContext() メソッドで NullPointerException が発生することがあるらしいです。
参考

java

1 public void init(FilterConfig filterConfig) 2 throws ServletException { 3 super.init(filterConfig); 4 }

としてみてもらえますか

投稿2017/02/06 01:05

7tsuno

総合スコア310

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

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

n000n00

2017/02/07 08:09

回答ありがとうございます。 実装してみましたが、引数にfilterConfigを指定できませんでした。、 引数なしで、コンストラクタ(?)を呼び出しましたが、同じくExceptionが発生します。
guest

0

destroyは基本的にはサーバ停止時やタイムアウト時に発生します。

投稿2017/02/04 09:06

7tsuno

総合スコア310

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問