【Struts2】プロジェクト実行直後のJSPでAction実行結果を表示する

- Java/Struts2 -
2019.10.23
struts2

EclipseでStruts2を使ったWebアプリ開発練習中のことでした。

プロジェクト実行すると、一番最初に「web.xml」ファイルの「welcome-file-list」で指定したJSPファイルがブラウザに表示されますよね。

ここで、

その一番最初のページが表示される前に、まずxxxAction.javaを実行してDBから値を引っ張り出してその値を最初のJSPで受け取って表示したい。どうすればいいか?

という問題に直面しました。

実現したいこと"]

  1. プロジェクト実行(ホームページへアクセス)
  2. JSP表示

これを、以下のようにしたい↓

  1. プロジェクト実行(ホームページへアクセス)
  2. (Action実行)
  3. JSP表示(Actionの結果生成された値を受け取って表示)

例えば、ECサイトならトップ画面にアクセスすると既にいくつも商品が並んでます。そういうのは初回アクセスしたことをトリガにDBからselectしてきてJSP(というかViewに相当する何かしら)に渡されたものを表示しているはずなんですが、Struts2初心者の僕はここで予想外の時間を費やしたので書いておこうかと。

いつもは「既に表示されているボタンやリンクを人為的にクリックする」ことをトリガにActionを起動、ということばかり練習していたので「初回ページ表示」をトリガにActionを実行させるには具体的には何をトリガにすればいいのか?と。

いくつか方法があるのかもしれませんが、「JSPファイルによるリダイレクト」でいけることがわかりました。

JSPファイルで"リダイレクト" + web.xmlにひと工夫

結論から完結に言うと、以下3ステップです。起動されるファイルの順番さえイメージできれば簡単。

簡単3ステップ"]

  1. ActionへリダイレクトするためだけのJSPファイルを用意する
    ※仮に、redirect.jspとします
  2. redirect.jspに「●●アクションへリダイレクトする」というコードを書く
  3. web.xmlの<welcome-file-list>に書いたホームページファイル名をredirect.jspに変更

もう少し、具体的に書いてみます。

具体的なリダイレクト方法

前提条件:

  1. 一番最初に実行させたいActionクラスファイルが既に作ってあること
  2. 一番最初に実行させたいJSPファイルが既に作ってあること
  3. struts.xmlファイルの記載がされていること(Actionクラスファイルと表示したいJSPを紐づけていること)

これらは既に実行済みと想定し、説明しません。

①リダイレクト用のJSPファイルを作成する

JSPでリダイレクト

② JSPファイル内に、リダイレクトするコードを書く

<body>
<%
  response.sendRedirect("/example/xxxAction");
%>
</body>

"/example/xxxAction"のexample、xxxAction部分は適宜ご自分の環境へ読み替えてください。まさかActionをここで指定できるとは。。

もしくは、<body>ではなく以下の通り<head>にmetaタグを書くことでも行けます。

<head>
<meta http-equiv="refresh" content="0;URL='xxxAction'"/>
</head>
<body>
〜〜〜
</body>

③ web.xmlファイルを修正

<welcome-file-list>
<welcome-file>home.jsp</welcome-file>
</welcome-file-list>

とかになっていたとすると、以下のように変更↓

<welcome-file-list>
 <welcome-file>redirect.jsp</welcome-file>
</welcome-file-list>

これで完了です。
これでプロジェクトを実行すると、

  1. web.xmlがまずredirect.jspを呼ぶ
  2. redirect.jspがxxxActionへリダイレクトする
  3. xxxActionが起動、処理を実行しstruts.xmlへSUCCESS(なりERRORなり)をreturnする
  4. struts.xmlがreturnされた結果をもとにJSPへ返す

という風に動作します(JSPで受け取った値を表示するためにはもちろん③でsessionへputするか、ValueStack経由で値をJSPへ渡すためのプロパティ + getterメソッドの記述も必要です)。

人間の目には「④を表示する」処理にしか見えませんが、このようにリダイレクトさせることで③のActionをJSP表示前に噛ませることができるようになります。

おまけ:試してもダメだったこと

<welcome-file-list>にActionクラスを指定しちゃえば即解決でしょ、と思い以下のようにweb.xmlを書き換えて、

<welcome-file-list>
<welcome-file>HomeAction</welcome-file>
</welcome-file-list>

これで実行するとStruts Problem Report画面が出てしまい「そんなAction知らんがな」と言われてしまいNGでした。