Struts 2とOGLL(投影フィルタリング)およびpojo依存注入の方法


ORM(ここではhibernateを例に挙げる)のオブジェクト関連は、オブジェクト間のナビゲーションを明確にします.開発者にとって、優雅さと実用性を感じています.
Ormの関連を通して、私たちはもうsqlと付き合う必要はありません(これも必ずしもそうではありません.私の見方は決してどちらを無理に使うのか、どちらが適当なのか、どちらを使うのかです).
私たちはそれに関連する相手をかなり簡単に手に入れることができます.もちろん取り出したデータはページに表示してユーザーに見せます.ここがOgnl顕神通の場所です.
Ognlはスクリプト言語で、弱いタイプで、実行時にオブジェクトタイプを判断できます.Struts 2ラベルとの組み合わせはかなりいいです.以前javaeyeにstruts 2シリーズのチュートリアルがありましたが、著者のOgnlの紹介はとてもいいです.暇があれば、みんな見てもいいです.
今日はケースを検討します.
駅構内の手紙類があります.私たちはそれをMessageと呼んでいます.以下のようにします.
   public class Message implements java.io.Serializable
	{

		// Fields

		private Integer id;
		private User user;//   
		private Integer fromId;//   Id
		}

メッセージMessageとUserクラスには2つの関連があるが,当時は1対多の関連を一度に設計しただけで,送信者は直接Idを使用していたため,ナビゲーションの優位性を失った.
しかし、私はページに関連情報を表示するとき、例えば送信者の顔headIcon、名前などを表示したいのですが、Messageにはこのフィールドはありません.getUser()などのナビゲーションでは得られません.つまり、接続クエリーを表示してfromIdオブジェクトを取得する必要があります.
そこで私は別の解決策を考えました
すなわち、ページではMessage中のfromIdにより会員オブジェクトを取得する、ロードされたUserオブジェクトによりheadIconを取得する.
このとき、PageHelperコードと呼ばれる新しいクラスを書きました.
package com.snail.commons.util;
import org.apache.log4j.Logger;
import com.snail.commons.basedao.IBaseDAO;

public class PageHelper 
{
	private IBaseDAO baseDAO;//          
	public PageHelper(IBaseDAO baseDAO)
	{
		this.baseDAO=baseDAO;
	}
	private final static Logger logger=Logger.getLogger(PageHelper.class);
	/*
	clz:String     (    ,  import com.snail.commons.beans.User)
	id :integer      id
	*/
	public  Object loadEntity(String clz,Integer id)
	{
		Class temClz=null;
		try {
			 temClz=Class.forName(clz);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		Object obj=baseDAO.findEntity(temClz, id);
		return obj;
	}
	}

このクラスにより、必要なクラスを動的にロードし、対応する永続化オブジェクトを取得できます.
ページで呼び出す方法を見てみましょう.
	<s:property value="(new com.snail.commons.util.PageHelper(baseDAO)).loadEntity('com.snail.component.beans.User',fromId).headPic"/>

まずPageHelperクラスをインスタンス化します.Ognl式では全クラス名を使用し、次にメソッドを直接呼び出す必要があります.
もちろんloadEntityを静的メソッドとして定義することもできます.それに応じて、
<s:property value="@com.snail.commons.util.PageHelper@loadEntity('com.snail.component.beans.User',fromId).headPic"/>

もちろん、上記の例では、構築方法によってbaseDAOオブジェクト(第1の呼び出し方法)に転送してもよいし、(パラメータによってbaseDAOを転送してもよいが、ここでの例は示されていない)Ognl静的方法呼び出しの一例にすぎない.
(個人的には上記の案がMVCのエンベロープ層を破壊したような気がします.これはデータベースがService層を通って直接展示層に着いたことに相当します.同僚の効率も大きく割引されています.私が100の情報を表示するには、Sql操作を100回呼び出さなければならないと仮定します.
対応するUserオブジェクト.n+1の問題に似ています);
RailsにはApplicationHelperヘルプがあります.私はとても良いと思います.ページの表現能力を強化しました.私たちはページでApplicationHelperの公開方法を呼び出すことができます.例えば、規定の長さの文字を切り取るなどの機能を実現することができます.もちろんstrutsではラベルで実現したり、既存のラベルの組み合わせで類似の機能を実現したりすることができます.しかし、面倒なので、静的な方法を呼び出すことができますか?
ognlは、ApplicationHelperのような実用的なクラスを提供しています.
たとえば、PageHelperというクラスを新規作成できます.静的メソッド===があります.

public static String substring(String str,List params)
			{
				
				 if(params.size()==1)
					 {
						 Integer end=(Integer)params.get(0);
					     return str.substring(0,end<=str.length()?end:str.length());
					 }
				 else if(params.size()==2)
					 {
						 Integer start=(Integer)params.get(0);
						 Integer end=(Integer)params.get(1);
						  return str.substring(start,end<=str.length()?end:str.length() );
					 }
				 return str;
			}

ページで直接呼び出すことができます
<s:property value="@com.snail.commons.util.PageHelper@sustring('abc',{})"/>

これにより、文字の切り取り機能が実現されます.また、上のコードの「{}」は、新しいリストオブジェクトを表しています.簡潔でしょう.エンognlは多くの動的言語の特性を持っています.
また、私が知りたいのは、普通のPojoクラスでspringのbeanをどのように手に入れるか、そしてこのクラスは私たち自身が直接インスタンス化したものです.どなたかご存知の方がいらっしゃいましたら、お知らせください.([color=orange]は後になってやっと頭を整理し、この問題を解決すれば、富領域モデルの問題も解決した.
富領域モデルの問題についてjavaeyeは多くのことを議論し、hibernateモジュールには多くのエッセンスが貼られている.私はここでその優劣を議論しないで、ただいくつかの実現案を提出します:
1つ目:
ps:最高の案です
spring 2.0以降、aspectjで静的織り込み持続化ツールクラスをサポートしていますが、ここでは展開しません.springドキュメントを参照してください(別の文で詳しく説明するかもしれませんが)、唯一不快なのは何ですか.
javaagent=aspectj jarパッケージパスの設定
2つ目:
ps:煩わしいですが、新しいプロジェクトに対しても保険的で、制御性が高いです.
pojoクラスにセットメソッドを設定し、そのpojoを使用するたびに、永続化ツールクラスをセットします.その後、pojoクラスのメソッドは永続化機能を持っています.または、厳密には、Pojoクラスごとに永続化ツールクラスを使用する方法は、すべて永続化ツールクラスを1つのパラメータとします.
3つ目:
ps:テクニックがある
あなたのpojoが誰によって生成されたかにかかわらず、あなたの静的メンバーはいつもすべてのインスタンスを共有しているでしょう.私があなたの静的メンバーに永続化ツールクラスを設定すれば、すべてのpojoインスタンスを共有することができます.
この実装スキームは2つあります.
No 1:springによりpojoのロード時の静的メソッドをブロックし、値を付与します.これで手間が省けるけど
No 2:3つのクラスがあり、A,B,C,Aはspringでロードし、ApplicatioContextAwareインタフェースを実現し、contextを注入する.クラスBにはset属性で注入される静的ドメインがある.これはよく理解できないかもしれませんが、例を挙げてみましょう.

@Component
public class B
{
  private static ApplicationContext context;

 
  @Autowired(required = true)
  public void setUserAccessor(A a) {
    B.context = a.context;
  }
}

これは少し理解しやすいはずだ.
次にCクラスではBの静的ドメインを直接使用することができます.素晴らしいですね.
これによりspring管理に帰らない独自のインスタンス化されたクラスに多くの東を注入することができます.
再びps:個人的にはこの案が一番簡潔であることが好きです.
4つ目:
ps:hibernate独自のソリューション
参観できるhttps://www.hibernate.org/182.html
このスキームはhibernateブロッキングによりpojoクラスをロードする際に注入する.
もちろん行きますよ.他の案はgoogleでもいいですよ.
[/color])
Ognlのもう一つの重要な使い方は投影とフィルタリングである.ネットでは少ないようです.ここでお話しします.
最初の例は、1つの数字をどのように反復するか、最も簡単なのはページ分け、私のpageSize=7、どのように7つのOptionを反復するか、以下のようにします.
<select>
	<s:iterator value="pageSize.{#this}" status="sta">
  <option> <s:property value="#sta.index+1"/></option>
	</s:iterator>
	</select>

上にポイントがありますこれはフィルタリング操作であり、得られるのは集合である.thisは、現在反復中のオブジェクトを指します.前の#は言うまでもなく、ognl本省の文法に必要なものです.
3より大きい数を反復したいとしたら
こんな時に{#this>3}
      
onglのフィルタリングと投影操作を組み合わせることで、ページにも強力な論理操作とフィルタリング機能があります.
少し複雑な例を見てみましょう
3つのクラス
Gequ(歌曲),Gequzhuanji(歌曲专辑),Gequgequzhuanji(歌曲专辑中间表).
Gequ=>Gequgequzhuanji一対多関係
Gequzhuanji=>Gequgequzhuanji一対多関係
今私はGequgequzhuanjiの集合を手に入れて、この集合に対して私は所有者がmasterのアルバムの名前を表示したいと思って、しかも最初だけです.
次のコードを実装できます.

  <s:property value="gequgequzhuanjis.{^#this.gequzhuanji.huiyuan.name eq  'master')}[0].zhuanJiMing" default="  "/>

説明しましょう.
明らかに{}はフィルタ処理です.フィルタリングにより得られるものも集合であり、この結合には[n]操作である要素を取得し、最終的に通過する必要がある.属性値を取得します.
简単に
うん、はっきり言ったよ.ognlの公式ドキュメントを参照してください.個人的にはOgnlは強力なスクリプト言語だと思います.基本タイプ==など、一般的なオペレータをサポートし、オブジェクト比較で使用できます.
eqとか.伝統的なMVC構造の中で、V層は少しやせているクライアントの感じがして、時には彼を太らせることができます!(*^^*)ふふ…