モジュール式 Java Web アプリケーションを作成する最良の方法は何ですか [終了]
-
09-06-2019 - |
質問
私はJavaで小さなWebサイト(JSPビューを備えたSpring MVC)を構築しており、いくつかの再利用可能なモジュール(「最新ニュース」「今後のイベント」など)を作成して組み込むための最良のソリューションを見つけようとしています。
そこで質問は次のとおりです。ポートレット、タイル、またはその他のテクノロジーですか?
解決
Spring MVC を使用している場合は、ポートレットを使用することをお勧めします。Spring では、ポートレットはページ全体の一部のみを担当し、非常に簡単に作成できるため、軽量のコントローラーにすぎません。Spring 2.5 を使用している場合は、新しいアノテーション サポートのすべての利点を享受でき、それらは依存関係注入を備えた Spring アプリケーション全体にうまく適合し、Spring を使用する他の利点も得られます。
ポートレット コントローラーはサーブレット コントローラーとほぼ同じです。簡単な例を次に示します。
@RequestMapping("VIEW")
@Controller
public class NewsPortlet {
private NewsService newsService;
@Autowired
public NewsPortlet(NewsService newsService) {
this.newsService = newsService;
}
@RequestMapping(method = RequestMethod.GET)
public String view(Model model) {
model.addAttribute(newsService.getLatests(10));
return "news";
}
}
ここでは、NewsService が自動的にコントローラーに挿入されます。view メソッドはモデルに List オブジェクトを追加します。これは JSP で ${newsList} として利用可能になります。Spring はメソッドの戻り値に基づいて news.jsp という名前のビューを探します。RequestMapping は、このコントローラーがポートレットの VIEW モード用であることを Spring に伝えます。
XML 設定で必要なのは、ビューとコントローラーの場所を指定することだけです。
<!-- look for controllers and services here -->
<context:component-scan base-package="com.example.news"/>
<!-- look for views here -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/news/"/>
<property name="suffix" value=".jsp"/>
</bean>
既存のアプリケーションにポートレットを単純に埋め込みたい場合は、次のようなポートレット コンテナをバンドルできます。 エクソ, 太陽, 、 または アパッチ. 。アプリケーションをポートレットのセットとして構築したい場合は、次のような本格的なポータル ソリューションを検討するとよいでしょう。 ライフレイポータル.
他のヒント
タイルは面倒かもしれません。以前のものと比べて大幅に改善されました (例:何もありません)、むしろ制限的です。
ウィケット JSP に落ち着いていない限り、あなたが探しているものはもっとあるかもしれません。
私は大ファンです GWT. 。これにより、コンポーネントを通常の Java クラスとして記述し、それらを自由にページに挿入できるようになります。最終的にはすべてが JavaScript にコンパイルされます。
以下に例を示します。
public class MyApplication implements EntryPoint, HistoryListener
{
static final String INIT_STATE = "status";
/**
* This is the entry point method. Instantiates the home page.
*/
public void onModuleLoad ()
{
RootPanel.get ().setStyleName ("root");
initHistorySupport ();
}
private void initHistorySupport ()
{
History.addHistoryListener (this);
// check to see if there are any tokens passed at startup via the browser’s URI
String token = History.getToken ();
if (token.length () == 0)
{
onHistoryChanged (INIT_STATE);
}
else
{
onHistoryChanged (token);
}
}
/**
* Fired when the user clicks the browser's 'back' or 'forward' buttons.
*
* @param historyToken the token representing the current history state
*/
public void onHistoryChanged (String historyToken)
{
RootPanel.get ().clear ();
Page page;
if (Page1.TOKEN.equalsIgnoreCase (historyToken))
{
page = new Page1 ();
}
else if (Page2.TOKEN.equalsIgnoreCase (historyToken))
{
page = new Page2 ();
}
else if (Page3.TOKEN.equalsIgnoreCase (historyToken))
{
page = new Page3 ();
}
RootPanel.get ().add (page);
}
}
私は Ajax JSF (IceFaces) や Liferay Portal と組み合わせたポートレットの経験が豊富ですが、誰にもお勧めしません。チュートリアルを読むとすべてがうまくいき、実際には地獄のように見えます。もちろん、Spring MVC と JSP を使用すると、はるかに便利で軽量になると思いますが、いずれにしても、ポートレットは十分にサポートされているテクノロジーではありません。
この文脈での「再利用可能なコンポーネント」が何を意味するのかは 100% わかりませんが、バナー、フッター、ナビゲーション リンクなど、特定の共通要素をすべてのページに表示したいということであれば、これ以上探す必要はありません。 サイトメッシュ. 。私のチームは、いくつかの国際化された Web アプリケーションでこれを使用して成功しました。
タペストリー は、再利用可能なコンポーネントを簡単に作成することに重点を置いた Java Web アプリ フレームワークです。
私は sitemesh を使用しました。標準のヘッダーとフッターで一連のページをラップするのには適していますが、多くのページで (おそらくページごとに何度も) 使用されるコンポーネントを作成するには、Tapestry の方が適しています。タペストリー コンポーネントは他のコンポーネントをパラメータとして受け取ることができるため、Sitemesh スタイルのラッピングが可能になります。