DL/ Spring 2.0.3

via http://www.springframework.org/download
choose spring-framework-2.0.3-with-dependencies.zip

place those included jar to "Program Files\All-In-One-Eclipse\plugins".
import
spring.jar, log4j.jar, commons-logging.jar, aopalliance.jar to project from \plugins.dl tomcat-5.5.zip, get the servlet-api.jar. and set the jar into the project as well.

but, it is wrong process to set tomcat.servlet-api.jar.
it was weblogic.jar whose includes servlet.jar and etc, that should be set.

additionaly, the jar was ok to set under the project directory.
but, other jar like spring.jar should be set under the web-inf/lib. coz jar like spring.jar also have to be deployed.
but the servlet.jar was used for compiling. and the same thing was the welogic system.
if let the servlet.jar included in project directly,
it means there would be two instance of servlet.class. and cause the cast err.
these things all about j2ee.

2012/8/22
Spring Framework Download

本家からDLしようとするとアカウント登録を強要されるが御免被りたい時はSourceForgeから直にDLすれば良い
SourceForge.JP > ソフトウェアを探す > Spring Framework > ダウンロードファイル一覧
http://sourceforge.jp/projects/sfnet_springframework/releases/

ただし、最新のは本家にしかない模様
http://www.springsource.org/download/

tag:
Spring Framework Download sourceforge

ref:
http://edocs.beasys.co.jp/e-docs/wls/docs92/messaging.html
http://www.beasys.co.jp/e-docs/wls/docs92/programming/classloading.html
http://edocs.beasys.co.jp/e-docs/wls/docs92/notes/new.html#JMS

tag : Spring Framework Download sourceforge

2011-05-21 16:38 : __fw__spring : コメント : 0 : トラックバック : 0 :

LINKS/ Spring

■Main Home
□Index of /spring
http://static.springframework.org/spring/

--------------------------------------------------
■Releases, News
□Spring Content on InfoQ
http://www.infoq.com/jp/spring

□Spring 2.0: What's New and Why it Matters
Rod Johnson, Jan 15, 2007
http://www.infoq.com/articles/spring-2-intro

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

tag : LINKS

2009-06-13 01:47 : __fw__spring : コメント : 0 : トラックバック : 0 :

Spring/SWF/ flow definition for download

【*】ゴール
ブラウザからPDFファイルをJasperでダウンロードしてから
ダウンロード時のブラウザに戻る

【*】問題
ファイルをダウンロードし終えると ブラウザが死んでる
∵flow-stateがダウンロード時のstartStateでなく
 ダウンロード完了時のgenerateJasperになってる

【*】コード
 <'view-state id="startState" view="startPage.jsp">  
  <'transition on="jasperReport" to="prepareJasperParameters"/>
 <'/view-state>

 <'action-state id="prepareJasperParameters">
  <'action bean="jasperActions" method="prepareJasperParameters"/>
  <'transition on="success" to="generateJasper"/>
 <'/action-state>

 <'view-state id="generateJasper" view="reportView">
  <'transition on="??" to="??"/>
 <'/view-state>
 
 reportView = org.springframework.web.servlet.view.jasperreports.JasperReportsMultiFormatView
 
【*】方法①
generation requestを別コントローラに送る
SpringMVCControllerをカスタムするでも
SubFlowとして切り出すでも可

【*】方法②
continuation-based flow execution repositoryを使う

ref:
http://forum.springframework.org/showthread.php?t=23382

tag : Spring SWF webflow continuation-based

2009-02-19 00:48 : __fw__spring : コメント : 0 : トラックバック : 0 :

Spring/ 2.0/ What's the big picture in Spring 2.0?

Spring began in february 2003.
Spring2.0 went final in october 2006.

【*】pictures in Spring2.0
・設定拡張
 extensible XML configurationをサポート。
 属性のカスタマイズやBeanの新しいアブストラクトレベルが設定可能に。
 新規タグの提供に記述もシンプルに。
・AOP強化
 パワフルでシンプルに。
・Java 5対応 
・Bean強化
 GroovyやJRuby、Beanshell対応のBean?
 DIやAOPに有効?
 よう分からん。
・その多もろもろ
 ポートレットMVC やら メッセージドリブンPOJO やら Java Persistence APIを含む新規APIの統合 やら 非同期実行やら。
 *JPAゆうことはEJB3.0と連携したゆうことか?

【*】works still going
・IoCコンテナの拡張
・試験サポート
Spring機能をAspectJでの提供


ref:
InfoQ
http://www.infoq.com/articles/spring-2-intro

tag : Spring 2.0

2009-02-08 20:43 : __fw__spring : コメント : 0 : トラックバック : 0 :

Spring/ サーバ停止時にNPE

■背景
Spring使用のWEBアプリ
PiyoPiyoクラスにstaticメソッドあり

■現象
PATTERN A
デプロイ
※PiyoPiyoクラスをprototypeスコープでBean定義
サーバ始動
サーバ停止
(もしくはオートデプロイ)
→NullPointerException

PATTERN B
デプロイ
※PiyoPiyoをsigletonスコープでBean定義
サーバ始動
サーバ停止
(もしくはオートデプロイ)
→エラーなし

PATTERN C
デプロイ
※PiyoPiyoをprototypeスコープでBean定義
サーバ始動
リクエスト実行
サーバ停止
(もしくはオートデプロイ)
→エラーなし

■ログ
-error--------------------------------------------------------------------------
2008/10/08 00:00:11 org.apache.coyote.http11.Http11BaseProtocol pause
情報: Coyote HTTP/1.1を http-8080 で一時停止します
2008/10/08 00:00:12 org.apache.catalina.core.StandardService stop
情報: サービス Catalina を停止します
2008/10/08 00:00:12 INFO [/hoge] - Destroying Spring FrameworkServlet 'hoge'
...
java.lang.NullPointerException
...
at hoge.PiyoPiyo(PiyoPiyo.java:18)
...
at org.apache.catalina.loader.WebappClassLoader.clearReferences(WebappClassLoader.java:1615)
at org.apache.catalina.loader.WebappClassLoader.stop(WebappClassLoader.java:1496)
...
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
-/error-------------------------------------------------------------------------

■原因
PATTERN A
prototypeでクラスロード時には、インスタンスは生成されないため、staticメソッドも呼ばれない。
結果、アンロード時に始めてstaticメソッドが呼ばれるが、
staticメソッド内で使うクラスのアンロードと順序が前後してしまい、
staticメソッドでstaticメソッド内で使う筈のクラスがNotFoundとなってしまう。

PATTERN B
singletonスコープなため、ロードにインスタンスが生成される。その際にstaticメソッドも呼ばれる。
この段階では、staticメソッド内で使う筈のクラスもクラスローダに読み込まれているので、NotFoundは生じない。
アンロード時でも、staticメソッド内で使う筈のクラスが既にアンロードされていても、
staticメソッドが再度呼ばれることはないので、NotFoundにはならない。

PATTERN C
prototypeでクラスロード時には、インスタンスは生成されないため、staticメソッドも呼ばれない。
しかし、リクエストを投げた時点でprototype指定のクラスは正式にインスタンス化され、
その際に、staticメソッドも呼ばれる。
この段階ではstaticメソッド内で使う筈のクラスは、クラスローダに読み込まれているので、NotFoundは生じない。
また、アンロード時にstaticメソッドが呼ばれることもないため、パターン②と同様に、NotFoundにはならない。

■結論
Beanのスコープをsingletonにすれば、本現象は回避できる。
singletonに出来ないんであれば、staticメソッドを変更せよ!

■追記
※staticメソッドとかでファイル読み込みは特にNG!
∵Tomcat#org.apache.catalina.loader.WebappClassLoader#stop()は
 ファイル群を消した後に、jarファイル群を消す。

-WebappClassLoader------------------------------------------
1488 /**
1489 * Stop the class loader.
1490 *
1491 * @exception LifecycleException if a lifecycle error occurs
1492 */
1493 public void stop() throws LifecycleException {
1494
1495 // Clearing references should be done before setting started to
1496 // false, due to possible side effects
1497 clearReferences();
1498
1499 started = false;
1500
1501 int length = files.length;
1502 for (int i = 0; i < length; i++) {
1503 files[i] = null;
1504 }
1505
1506 length = jarFiles.length;
1507 for (int i = 0; i < length; i++) {
1508 try {
1509 if (jarFiles[i] != null) {
1510 jarFiles[i].close();
1511 }
1512 } catch (IOException e) {
1513 // Ignore
1514 }
1515 jarFiles[i] = null;
1516 }
1517
1518 notFoundResources.clear();
1519 resourceEntries.clear();
1520 resources = null;
1521 repositories = null;
1522 repositoryURLs = null;
1523 files = null;
1524 jarFiles = null;
1525 jarRealFiles = null;
1526 jarPath = null;
1527 jarNames = null;
1528 lastModifiedDates = null;
1529 paths = null;
1530 hasExternalRepositories = false;
1531 parent = null;
1532
1533 permissionList.clear();
1534 loaderPC.clear();
1535
1536 if (loaderDir != null) {
1537 deleteDir(loaderDir);
1538 }
1539
1540 }
-/WebappClassLoader------------------------------------------

ref:
http://webui.sourcelabs.com/tomcat/issues/41059
http://www.docjar.com/html/api/org/apache/catalina/loader/WebappClassLoader.java.html

tag : spring bean NPE

2008-10-17 07:41 : __fw__spring : コメント : 0 : トラックバック : 0 :

[case study] transaction types

■abs
commit or rollback??

■env+conditions
□operation flow

opeA→opeB→opeC

ParentBean#test(){
 opeA;
 ParentBean.childBean.test();
 opeC;→EXCEPTION!!!
}
ChildBean#test(){ opeB }

□relations

childBean -DI→ parentBean

□bean def file

<'bean id="parentBean" class="ParentBean">
 <'property name="childBean" ref="childBean"/>
<'/bean>
<'bean id="childBean" class="ChildBean"/>

□bean def file (transaction)

 <'bean id="applyTransactionAttribute"
    class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
  <'property name="properties">
  <'props>
   <'prop key="test">PROPAGATION_REQUIRED<'/prop>★
  <'/props>
 <'/property>
 <'/bean>

 <'bean id="autoProxy"
  class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
  <'property name="interceptorNames">
   <'list>
    <'value>applyInterceptor<'/value>
   <'/list>
  <'/property>
  <'property name="beanNames">
   <'list>
    <'value>parentBean<'/value>
    <'value>childBean<'/value>
   <'/list>
  <'/property>
 <'/bean>

■case study
PROPAGATION_REQUIRED―既存トランザクションを流用
 opeA: 新規トランザクションAを生成
 opeB: 既存トランザクションAがあるので そいつを流用
 opeC: opeA時に生成されたトランザクションAをそのまま使用
 ↓
 opeCでEXCEPTIONが発生した場合
 opeAもopeBもロールバックされる。

PROPAGATION_REQUIRES_NEW―常に新規トランザクション
 opeA: 新規トランザクションAを生成
 opeB: 新規トランザクションBを生成
    この時 トランザクションAは消える
 opeC: 新規トランザクションCを生成
    この時 トランザクションBは消える
 ↓
 opeCでEXCEPTIONが発生した場合
 opeAは トランザクションAがコミットされる前に消されるので コミットされない
 opeBは トランザクションBが無事終了するのでコミットされる
 opeCは 普通にロールバックされる
 
PPROPAGATION_NESTED―子トランザクションを利用
 [bean def file (transaction)]を変更し childBeanにはPPROPAGATION_NESTEDを指定
 opeA: 新規トランザクションAを生成
 opeB: 新規トランザクションBを生成
    この時 トランザクションAは消える
 opeC: 新規トランザクションCを生成(たぶん)
    この時 トランザクションBは消える
 ↓
 opeCでEXCEPTIONが発生した場合
 opeAは トランザクションAがコミットされる前に消されるので コミットされない
 opeBは トランザクションBが無事終了するのでコミットされる
 opeCは 普通にロールバックされる



ref:
http://8318.blog100.fc2.com/blog-entry-225.html

tag : PPROPAGATION_NESTED PROPAGATION_REQUIRES_NEW PROPAGATION_REQUIRED

2008-07-29 07:36 : __fw__spring : コメント : 0 : トラックバック : 0 :

Spring Framework: Best Programming Practices Part 2

ベストプラクティスその2!
その2もSpringコアパッケージとその他便利パッケージにフォーカス。
その1~5も参考にどうぞ。
あ、間違ってたら教えて。
(This is the second part of Spring Best Practices series as per Best practices introduction post. This second part is also related with the best practices when using Spring’s Core classes and other utilities. You can refer the other four posts through this links… Part 1, Part 3, Part 4 and Part 5. I am expecting the corrections (if any)as well as the new best ways from my readers.)
--------------------------------------------------------------------------------
* 異なるロケーションでのApplicationContextの設定
* Configuring Spring Application context for different locations:
--------------------------------------------------------------------------------
開発マシン以外の環境設定が同じなら、違うやつだけを定義した別設定ファイルを用意。
(If the configuration is the same for all the environments except for the developer’s machine,
then make (a) separate configuration file(s) with the configuration that is different. )

で、違うやつの設定で、共通のやつを上書きするような定義をする。
(Let this different configuration overwrite the definition(s) in the original file(s).)
注意:上書きした設定は、親設定を参照して他の奴らにも影響するからね。
Make sure this different configuration will never be placed in the other environments!!!
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
Example of how to achieve this if you use the org.springframework.context.support.ClassPathXmlApplicationContext:
※便宜上、Beanには全部ユニークなIDを割り振り中。後でRefし易いように。
(Note: I give every example file below a unique name, so I can easily refer to it.Contents of beanRefContext.xml:)
<'beans>
  <'bean
    id=”aBeanId”class=”org.springframework.context.support.ClassPathXmlApplicationContext”>
    <'constructor-arg>
      <'list>
        <'value>
          /spring/applicationContext-forAllTheEnvironments.xml
        <'/value>
        <'value>/spring/applicationContext-local.xml<'/value>
      <'/list>
    <'/constructor-arg>
    <'constructor-arg>
      ref bean=”frameworkApplicationContextId”/>
    <'/constructor-arg>
  <'/bean>
<'/beans>
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
configLocations(1っこめのコンストラクタ引数)に定義したBeanで、applicationContext(2こめのコンストラクタ引数)に定義したBeanを上書き。
(Beans defined in the config locations (first constructor-arg) overwrite the beans in the parent application context (second constructor-arg).)
このクラスのJavaDocによれば、複数のcouficLocationがある場合、後に定義されたBeanが、先に定義されたものを上書く。他のXMLファイルを経由したBeanでも上書き可能。
(Quote from the JavaDoc of this class “In case of multiple config locations, later bean definitions will override ones defined in earlier loaded files.
This can be leveraged to deliberately override certain bean definitions via an extra XML file.”

--------------------------------------------------------------------------------
* 動的ポイントカットより静的ポイントカット
* Prefer static pointcut over dynamic point cut :
--------------------------------------------------------------------------------
XXX
In Spring’s book of definitions static point cut refers to a pointcut that can be evaluated when a proxy is created.
Criteria for static point cuts can not changed afterwards.
Dynamic point cuts depend on runtime information such as arguement values or call stack.
Dynamic pointcuts are slower to evaluate than static pointcuts and allow less potential for optimization.
It’s always necessary to evaluate them on each invocation.


--------------------------------------------------------------------------------
* Use regular expression advisors to fine tune interceptor scope
--------------------------------------------------------------------------------
TODO
Instead of using broad method point cuts and filtering target methods in interceptor,
use more sophisticated and elegant regular expression at the application context level.
Spring supports three types of regex method point cuts:
・ org.springframework.aop.support.JdkRegexpMethodPointcut : Java 1.4 regular expression for the fully-qualified method names to match.
・ org.springframework.aop.support.Perl5RegexpMethodPointcut : Perl5 regular expression for the fully-qualified method names to match
・ org.springframework.aop.support.RegexpMethodPointcutAdvisor : Convenient class for regexp method pointcuts that hold an Advice, making them an Advisor.
By default, JdkRegexpMethodPointcut will be used on JDK 1.4+, falling back to Perl5RegexpMethodPointcut on JDK 1.3 (requiring Jakarta ORO on the classpath).

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
Example:
<'bean id=”crudInterceptor” class=”com.mycompany.CrudInterceptor” />
<'bean
  id=”crud”class=”org.springframework.aop.support.RegexpMethodPointcutAdvisor”>
  <'property name=”advice”>
    <'ref local=” crudInterceptor “ />
  <'/property>
  <'property name=”patterns”>
    <'value>.*create.*,.*destroy.*,.*get.*,.*update.*<'/value>
  <'/property>
<'/bean>
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
--------------------------------------------------------------------------------
* 大きいアプリにはオートプロキシが有効
* Use autoproxying for large applications
--------------------------------------------------------------------------------
ProxyFactoryBeanは、小さいアプリにはよいが、設定がくどい。
コントローラごとに違ったプロキシの設定が可能。
プロキシでコード軽減!
SpringのTransactionProxyFactoryBeanや LocalStatelessSessionProxyFactoryBeanで、ProxyFactoryBeanが楽に使える。
(ProxyFactoryBean works well for small application but it requires more verbose configuration.
It allows control over every aspect of the proxy.
Spring ease the use of ProxyFactoryBean by providing dedicated proxies such as TransactionProxyFactoryBean and LocalStatelessSessionProxyFactoryBean.
Proxies also saves code duplication in configurations.)

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
Example:
<'bean id=”myProxy”
  class=”org.springframework.aop.framework.ProxyFactoryBean”
  abstract=”true”>
  <'property name=”interceptorNames”>
    <'list>
      <'value>interceptor1<'/value>
      <'value>interceptor2<'/value>
    <'/list>
  <'/property>
<'/bean>
<'bean id=”mybean” parent=”myProxy”>
  <'property name=”proxyInterfaces”>
    <'value>com.mycompany.mybean<'/value>
  <'/property>
  <'property name=”target”>
    <'bean class=”com.mycompany.MyBeanImpl”>
      <'property name=”name”>
        <'value>Dave<'/value>
      <'/property>
      <'property name=”description”>
        <'value>Good Boy<'/value>
      <'/property>
    <'/bean>
  <'/property>
<'/bean>
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
上記みたいに子供Beanの定義は、myProxyのような特定の定義を継承できる。子供Beanには、さらにプロパティを足すのが普通。proxy interfacesみたいに。
(Here number of child bean definitions can “extend” the myProxy definition, specifying a target, usually inner bean.
They can optionally add further properties, such as proxy interfaces. )


オートプロキシって要は、設定次第で、複数オブジェクトにプロキシしちゃうもので、BeanNameAutoProxyCreatorかDefaultAdvisorAutoProxyCreatorで作成可能。
(Autoproxying means that depending on some configuration, proxying is applied consistently to a number of objects.
Autoproxy can be created using BeanNameAutoProxyCreator or DefaultAdvisorAutoProxyCreator. )

BeanNameAutoProxyCreatorは、複数個のProxyFactoryBeanの代わりに使うんに良くて、DefaultAdvisorAutoProxyCreatorは、パワフル。
(BeanNameAutoProxyCreator is good for replacing several ProxyFactoryBean. DefaultAdvisorAutoProxyCreator is powerful. )
DefaultAdvisorAutoProxyCreatorは、コンテキストに定義した通りに、ターゲットオブジェクトと合致するポイントカットメソッドがあるか、全アドバイザーを監視。BeanNameAutoProxyCreatorのインタセプタのリストに、アドバイザとアドバイス。 DefaultAdvisorAutoProxyCreatorには、アドバイザ。
(It examines all advisors defined in current context for mathcing pointcut methods on target object. Both advisor and advices and be used in BeanNameAutoProxyCreator interceptor list. DefaultAdvisorAutoProxyCreator strictly requires Advisors. )
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
Examples:BeanNameAutoProxyCreator :
<'bean id=”bnProxyCreator”
  class=”org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator”>
  <'property name=”beanNames”>
    <'value>bean1,mybean*<'/value>
  <'/property>
  <'property name=”interceptorNames”>
    <'list>
      <'value>advisor1<'/value>
      <'value>interceptor1<'/value>
    <'/list>
  <'/property>
<'/bean>
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
Examples:DefaultAdvisorAutoProxyCreator :
<'bean id=”daaProxyCreator”
  class=”org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator” />
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
オートプロキシのcreatorのBeanの定義は、アプリのコードや他のFWのオブジェクトからのアクセスには関係なく、他のBean定義の効能を左右するもの。
オートプロキシは、トランザクション定義にも使える。
(An autoproxy creator bean definition is intended to change the effect of other bean definitions,
not for access by application code or other framework objects. Autoproxy can be used to define transactions as well.)
トランザクションのロールバックについて
デフォルトのトランザクションは、ランタイム例外時のみロールバックして、チェックした例外ではしない。
が、必要に応じて、ロールバックさせたい例外をチェックして業務ロジックをロールバックさせるようにするのもヨイ練習。
例外にマイナス記号をつければ、ロールバックされる。
(15. Specify Transaction Rollback:
By default transactions are rolled back only on runtime exceptions and not on checked exceptions.
However it is a good practice to choose specific checked exceptions where you want the transaction to be rolled back based on business needs. Exceptions marked with negative (-) sign cause transaction to be rolled back.)

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
Example:
<'bean id=”businessBean”
  class=”org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource”>
  <'props>
    <'prop key=”businessMethod1″>
      PROPAGATION_REQUIRES_NEW,ISOLATION_REPEATABLE_READ,-RollBackBusinessException
    <'/prop>
  <'/props>
  <'/property>
<'/bean>
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
ロールバックを回避するためにランタイム例外を設定するのも可だが、意に沿わない動きをしてまわないよう要注意。
(You can even mark runtime exceptions as positive to prevent rollbacks but be careful while doing so as it could have adverse affects.)

--------------------------------------------------------------------------------
* Aware of thread safe issues with AOP advice
--------------------------------------------------------------------------------
アドバイスインスタンスは複数スレッドでよう流用されるから、スレッドセーフかに注意すべし。
例えば、メソッドインタセプタが、ユニークなIDやカウントに対応したものなら、カウントをインクリメントするために、シンクロナイズドされたメソッド変数をスレッドローカルに用意する。
(Advice instances are most often shared among threads, so we need to consider thread safety issues. For example if the method interceptor is responsible for generating unique id or count, then consider using ThreadLocal variable with synchronized method for incrementing the count.)
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
Example:
public class CountingMethodAdvice implements MethodInterceptor {// The next serial number to be assigned
 private static long nextSerialNum = 0;
 private static ThreadLocal serialNum = new ThreadLocal() {
  protected synchronized Object initialValue() {
   return new Long(nextSerialNum++);
  }
 };
 private static long getCount() {
  if(serialNum!=null){
   return ((Long) (serialNum.get())).longValue();
  }
 }
 public Object invoke(MethodInvocation methodInvocation) throws Throwable {
  System.out.println(”This method is called ” + getCount + ” times”);
 }
}
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・


Lijin’s Localhost
http://lijinjoseji.wordpress.com/2007/09/27/spring-framework-best-programming-practices-part-2/

tag : AOP autoproxy XXX Spring

2008-04-23 23:14 : __fw__spring : コメント : 0 : トラックバック : 0 :

AOP

□Proxy
Proxyの生成方法
ProxyFactoryBeanを使う
autoproxyを使う
 →コンテナがロードされた時に自動的にAOP Proxyが作成される
  仕掛け
  コンテナがBeanのインスタンスを作るたびにコールバックされるBeanPostProcessorのメソッドを利用
  そこでBeanをいろいろと細工→ProxyFactoryに食わせてる?

autoproxy
autoproxyの使用方法
autoproxy createorを使う
②ソースレベルのメタデータを使う

autoproxy creator
autoproxy creatorの使用方法
autoproxy(AbstractAutoProxyCreator)の実装クラス2つあり
BeanNameAutoProxyCreator
 指定された名前(要素のid属性やname属性)のBeanに対してAspectをWeavingしてくれるautoproxy creator
 →多数のBeanに対して1つ以上のmethodInterceptorを適用できる
 ProxyFactoryBean同様、interceptorNamesというpropertyに 適用させるAspect(interceptor/advice)を指定する

DefaultAdvisorAutoProxyCreator
 eXtreamでpowerfulなautoproxy creator
 BeanにマッチするPointcutを片っ端から適用する
 マッチするものが無い場合 targetのBeanはプロキシされない
 # SpringのPointcutは、ClassFilterとMethodMatcherから構成されるからできること
 →target毎に要設定?
 ※DefaultAdvisorProxyCreatorで適用できるのはAdvisorだけで Interceptorはダメ!
 (InterceptorはAroundAdviceでPointcutを持っていないから)


ref:
http://d.hatena.ne.jp/koichik/20040413

tag : autoproxy ProxyFactoryBean AbstractAutoProxyCreator BeanNameAutoProxyCreator DefaultAdvisorAutoProxyCreator

2008-04-17 00:38 : __fw__spring : コメント : 0 : トラックバック : 0 :

AOP SAMPLE

■Sample
□composition
/autoproxy
|-/bin
|-/src
| |-/samplepackage
| | |- HelloOne.java
| | |- HelloTwo.java
| | |- HelloThree.java
| | |- HelloAdvice.java
| | |- Practitioner.java
|-/conf ・・・ 設定ファイル格納フォルダ
| |- applicationContext.xml
| |- log4j.xml
|-/lib ・・・ ライブラリ(外部JAR)フォルダ
| |- asm-attrs.jar
| |- cglib-2.1.3.jar
| |- commons-logging-1.0.4.jar
| |- log4j-1.2.11.jar
| |- spring-aop.jar
| |- spring-beans.jar
| |- spring-context.jar
| |- spring-core.jar

<'!-- ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ -->
□Step01
AOPをかける対象クラスを作成する。
対象クラス
・HelloOne.java
・HelloTwo.java
・HelloThree.java

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
package samplepackage;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* HelloOneクラス.
*/
public class HelloOne {

  /** ロギング */
  private Log logger = LogFactory.getLog(HelloOne.class);
  /** メッセージ */
  private String message;

  /**
   * @return message を戻す。
   */
  public String getMessage() {
    return message;
  }

  /**
   * @param message message を設定する。
   */
  public void setMessage(String message) {
    this.message = message;
  }

  /**
   * messageを出力する.
   */
  public void message() {
    logger.info(this.message);
  }
}

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
package samplepackage;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* HelloTwoクラス.
*/
public class HelloTwo {

  /** ロギング */
  private Log logger = LogFactory.getLog(HelloTwo.class);
  /** メッセージ */
  private String message;

  /**
   * @return message を戻す。
   */
  public String getMessage() {
    return message;
  }

  /**
   * @param message message を設定する。
   */
  public void setMessage(String message) {
    this.message = message;
  }

  /**
   * messageを出力する.
   */
  public void message() {
    logger.info(this.message);
  }
}
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
package samplepackage;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* HelloThreeクラス.
*/
public class HelloThree {

  /** ロギング */
  private Log logger = LogFactory.getLog(HelloThree.class);
  /** メッセージ */
  private String message;

  /**
   * @return message を戻す。
   */
  public String getMessage() {
    return message;
  }

  /**
   * @param message message を設定する。
   */
  public void setMessage(String message) {
    this.message = message;
  }

  /**
   * messageを出力する.
   */
  public void message() {
    logger.info(this.message);
  }
}

<'!-- ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ -->
□Step02
AOPに使用するアドバイスクラスを作成する。
・HelloAdvice.java
AOPをメソッドの前後にかけるAroundAdviceを使用する場合、アドバイスクラスはMethodInteceptorを実装して作成する。

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
package samplepackage;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* HelloAdviceクラス.
*/
public class HelloAdvice implements MethodInterceptor {

  /** ロギング */
  private Log logger = LogFactory.getLog(HelloAdvice.class);

  /* (非 Javadoc)
   * @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation)
   */
  public Object invoke(MethodInvocation invocation) throws Throwable {
//    joinpointの前処理
    logger.info("前処理");
//    管理するクラスのメソッドを呼び出す
    Object result = invocation.proceed();
//    joinpointの後処理
    logger.info("後処理");

    return result;
  }
}

<'!-- ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ -->
□Step03
定義ファイルに定義する。
・applicationContext.xml

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
<'?xml version="1.0" encoding="UTF-8"?>
<'!DOCTYPE beans PUBLIC
"-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<'beans>
  <'!--AutoProxyBean
    <'bean
    id="defaultAdvisorAutoProxy"
    class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
    <'property name="proxyTargetClass">
    <'value>true<'/value>
    <'/property>
    <'/bean>
  -->
  <'!-- AutoProxyBean -->
  <'!-- ※interceptorNames、beanNames属性に、ref指定は不可。(Beanでなく、Bean名を渡す。) -->
  <'bean id="beanNameAutoProxy"
    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <'property name="beanNames">
      <'value>*e<'/value>
    <'/property>
    <'property name="interceptorNames">
      <'value>helloAdvisor<'/value>
    <'/property>
  <'/bean>

  <'!-- "AOPするアドバイスクラス"を"AOP対象クラス"に合体させるアドバイザークラス -->
  <'!-- どのクラスに、どうゆうルールで、どのアドバイスを合体させるか等の情報を保持している。 -->
  <'bean id="helloAdvisor"
    class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
    <'property name="advice">
      <'ref local="helloAdvice" />
    <'/property>
    <'property name="mappedName">
      <'value>*message<'/value>
    <'/property>
  <'/bean>

  <'!-- AOPするアドバイスクラス -->
  <'bean id="helloAdvice"
    class="samplepackage.HelloAdvice" />

  <'!-- AOP対象クラス -->
  <'bean id="helloOne"
    class="samplepackage.HelloOne">
    <'property name="message">
      <'value>Hello,AOP!! one<'/value>
    <'/property>
  <'/bean>

  <'bean id="helloTwo"
    class="samplepackage.HelloTwo">
    <'property name="message">
      <'value>Hello,AOP!! two<'/value>
    <'/property>
  <'/bean>

  <'bean id="helloThree"
    class="samplepackage.HelloThree">
    <'property name="message">
      <'value>Hello,AOP!! three<'/value>
    <'/property>
  <'/bean>
<'/beans>

<'!-- ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ -->
□Step04
実践クラスを作成する。要はメインクラス。
・Practitioner.java

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
package samplepackage;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* Practitionerクラス.
*
*/
public class Practitioner {
  public static void main(String args[]) {
    try {
      ApplicationContext context = new ClassPathXmlApplicationContext(
      "applicationContext.xml");
      HelloOne helloOne = (HelloOne) context.getBean("helloOne");
      HelloTwo helloTwo = (HelloTwo) context.getBean("helloTwo");
      HelloThree helloThree = (HelloThree) context.getBean("helloThree");

      helloOne.message();
      helloTwo.message();
      helloThree.message();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
<'!-- ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ -->
□Step5
結果を確認する。

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
core.CollectionFactory:66 - JDK 1.4+ collections available
xml.XmlBeanDefinitionReader:163 - Loading XML bean definitions from class path resource [applicationContext.xml]
support.AbstractRefreshableApplicationContext:92 - Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext;has hCode=9142687]: org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [beanNameAutoProxy,helloAdvisor,helloAdvice,helloOne,helloT wo,helloThree]; root of BeanFactory hierarchy
support.AbstractApplicationContext:290 - 6 beans defined in application context [org.springframework.context.support.ClassPathXmlApplicationContext;hashCode=91 42687]
framework.DefaultAopProxyFactory:59 - CGLIB2 available: proxyTargetClass feature enabled
support.AbstractApplicationContext$BeanPostProcessorChecker:738 - Bean 'beanNameAutoProxy' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
support.AbstractApplicationContext:432 - Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.Delegatin gMessageSource@a4e2e3]
support.AbstractApplicationContext:454 - Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframewo rk.context.event.SimpleApplicationEventMulticaster@fd68b1]
support.DefaultListableBeanFactory:268 - Pre-instantiating singletons in factory [org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [beanNameAutoProxy,helloAdvisor,helloAdvice,helloOne,helloTwo,helloThree]; root of BeanFactory hierarchy]
autoproxy.HelloAdvice:26 - 前処理
autoproxy.HelloOne:39 - Hello,AOP!! one
autoproxy.HelloAdvice:30 - 後処理
autoproxy.HelloTwo:39 - Hello,AOP!! two
autoproxy.HelloAdvice:26 - 前処理
autoproxy.HelloThree:39 - Hello,AOP!! three
autoproxy.HelloAdvice:30 - 後処理

<'!-- ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ -->


ref:
Spring/AOP 利用例/Auto Proxy
http://www.system-trust.com/pukiwiki/?Spring%2FAOP%20%CD%F8%CD%D1%CE%E3%2FAuto%20Proxy

tag : autoproxy BeanNameAutoProxyCreator AOP springframework

2008-04-11 00:48 : __fw__spring : コメント : 0 : トラックバック : 0 :

transaction manager

==error==
javax.transaction.RollbackException

==reason==
the error when try to use two different type datasources, non-xa and xa, in a same transaction.

==log==
[08/04/07 13:37:10:118 JST] 0000009f RegisteredRes E WTRN0063E: 既存の 2 フェーズ可能リソースと一緒に 1 フェーズ可能リソースをコミットしようとする不正な試みが行われました。
[08/04/07 13:37:10:118 JST] 0000009f RegisteredRes E WTRN0086I: トランザクション 00000119272C12AC00000001000000141958447DBC1C067F7CE14BF65756462CF8FF57FB00000119272C12AC00000001000000141958447DBC1C067F7CE14BF65756462CF8FF57FB00000001 の準備フェーズで XAException が検出されました。 ローカル・リソースがこの後に続きます。
[08/04/07 13:37:10:134 JST] 0000009f RegisteredRes E WTRN0089I: XATransactionWrapper@ 62826282 XAResource: com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl@627a627a enlisted: true mcWrapper.hashCode()1639866814: 評定: commit
[08/04/07 13:37:10:134 JST] 0000009f RegisteredRes E WTRN0089I: XATransactionWrapper@ 56425642 XAResource: com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl@55f655f6 enlisted: true mcWrapper.hashCode()2008446902: 評定: commit
[08/04/07 13:37:10:134 JST] 0000009f RegisteredRes E WTRN0089I: LocalTransactionWrapper@:33a433a4 localTransaction:com.ibm.ws.rsadapter.spi.WSRdbSpiLocalTransactionImpl@3e123e12 enlisted:true registeredForSynctruemcWrapper.hashcode()1597136690: 評定: none
[08/04/07 13:37:10:150 JST] 0000009f SystemOut O 2008/04/07 13:37:10 DEBUG TransactionSynchronizationManager - Removed value [org.springframework.jdbc.datasource.ConnectionHolder@26602660] for key [com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource@4d648f94] from thread [WebContainer : 4]
[08/04/07 13:37:10:197 JST] 0000009f SystemOut O 2008/04/07 13:37:10 DEBUG TransactionSynchronizationManager - Removed value [org.springframework.jdbc.datasource.ConnectionHolder@2e4e2e4e] for key [com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource@61200ee3] from thread [WebContainer : 4]
[08/04/07 13:37:10:212 JST] 0000009f SystemOut O 2008/04/07 13:37:10 DEBUG TransactionSynchronizationManager - Removed value [org.springframework.jdbc.datasource.ConnectionHolder@36483648] for key [com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource@28d9d69d] from thread [WebContainer : 4]
[08/04/07 13:37:10:244 JST] 0000009f SystemOut O 2008/04/07 13:37:10 DEBUG TransactionSynchronizationManager - Clearing transaction synchronization
[08/04/07 13:37:10:337 JST] 0000009f SystemOut O 2008/04/07 13:37:10 ERROR SimpleMappingExceptionResolverEx - Handled the following exception.
org.springframework.transaction.UnexpectedRollbackException: JTA transaction unexpectedly rolled back (maybe due to a timeout); nested exception is javax.transaction.RollbackException
javax.transaction.RollbackException
at com.ibm.ws.Transaction.JTA.TransactionImpl.stage3CommitProcessing(TransactionImpl.java:1811)
at com.ibm.ws.Transaction.JTA.TransactionImpl.processCommit(TransactionImpl.java:1590)
at com.ibm.ws.Transaction.JTA.TransactionImpl.commit(TransactionImpl.java:1512)
at com.ibm.ws.Transaction.JTA.TranManagerImpl.commit(TranManagerImpl.java:237)
at com.ibm.ws.Transaction.JTA.TranManagerSet.commit(TranManagerSet.java:162)
at com.ibm.ws.Transaction.JTA.UserTransactionImpl.commit(UserTransactionImpl.java:285)
at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:787)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:500)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:473)
at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommitTransactionAfterReturning(TransactionAspectSupport.java:267)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)
at $Proxy59.handleRequest(Unknown Source)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:723)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:663)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:394)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:358)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:966)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:907)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:145)
at ......
2008-04-07 23:07 : __fw__spring : コメント : 0 : トラックバック : 0 :

autoProxyの分裂方法

通常のデータソース用のトランザクションインタセプタと
2PC(2相コミット)のデータソース用のトランザクションインタセプタを同時定義する方法。

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
<'?xml version="1.0" encoding="UTF-8"?>

<'!DOCTYPE beans
  PUBLIC "-//SPRING//DTD BEAN//EN"
  "http://www.springframework.org/dtd/spring-beans.dtd">

<'beans>

 <'!-- autoProxy -->
 <'bean id="autoProxy"
   class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" abstract="true">
 <'/bean>
 
 <'!-- autoProxy for two phase commit -->
 <'bean id="autoProxy.xa" parent="autoProxy">
  <'property name="interceptorNames">
   <'list>
    <'idref bean="transactionInterceptorJTA"/>
   <'/list>
  <'/property>
  <'property name="beanNames">
   <'list>
    <'value>*0XAController<'/value>
   <'/list>
  <'/property>
 <'/bean>
 
 <'!-- autoProxy for one phase commit -->
 <'bean id="autoProxy.tx" parent="autoProxy">
  <'property name="interceptorNames">
   <'list>
    <'idref bean="transactionInterceptor"/>
   <'/list>
  <'/property>
  <'property name="beanNames">
   <'list>
    <'value>*Controller<'/value>
   <'/list>
  <'/property>
 <'/bean>
 
<'/beans>

ref:
S_a_k_Uの日記みたいなDB ~サクゥーと呼ばないで~
http://d.hatena.ne.jp/S_a_k_U/20070617/p3

tag : autoproxy autoProxy BeanNameAutoProxyCreator transaction interceptor JTA xa tx

2008-01-31 00:07 : __fw__spring : コメント : 0 : トラックバック : 0 :

tag

JSTL/core
<'c:choose>
 多岐分岐
<'c:forEach>
 繰り返し処理
<'c:forTokens>
 文字列分割
<'c:if>
 単純分岐
<'c:import>
 外部ファイルのインポート
<'c:out>
 変数出力
<'c:redirect>
 ページリダイレクト
<'c:remove>
 スコープの変数削除
<'c:set>
 スコープへの変数設定
<'c:url>
 URLエンコード

Jakarta/Common Lang
<'str:wordWrap>
 ワードラップ制御

JSTL/I18n
<'fmt:formatDate>
 日付データ整形
<'fmt:formatNumber>
 数値データ整形
<'fmt:parseDate>
 文字列から日付データへの変換
<'fmt:parseNumber>
 文字列から数値データへの変換

Spring Framework/JSP/Form
<'form:checkbox>
 チェックボックス生成
<'form:errors>
 エラーメッセージを囲んだHTML spanタグの生成
<'form:form>
 HTML formタグの生成
<'form:hidden>
 HTML hiddenタグの生成
<'form:input>
 テキストボックスの生成
<'form:label>
 HTML labelタグの生成
<'form:option>
 HTML optionタグの生成
<'form:options>
 HTML optionタグをリストで生成
<'form:password>
 パスワード入力欄の生成
<'form:radiobutton>
 ラジオボタンの生成
<'form:select>
 セレクトボックスの生成
<'form:textarea>
 テキストエリアの生成

Spring Framework/JSP
<'spring:bind>
 フォームオブジェクト値の変数へのバインド
<'spring:escapeBody>
 HTML/JavaScriptエスケープ
<'spring:hasBindErrors>
 フォームオブジェクト値のバインドエラー表示
<'spring:message>
 メッセージ表示
<'spring:nestedPath>
 フォームオブジェクトに対するネストしたパスの許可

Spring Module/Commons Validator
<'validator: javascript>
入力値チェック用のJavaScript生成

Acegi Security/Authorization
<'authz:authorize>
 画面ごとの認証
<'authz:authentication>
 権限による画面項目の表示/非表示制御
2007-11-06 04:39 : __fw__spring : コメント : 0 : トラックバック : 0 :

tlds

tlds
--------------------------------------------------
for
<'%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<'%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
goto
http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi
select
1.1.2.zip
get
jakarta/taglibs/standard-1.1.2/tld/c.tld
jakarta/taglibs/standard-1.1.2/tld/fmt.tld

--------------------------------------------------
for
<'%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<'%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
download
spring-framework-2.0.6
get
spring-framework-2.0.6/dist/resources/spring.tld
spring-framework-2.0.6/dist/resources/spring-form.tld

--------------------------------------------------
for
<'%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
goto
http://fisheye1.cenqua.com/browse/springframework/spring/sandbox/src/org/springframework/validation/commons

--------------------------------------------------
for
<'%@ taglib prefix="authz" uri="http://acegisecurity.org/authz" %>
goto
http://www.koders.com/noncode/fid5A4BB79C08CC912E95988E14CC3216A8BC8C221F.aspx
get
authz.tld

--------------------------------------------------
goal is
<'web-app>
...
<'jsp-config>
<'!-- タグライブラリ -->
<'taglib>
<'taglib-uri>http://java.sun.com/jsp/jstl/core<'/taglib-uri>
<'taglib-location>/WEB-INF/tld/c.tld<'/taglib-location>
<'/taglib>
<'taglib>
<'taglib-uri>http://java.sun.com/jsp/jstl/fmt<'/taglib-uri>
<'taglib-location>/WEB-INF/tld/fmt.tld<'/taglib-location>
<'/taglib>
<'taglib>
<'taglib-uri>http://www.springframework.org/tags<'/taglib-uri>
<'taglib-location>/WEB-INF/tld/spring.tld<'/taglib-location>
<'/taglib>
<'taglib>
<'taglib-uri>http://www.springframework.org/tags/form<'/taglib-uri>
<'taglib-location>/WEB-INF/tld/spring-form.tld<'/taglib-location>
<'/taglib>
<'taglib>
<'taglib-uri>http://www.springmodules.org/tags/commons-validator<'/taglib-uri>
<'taglib-location>/WEB-INF/tld/spring-common-validation.tld<'/taglib-location>
<'/taglib>
<'taglib>
<'taglib-uri>http://acegisecurity.org/authz<'/taglib-uri>
<'taglib-location>/WEB-INF/tld/authz.tld<'/taglib-location>
<'/taglib>
<'/jsp-config>
<'/web-app>
2007-10-26 00:26 : __fw__spring : コメント : 0 : トラックバック : 0 :

transaction types

PROPAGATION_REQUIRED
現在のトランザクションをサポート
トランザクションが存在しな場合:新しいトランザクションを作成

PROPAGATION_SUPPORTS
現在のトランザクションをサポート
トランザクションが存在しない場合:非トランザクション的に実行

PROPAGATION_MANDATORY
現在のトランザクションをサポート
トランザクションが存在しない場合:例外を送出

PROPAGATION_REQUIRES_NEW
新しいトランザクションを作成
現在のトランザクションが存在する場合:現在のトランザクションを一時停止

PROPAGATION_NOT_SUPPORTED
非トランザクション的に実行
現在のトランザクションが存在する場合:現在のトランザクションを一時停止

PROPAGATION_NEVER
非トランザクション的に実行
トランザクションが存在する場合:例外を送出

PROPAGATION_NESTED
現在のトランザクションが存在する場合:ネストされたトランザクションの内部で実行
現在のトランザクションが存在しない場合:PROPAGATION_REQUIREDと同様に動作

tag : PROPAGATION_REQUIRED PROPAGATION_SUPPORTS PROPAGATION_MANDATORY PROPAGATION_REQUIRES_NEW PROPAGATION_NOT_SUPPORTED PROPAGATION_NEVER PROPAGATION_NESTED

2007-10-11 02:27 : __fw__spring : コメント : 0 : トラックバック : 0 :

spring web flow quick start

前提
Spring Web Flow 1.0とSpring Frameworkがダウンロード済み
Spring、HTML、JSP/JSTLの基礎知識
finite state machinesとUML state diagramsの基礎知識?

① 準備
spring-webflow-1.0.jarとsoring-binding-1.0.jarをクラスパスに通す。
spring.jarも。

② flowの設計
作成するflow:
i.
スタートアップでブラウザにフォームビューを表示。
ii.
サブミットでフォームに入力されたデータを裏方のフォームオブジェクトにバインドしてバリデーション。
エラー→フォームビューに戻る。
OK→サブミットアクションを実行。

③ flowの実装
XMLの書き方
==myFlow.xml==
<'?xml version="1.0" encoding="UTF-8"?>
<'!DOCTYPE flow PUBLIC "-//SPRING//DTD WEBFLOW 1.0//EN"
"http://www.springframework.org/dtd/spring-webflow-1.0.dtd">

<'flow start-state="displayForm">

<'view-state id="displayForm" view="form">
<'entry-actions>
<'action bean="formAction" method="setupForm"/>
<'/entry-actions>
<'transition on="submit" to="processSubmit">
<'action bean="formAction" method="bindAndValidate"/>
<'/transition>
<'/view-state>

<'action-state id="processSubmit">
<'action bean="formAction" method="processSubmit"/>
<'transition on="success" to="finish"/>
<'/action-state>

<'end-state id="finish" view="success"/>

<'/flow>
==============

④ アクションの実装
使うのはFormAction。
FormActionは、フォームのセットアップ、バインド、バリデート、サブミットロジックから成る。
==MyFormAction.java==
public class MyFormAction extends FormAction {
public MyFormAction() {
setFormObjectClass(FormObject.class);
}

public static class FormObject implements Serializable {
private String data;

public String getData() {
return data;
}

public void setData(String data) {
this.data = data;
}
}

/**
* A "submit" hook: an action execute method, called after
* binding and validation.
*/
public Event processSubmit(RequestContext context) throws Exception {
FormObject formObject = (FormObject)getFormObject(context);
// do submit logic
return success();
}

}
=====================

⑤ flowをデプロイ
Spring Application Cotext使ってデプロイ。
XmlFlowRegistryFactoryBeanを使用。
XmlFlowRegistryFactoryBeanは、③のxmlを元にをflowを登録。
フォームアクションを何処にデプロイしたかも明示。
==dispatcher-servlet.xml==
<'bean id="flowRegistry" class="org.springframework.webflow.registry.XmlFlowRegistryFactoryBean">
<'property name="flowLocations" value="/WEB-INF/flows/myflow.xml"/>
<'/bean>

<'bean id="formAction" class="example.MyFormAction"/>
==========================

⑥ flowの準備
好きなweb frameworkでflowを使う準備。
SpringMVCを使う場合は、FlowControllerとViewResolverを↓な感じで定義。
==dispatcher-servlet.xml==
<'bean name="/myApp.htm" class="org.springframework.webflow.executor.mvc.FlowController">
<'property name="flowLocator" ref="flowRegistry"/>
<'/bean>

<'!-- Maps flow view-state view names to JSP templates with JSTL support -->
<'bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<'property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<'property name="prefix" value="/WEB-INF/jsp/"/>
<'property name="suffix" value=".jsp"/>
<'/bean>
==========================
↑/myApp.htmの時にFlowControllerを使用、と定義してる。
1このコントローラが一般的にこのアプリの全部flowの実行を管理。
ビューでパラメータ_flowIdで指定したflowコントローラで新しいflowを実行うんぬんぬん…。

⑦ ビューの実装
==/WEB-INF/jsp/form.jsp==
<'html>
<'head>
<'title>My Form<'/title>
<'/head>
<'body>
<'p>
<'table>
<'form action="myApp.htm">
<'tr>
<'td>Field:<'/td>
<'td><'input type="text" name="data" size="25"/><'/td>
<'/tr>
<'tr>
<'td colspan="2" align="right">
<'input name="_eventId_submit" type="submit">
<'input type="hidden" name="_flowExecutionKey" value="${flowExecutionKey}">
<'/td>
<'/tr>
<'/form>
<'/table>
<'/p>
<'/body>
<'/html>
=========================

※ パラメータ_flowExecutionKey
flowはステートフル。
→flowで使うビューは、必ずパラメータ_flowExecutionKeyをサブミットでサーバに返すこと。

※ パラメータ_eventId
ビューで、必ずイベントを識別するためのパラメータ_eventIdをサブミットボタンに足すこと。

⑧ アクセス
↓にアクセス。
/myApp.htm?_flowId=myFlow
アクセスすると、新しくmyFlowが生成され、start-stateに遷移される。
その後の流れは↓読んで。

ref:
Spring Web Flow QuickStart
http://opensource.atlassian.com/confluence/spring/display/WEBFLOW/Quick+Start?decorator=printable

tag : webflow SWF

2007-08-10 00:17 : __fw__spring : コメント : 0 : トラックバック : 0 :

spring web.xml

■ApplicationContext

WebアプリケーションでもApplicationContextを利用する。
→ApplicationContextを初期化する必要がある。

初期化方法①
従来の方法
プログラム中でApplicationContextの実装クラスを初期化。

初期化方法②
楽な方法
ContextLoaderListenerか、ContextLoaderServletをweb.xmlに設定。

==================================================
ContextLoaderListenerを使う場合のweb.xml
--------------------------------------------------
<'context-param>
<'param-name>contextConfigLocation<'/param-name>
<'param-value>
/WEB-INF/daoContext.xml
/WEB-INF/applicationContext.xml
<'/param-value>
<'/context-param>

<'listener>
<'listener-class>
org.springframework.web.context.ContextLoaderListener
<'/listener-class>
<'/listener>
==================================================

※contextConfigLocationパラメータでBean定義ファイルの場所を指定。
※カンマ、セミコロン、スペースで区切ることで、複数ファイルの指定可。


==================================================
ContextLoaderServletを使う場合のweb.xml
--------------------------------------------------
<'context-param>
<'param-name>contextConfigLocation<'/param-name>
<'param-value>
/WEB-INF/daoContext.xml
/WEB-INF/applicationContext.xml
<'/param-value>
<'/context-param>

<'servlet>
<'servlet-name>context<'/servlet-name>
<'servlet-class>
org.springframework.web.context.ContextLoaderServlet
<'/servlet-class>
<'load-on-startup>1<'/load-on-startup>
<'/servlet>
==================================================


■DispatcherServlet
ブラウザからのリクエストを受信
HandlerMappingやController、HandleExceptionResolverなどの実行の制御

DispatcherServletを利用するには、web.xmlに登録する必要がある。

==================================================
DispatcherServletを使う場合のweb.xml
--------------------------------------------------
<'web-app>
...
<'servlet>
<'servlet-name>example<'/servlet-name>
<'servlet-class>
org.springframework.web.servlet.DispatcherServlet
<'/servlet-class>
<'load-on-startup>1<'/load-on-startup>
<'/servlet>
<'servlet-mapping>
<'servlet-name>example<'/servlet-name>
<'url-pattern>*.form<'/url-pattern>
<'/servlet-mapping>
...
<'/web-app>
==================================================


ContextLoaderServletを利用する時
DispatcherServletのload-on-startup属性で
ContextLoaderServletの後にDispatcherServletをロードするように設定する。


ApplicatinContextをServlet単位に作成することも可。
ContextLoaderで設定したApplicationContextをルートとし、
それにサーブレットごとのApplicationContextを子供として設定する形にする。
サーブレットのApplicationContextを設定するには、<'サーブレット名>-servlet.xmlと言う名前でファイルを作成する。

ref:
Brost Technologies,Inc.
http://www.brost.co.jp/report/spring_web/spring_web1.html
2007-07-28 13:10 : __fw__spring : コメント : 0 : トラックバック : 0 :

NoSuchFlowDefinitionException

==exception==
org.springframework.webflow.definition.registry.NoSuchFlowDefinitionException

==reason==
the name of flow.xml was mistaken.

==solution==
fix the file name of flow.xml

==log==
2007-07-27 15:30:26,774 ERROR [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/hoge].[hoge]] - <サーブレット hoge のServlet.service()が例外を投げました>
org.springframework.webflow.definition.registry.NoSuchFlowDefinitionException: No such flow definition with id 'hoge-flow' found; the flows available are: array['hoge-flow']
at org.springframework.webflow.definition.registry.FlowDefinitionRegistryImpl.getFlowDefinitionHolder(FlowDefinitionRegistryImpl.java:209)
at org.springframework.webflow.definition.registry.FlowDefinitionRegistryImpl.getFlowDefinition(FlowDefinitionRegistryImpl.java:128)
at org.springframework.webflow.executor.FlowExecutorImpl.launch(FlowExecutorImpl.java:204)
at org.springframework.webflow.executor.support.FlowRequestHandler.handleFlowRequest(FlowRequestHandler.java:131)
at org.springframework.webflow.executor.mvc.FlowController.handleRequestInternal(FlowController.java:172)
at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:857)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:792)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:475)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:430)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
at java.lang.Thread.run(Thread.java:595)

tag : webflow SWF

2007-07-28 13:09 : __fw__spring : コメント : 0 : トラックバック : 0 :

idx: spring

□intro to spring *
□overview *

□dicon *
□by dicon *

□aop *
□aop:aspect *

□viewResolver *
□分散トランザクション *
□everything is for testing distributed transactions *

□messageResource in jsp *

□SpringMVC Sample Project *
□SpringMVC Sample Project 2 *


□basic information about spring mvc *
□ApplicationContext *
□controllers *
□SimpleFormController *
□NullValueInNestedPathException *
□spring:bind *
□コントローラサーブレット *
2007-07-27 02:33 : __fw__spring : コメント : 0 : トラックバック : 0 :

コントローラサーブレット



リクエストコントローラへのリクエスト処理委譲
ビューへの表示処理依頼

リクエストに対する処理フローの見張り役

SpringMVC provides DispatcherServlet-class as a controllerServlet.
DispatcherServlet-objは、HandlerMapping等と連携してリクエストフローを見張る。
連携はDIコンテナの役割。
→dont forget to def the bean of DispatcherServlet



DispatcherServletは、Abs:javax.servlet.http.HttpServletの子孫。
==================================================
@web.xml#web-app
--------------------------------------------------
<'servlet>
<'servlet-name>fp<'/servlet-name>
<'servlet-class>org.springframework.web.servlet.DispatcherServlet<'/servlet-class>
<'load-on-startup>1<'/load-on-startup>
<'/servlet>

<'servlet-mapping>
<'servlet-name>fp<'/servlet-name>
<'url-pattern>*.htm<'/url-pattern>
<'/servlet-mapping>
==================================================
※the name of servlet.xml must be "fp-servlet.xml" in this case.
※but dont have to make the name same as the propject name.




Applicationコンテキスト:
ビジネス層やデータアクセス層を構成するオブジェクトの定義

Bean定義ファイル:
DispatcherServletを構成する定義と
ビジネス層のサービスオブジェクトを参照する定義

→load the applicationContext before than BeanDefFile.



ロードクラス
ContextLoaderListener-class
(impl IF:javax.servlet.ServletContextListener)
so,
ContextLoaderListenerがServletより先に
WebAPの起動時にロードされる。

ContextLoaderServletは
DispatcherServletと同様に
Abs:javax.servlet.http.HttpServletの子孫。
thus,
ロード順の明示 cuz of the same servlet.



DispatcherServletの構成要素
+mapping definitions (ex. HandlerMapping, ViewResolver)
+controller definitions (ex. any Controller)
+general definitions (ex. MessageSource)
2007-07-27 02:18 : __fw__spring : コメント : 0 : トラックバック : 0 :

BeanCreationException

==background==
when try to run spring-webflow-1.0.4\projects\spring-webflow-samples\fileupload.

==exception==
org.springframework.beans.factory.BeanCreationException

==solution==
download commons-fileupload-1.2-bin.zip
(cf. download commons-fileupload-1.2-src.zip)
or get it from
spring-framework-2.0.6\lib\jakarta-commons
and
unzip it
then
place following in web-inf/lib
commons-fileupload-1.2.jar

==log==
2007-07-26 18:41:06,137 ERROR [org.springframework.web.servlet.DispatcherServlet] -
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'multipartResolver' defined in ServletContext resource [/WEB-INF/fileupload-servlet.xml]: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory
Caused by:
java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2357)
at java.lang.Class.getConstructor0(Class.java:2671)
at java.lang.Class.getDeclaredConstructor(Class.java:1953)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:54)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:756)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:721)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:384)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:156)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:287)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:331)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:265)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:235)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:126)
at javax.servlet.GenericServlet.init(GenericServlet.java:212)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1139)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:791)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:127)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
at java.lang.Thread.run(Thread.java:595)

tag : webflow SWF

2007-07-27 01:11 : __fw__spring : コメント : 0 : トラックバック : 0 :

IllegalStateException

==background==
when try to run spring-webflow-1.0.4\projects\spring-webflow-samples\fileupload.

==exception==
java.lang.IllegalStateException

==solution==
get
ognl-2.6.9.jar
from
http://www.ognl.org/download.html
and
place it in web-inf/lib

==log==
2007-07-26 18:53:00,800 ERROR [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/upload].[fileupload]] - <サーブレット fileupload のServlet.service()が例外を投げました>
java.lang.IllegalStateException: Unable to load the default expression parser: OGNL could not be found in the classpath. Please add OGNL 2.x to your classpath or set the default ExpressionParser instance to something that is in the classpath. Details: ognl.Ognl
at org.springframework.webflow.core.DefaultExpressionParserFactory.createDefaultExpressionParser(DefaultExpressionParserFactory.java:88)
at org.springframework.webflow.core.DefaultExpressionParserFactory.getDefaultExpressionParser(DefaultExpressionParserFactory.java:73)
at org.springframework.webflow.core.DefaultExpressionParserFactory.access$000(DefaultExpressionParserFactory.java:32)
at org.springframework.webflow.core.DefaultExpressionParserFactory$1.isDelimitedExpression(DefaultExpressionParserFactory.java:53)
at org.springframework.binding.convert.support.TextToExpression.doConvert(TextToExpression.java:66)
at org.springframework.binding.convert.support.AbstractConverter.convert(AbstractConverter.java:73)
at org.springframework.binding.convert.ConversionExecutor.execute(ConversionExecutor.java:109)
at org.springframework.binding.convert.ConversionExecutor.execute(ConversionExecutor.java:91)
at org.springframework.webflow.engine.builder.TextToViewSelector.convertEncodedViewSelector(TextToViewSelector.java:145)
at org.springframework.webflow.engine.builder.TextToViewSelector.doConvert(TextToViewSelector.java:114)
at org.springframework.binding.convert.support.AbstractConverter.convert(AbstractConverter.java:73)
at org.springframework.binding.convert.ConversionExecutor.execute(ConversionExecutor.java:109)
at org.springframework.binding.convert.ConversionExecutor.execute(ConversionExecutor.java:91)
at org.springframework.webflow.engine.builder.xml.XmlFlowBuilder.parseViewSelector(XmlFlowBuilder.java:736)
at org.springframework.webflow.engine.builder.xml.XmlFlowBuilder.parseAndAddViewState(XmlFlowBuilder.java:650)
at org.springframework.webflow.engine.builder.xml.XmlFlowBuilder.parseAndAddStateDefinitions(XmlFlowBuilder.java:616)
at org.springframework.webflow.engine.builder.xml.XmlFlowBuilder.buildStates(XmlFlowBuilder.java:350)
at org.springframework.webflow.engine.builder.FlowAssembler.directAssembly(FlowAssembler.java:149)
at org.springframework.webflow.engine.builder.FlowAssembler.assembleFlow(FlowAssembler.java:131)
at org.springframework.webflow.engine.builder.RefreshableFlowDefinitionHolder.assembleFlow(RefreshableFlowDefinitionHolder.java:173)
at org.springframework.webflow.engine.builder.RefreshableFlowDefinitionHolder.getFlowDefinition(RefreshableFlowDefinitionHolder.java:93)
at org.springframework.webflow.definition.registry.FlowDefinitionRegistryImpl.getFlowDefinition(FlowDefinitionRegistryImpl.java:128)
at org.springframework.webflow.executor.FlowExecutorImpl.launch(FlowExecutorImpl.java:204)
at org.springframework.webflow.executor.support.FlowRequestHandler.handleFlowRequest(FlowRequestHandler.java:131)
at org.springframework.webflow.executor.mvc.FlowController.handleRequestInternal(FlowController.java:172)
at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:857)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:792)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:475)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:430)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
at java.lang.Thread.run(Thread.java:595)

tag : webflow SWF

2007-07-27 01:10 : __fw__spring : コメント : 0 : トラックバック : 0 :

NoClassDefFoundError

==background==
when try to run spring-webflow-1.0.4\projects\spring-webflow-samples\fileupload.

==exception==
java.lang.NoClassDefFoundError

==solution==
get
commons-io.jar
from
spring-framework-2.0.6\lib\jakarta-commons
and
place it in web-inf/lib

==log==
2007-07-26 19:11:17,054 ERROR [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/upload].[fileupload]] - <サーブレット fileupload のServlet.service()が例外を投げました>
java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream
at org.apache.commons.fileupload.disk.DiskFileItemFactory.createItem(DiskFileItemFactory.java:191)
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:350)
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
at org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:117)
at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:979)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:834)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:792)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:475)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:440)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
at java.lang.Thread.run(Thread.java:595)

tag : webflow SWF

2007-07-27 01:09 : __fw__spring : コメント : 0 : トラックバック : 0 :

spring webflow fileupload

================================================================================
index.jsp
--------------------------------------------------------------------------------
<'%@ page session="true" %> <'%-- make sure we have a session --%>

<'!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<'HTML>
<'HEAD>
<'/HEAD>
<'BODY>

<'DIV align="left">File Upload - A Spring Web Flow Sample<'/DIV>

<'HR>

<'DIV align="left">
<'P>
<'A href="admin.htm?_flowId=fileupload">File Upload<'/A>
<'/P>

<'P>
This sample application illustrates dealing with file uploads in a
Spring web flow based application. Consult the
<'A href="http: //www.springframework.org/docs/reference/mvc.html#mvc-multipart">Spring reference documentation<'/A>
for more information about the techniques used here.<'BR>
This implementation uses <'A href="http: //jakarta.apache.org/commons/fileupload/">Jakarta commons FileUpload<'/A>
to process multipart requests.
<'/P>
<'/DIV>

<'HR>

<'DIV align="right"><'/DIV>

<'/BODY>
<'/HTML>
================================================================================
fileForm.jsp
--------------------------------------------------------------------------------
<'%@ page contentType="text/html" %>
<'%@ page session="false" %>
<'%@ taglib prefix="c" uri="http: //java.sun.com/jsp/jstl/core" %>

<'html>
<'head>
<'title>Upload a File<'/title>
<'meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<'link rel="stylesheet" href="style.css" type="text/css">
<'/head>

<'body>

<'div id="logo">
<'img src="images/spring-logo.jpg" alt="Logo">
<'/div>

<'div id="content">
<'div id="insert">
<'img src="images/webflow-logo.jpg"/>
<'/div>
<'h2>Select the file to upload<'/h2>
<'hr>
<'form name="submitForm" method="post" enctype="multipart/form-data">
<'table>
<'c:if test="${fileUploaded}">
<'p>File uploaded succesfully.<'/p>
<'c:if test="${!empty(file)}">
<'pre style="border: solid 1px;">${file}<'/pre>
<'/c:if>
<'/c:if>
<'tr>
<'td>
File:
<'/td>
<'td>
<'input type="file" name="file">
<'/td>
<'/tr>
<'tr>
<'td colspan="2"> <'/td>
<'/tr>
<'tr>
<'td colspan="2" class="buttonBar">
<'input type="hidden" name="_flowExecutionKey" value="${flowExecutionKey}">
<'input type="submit" class="button" name="_eventId_submit" value="Upload">
<'/td>
<'/tr>
<'/table>
<'/form>
<'/div>

<'div id="copyright">
<'p>© Copyright 2004-2007, <'a href="http: //www.springframework.org">www.springframework.org<'/a>, under the terms of the Apache 2.0 software license.<'/p>
<'/div>

<'/body>
<'/html>
================================================================================
web.xml
--------------------------------------------------------------------------------
<'?xml version="1.0" encoding="ISO-8859-1"?>

<'web-app xmlns="http: //java.sun.com/xml/ns/j2ee"
xmlns:xsi="http: //www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http: //java.sun.com/xml/ns/j2ee http: //java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">

<'servlet>
<'servlet-name>fileupload<'/servlet-name>
<'servlet-class>org.springframework.web.servlet.DispatcherServlet<'/servlet-class>
<'/servlet>

<'servlet-mapping>
<'servlet-name>fileupload<'/servlet-name>
<'url-pattern>*.htm<'/url-pattern>
<'/servlet-mapping>

<'welcome-file-list>
<'welcome-file>index.jsp<'/welcome-file>
<'/welcome-file-list>

<'/web-app>
================================================================================
fileupload-servlet.xml
--------------------------------------------------------------------------------
<'?xml version="1.0" encoding="UTF-8"?>
<'beans xmlns="http: //www.springframework.org/schema/beans"
xmlns:xsi="http: //www.w3.org/2001/XMLSchema-instance"
xmlns:flow="http: //www.springframework.org/schema/webflow-config"
xsi:schemaLocation="
http: //www.springframework.org/schema/beans
http: //www.springframework.org/schema/beans/spring-beans-2.0.xsd
http: //www.springframework.org/schema/webflow-config
http: //www.springframework.org/schema/webflow-config/spring-webflow-config-1.0.xsd">

<'!--
Exposes web flows for execution at a single request URL.
The id of a flow to launch should be passed in by clients using
the "_flowId" request parameter:
e.g. /admin.htm?_flowId=fileupload
-->
<'bean name="/admin.htm" class="org.springframework.webflow.executor.mvc.FlowController">
<'property name="flowExecutor" ref="flowExecutor" />
<'/bean>

<'!-- Launches new flow executions and resumes existing executions. -->
<'flow:executor id="flowExecutor" registry-ref="flowRegistry" repository-type="singlekey"/>

<'!-- Creates the registry of flow definitions for this application -->
<'flow:registry id="flowRegistry">
<'flow:location path="/WEB-INF/fileupload.xml" />
<'/flow:registry>

<'!--
Support for multipart requests using commons file upload
Make sure you have the commons-fileupload.jar in your classpath
-->
<'bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<'!-- Limit uploads to small (5KB) files for this sample -->
<'property name="maxUploadSize" value="5120" />
<'/bean>

<'!-- Resolves flow view names to .jsp templates -->
<'bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<'property name="prefix" value="/WEB-INF/jsp/" />
<'property name="suffix" value=".jsp" />
<'/bean>

<'bean id="uploadAction" class="org.springframework.webflow.samples.fileupload.FileUploadAction" />

<'/beans>
================================================================================
fileupload.xml
--------------------------------------------------------------------------------
<'?xml version="1.0" encoding="UTF-8"?>
<'flow xmlns="http: //www.springframework.org/schema/webflow"
xmlns:xsi="http: //www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http: //www.springframework.org/schema/webflow
http: //www.springframework.org/schema/webflow/spring-webflow-1.0.xsd">

<'start-state idref="selectFile"/>

<'view-state id="selectFile" view="fileForm">
<'transition on="submit" to="uploadFile"/>
<'/view-state>

<'action-state id="uploadFile">
<'action bean="uploadAction"/>
<'transition on="success" to="selectFile">
<'set attribute="fileUploaded" scope="flash" value="true"/>
<'/transition>
<'transition on="error" to="selectFile"/>
<'/action-state>

<'/flow>
================================================================================
FileUploadAction.java
--------------------------------------------------------------------------------
/*
* Copyright 2004-2007 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http: //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.webflow.samples.fileupload;

import org.springframework.web.multipart.MultipartFile;
import org.springframework.webflow.action.AbstractAction;
import org.springframework.webflow.execution.Event;
import org.springframework.webflow.execution.RequestContext;

public class FileUploadAction extends AbstractAction {

protected Event doExecute(RequestContext context) throws Exception {
MultipartFile file = context.getRequestParameters().getRequiredMultipartFile("file");
if (file.getSize() > 0) {
// data was uploaded
context.getFlashScope().put("file", new String(file.getBytes()));
return success();
}
else {
return error();
}
}
}
================================================================================

ref:
spring-webflow-1.0.4\projects\spring-webflow-samples\fileupload\src\main

tag : webflow SWF

2007-07-26 00:05 : __fw__spring : コメント : 0 : トラックバック : 0 :

spring:bind

spring:bind
■basic info
org.springframework.web.servlet.tags.BindTag
バリデーションエラーの取得に使用
when use spring:bind,
you have to complete the error setting like error message.

■status-property
path
expression
value
valueType
displayValue
error
errorCode[s]
errorMessage[s]
errors
editor

■ex
<'form method="post">
## first bind on the object itself to display global errors - if available
<'spring:bind path="company">
<'c:forEach items="${status.errorMessages}" var="error">
Error code: <'c:out value="${error}"/><'br>
<'/c:forEach>
<'/spring:bind>

## if you need to display all errors (both global and all field errors,
## use wildcard (*) in place of the property name
<'spring:bind path="company.*">
<'c:forEach items="${status.errorMessages}" var="error">
Error code: <'c:out value="${error}"/><'br>
<'/c:forEach>
<'/spring:bind>

## now bind on the name of the company
<'spring:bind path="company.name">
## render a form field, containing the value and the expression
Name: <'input
type="text"
value="<'c:out value="${status.value}"/>"
name="<'c:out value="${status.expression}"/>">
## if there are error codes, display them!
<'c:if test="${status.error}">
Error codes:
<'c:forEach items="${status.errorMessages}" var="error">
<'c:out value="${error}"/>
<'/c:forEach>
<'/c:if>
<'/spring:bind>

<'spring:bind path="company.address.street">
Name: <'input
type="text"
value="<'c:out value="${status.value}"/>"
name="<'c:out value="${status.expression}"/>">
<'c:if test="${status.error}">
Error codes:
<'c:forEach items="${status.errorMessages}" var="error">
<'c:out value="${error}"/>
<'/c:forEach>
<'/c:if>
<'/spring:bind>

## same thing for zipCode

<'input type="submit">
<'/form>

■instead of cssClass/cssErrorClass
<'spring:bind path="sampleForm.sampleProperty">
<'c:set var="style" value="normal-style"/>
<'c:if test="${status.error}">
<'c:set var="style" value="error-style"/>
<'/c:if>
<'/spring:bind>
<'div class="${style}" scope="page">
hoge
<'/div>

ref:
http://www.javaworld.com.tw/jute/post/print?bid=42&id=152074
http://static.springframework.org/spring/docs/1.2.x/taglib/tag/BindTag.html

tag : spring:bind

2007-07-25 00:53 : __fw__spring : コメント : 0 : トラックバック : 0 :

NullValueInNestedPathException

unsolved error

==error==
org.springframework.beans.NullValueInNestedPathException

==problem==
how to bind a form including a list?
(when the length of list is not sure and might be change.)
what gonna be the path written in JSP?

==temporary solution==
prepare the list by instantiating @SimpleFormController#formBackingObject
ex
SimpleFormController#formBackingObject(Object command){
private List sampleList = new ArrayList();
sampleList.add(new SampleItem());
sampleList.add(new SampleItem());
return sampleList;
}

ref:
http://forum.springframework.org/showthred.php?p=132859

==log==
[2007/07/24 21:11:21][ERROR][StandardWrapperValve] サーブレット hf のServlet.service()が例外を投げました
org.springframework.beans.NullValueInNestedPathException: Invalid property 'hogeList[0]' of bean class [hogeForm]: Cannot access indexed value of property referenced in indexed property path 'hogeList[0]': returned null
at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:547)
at org.springframework.beans.BeanWrapperImpl.getNestedBeanWrapper(BeanWrapperImpl.java:441)
at org.springframework.beans.BeanWrapperImpl.getBeanWrapperForPropertyPath(BeanWrapperImpl.java:418)
at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:635)
at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:78)
at org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:532)
at org.springframework.validation.DataBinder.doBind(DataBinder.java:434)
at org.springframework.web.bind.WebDataBinder.doBind(WebDataBinder.java:147)
at org.springframework.web.bind.ServletRequestDataBinder.bind(ServletRequestDataBinder.java:108)
at org.springframework.web.servlet.mvc.BaseCommandController.bindAndValidate(BaseCommandController.java:369)
at org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:248)
at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:857)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:792)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:475)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:440)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
at java.lang.Thread.run(Thread.java:595)
2007-07-25 00:43 : __fw__spring : コメント : 0 : トラックバック : 0 :

SimpleFormController

org.springframework.web.servlet.mvc.SimpleFormController

2つのリクエストに対応すること
*データ入力画面の表示
*データ入力画面からのフォーム送信

■isFormSubmission()
リクがフォーム送信処理かどうか判定
デフォルトでは、HTTPメソッドがPOSTの場合にフォーム送信処理と判定。

■formBackingObject()
データ入力画面表示に利用するコマンドを返す。
デフォルトでは、空のコマンドを返す。
セッションに保持しているモデルをデータ入力画面に表示したい場合等は、このメソッドを実装する。

■initBinder()
リクパラメータをコマンドにバインドするクラスServletRequestDataBinderを初期化。
日時のフォーマット等、アプリ固有のバインドが必要な場合に実装する。

■バインド
クラスServletRequestDataBinderのメソッドbindでリクパラメータをコマンドにバインド。

■onBind()
バインドの後処理の実行。
バリデートの間に呼ばれる。
デフォルトでは処理なし。

■バリデート
コマンドをバリデート。
処理はIF:Validatorに委譲。

■onBindAndValidate()
バインドとバリデートの後処理の実行。
バリデートの後に呼ばれる。
デフォルトでは処理なし。

■processFormSubmission()
エラーがあるかないかの分岐処理を実行。

■showForm()
データ入力画面を表示。
バリデーションエラーが発生した場合に呼ばれる。

■referenceData()
コマンド以外のデータ入力画面表示に要るデータの作成。
プルダウンリストの内容等。
デフォルトはヌル。

■onSubmit()
ビジネス層のビジネスロジックの呼び出し等、本来のフォーム送信処理を実行。

■プロパティ
□formView
null
データ入力画面のビューの名前

□successView
null
遷移先画面のビューの名前

□bindOnNewForm
false
新規にデータ入力画面に表示する際にバインドするか

□sessionForm
false
コマンドをセッションで保持するか

□commandName
command
リクにコマンドを設定する際に利用する名前

□validator
null
コマンドをバリデートするvalidator

□validateOnBinding
true
バインド後にバリデートするか

□親のプロパティ等。

tag : SimpleFormController

2007-07-24 02:52 : __fw__spring : コメント : 0 : トラックバック : 0 :

controllers

■IF:Controller
リクエスト処理を行うメソッドhandleRequestを定義。
DispatcherServlet-objは、メソッドhandleRequestを呼んで、リクエスト処理を委譲する。

■UrlFilenameViewController
画面遷移だけやるリクを提供。
リクURLのファイル名をビューの名前に使用することで遷移する。

■Abs:AbstractController
HTTPキャッシングヘッダの生成やサポートするHTTPメソッド(GET/POST)の判定等、
リク処理の基本フローを定義。
サブクラスは、抽象メソッドhandleRequestInternalをオーバーライドして、固有の処理を実装する。

■MultiActionController
複数のリクのそれぞれに対応したリク処理を、一つのクラスで実装する機能を提供。
サブクラスは各リクに対応するメソッドを設け、リク処理を実装する。

■ParameterizableViewController
画面遷移だけのリク処理を提供。
Bean定義で、プロパティviewNameに画面遷移するビューの名前を設定する。

■Abs:BaseCommandController
リクパラメータをコマンドに設定するデータバインディング機能、
コマンドに設定されたデータを検証するバリデーション機能をで提供する。

■Abs:AbstractCommandController
BaseCommandControllerが提供するデータバインディング機能とバリデーション機能を利用したリク処理の基本フローを定義。
フォーム送信に対応するリクエストコントローラは別に存在するので、基本的に利用されないクラス。

■Abs:AbstractFormController
フォーム送信に対応するリク処理基本フローを定義。

■Abs:AbstractWizardFormController
ウィザード形式の入力画面からのフォーム送信に対応する機能を提供。

■SimpleFormController
フォーム送信に対応するリク処理を実装。

2007-07-24 02:28 : __fw__spring : コメント : 0 : トラックバック : 0 :

ApplicationContext

■ApplicationContext

□basic
BeanFactoryを拡張したものであり、メッセージ、リソース、イベントを管理できる。

□役割
国際化対応されたメッセージへのアクセス(IF:MessageSource)
リソースへのアクセス(IF:ResourcePatternResolver)
イベントの伝播(IF:ApplicationEventPublisher)
複数コンテキストのロード

□使い分け
メモリの使用量に制限がある場合→BeanFactory
それ以外→ApplicationContext

□additional info
ApplicationContext の生成は BeanFactory の生成とほとんど同じ
====================
ApplicationContext appContext = new FileSystemXmlApplicationContext("beans.xml");
====================
BeanFactoryと同様 クラスパスからのBean定義ファイルの取得も可
====================
ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
====================
BeanFactoryとは異なり Bean 設定ファイルの複数読み込みも可
====================
String[] configs = {"beans-common.xml", "beans-user.xml"};
ApplicationContext context = new ClassPathXmlApplicationContext(configs);
====================


ref:
Brost Technologies,Inc.
http://www.brost.co.jp/report/spring_basic/spring7.html
TECHSCORE
http://www.techscore.com/tech/Others/Spring/4.html
2007-07-20 01:24 : __fw__spring : コメント : 0 : トラックバック : 0 :

basic information about spring mvc

□コントローラサーブレット
org.springframework.web.servlet.DispatcherServlet
リクエストに対する処理フロー全体の制御の役割

□Definition files
*mapping definitions
マッピングの定義

*controller definitions
リクエストコントローラの定義

*General definitions
MessageSource等の定義

*ApplicationContext
ビジネス層やデータアクセス層を構成するオブジェクトの定義

*BeanDefinitionFile
DispatcherServletを構成するオブジェクトの定義

⇒need to load ApplicationContext before BeanDefinitionFile.

□MappingDefinition
types:
+HandlerMapping: リクエストURL/リクエストコントローラ
+ViewResolver: ビューの名前/ビュー
+HandlerExceptionResolver: 例外クラス/ビューの名前

□HandlerMapping
def of mpg of reqURL and reqController
DespatcherServlet-objgaリクエストコントローラを取得する際に利用

□HandlerMapping provided by spring mvc
+++CommonPathMapHandlerMapping
ApacheJakrtaProjectのCommonsAttributesを仕様
リクエストコントローラにメタデータ属性としてリクエストURLを指定することでmpg
+++BeanNameUrlHandlerMapping
リクエストコントローラのBeanDefでBean名をリクエストURLに合わせることでmpg
ex
<'bean id="/welcome.html" class="hogeController"/>
+++SimpleUrlHandlerMapping
リクエストURLとリクエストコントローラのBean名の組み合わせを指定してmpg
ex
<'bean id="urlMpg" class="org.springfw..SimpleUrlHandlerMapping">
<'property name="mappings">
<'props>
<'prop key="/welcome.html">hogeContoroller<'/prop>
<'/props>
<'property>
<'/bean>

□viewResolver provided by spring mvc
+++ResourceBundleViewResoler
+++UrlBasedViewResolver
+++FreeMaekerViewResolver(UrlBasedViewResolver)
+++VelocityViewResolver(UrlBasedViewResolver)
+++InternalResourceViewResolver(UrlBasedViewResolver)
+++XmlViewResolver
+++BeanNameViewResolver

□ViewIF provided by spring mvc
+++Excel
AbstractExcelView
+++PDF
AbstractPdfView
+++FreeMaeker
FreeMarkerView
+++Velcity
VelocityView
+++JSTL
JstlView
+++Tiles
TilesView
+++Tiles, JSTL
TilesJstlView
+++XSLT
AbstractXsltView
+++redirect
RedirectView

2007-07-17 02:57 : __fw__spring : コメント : 0 : トラックバック : 0 :

idx: web flow

□states *
□dynamic transition *
□spring-webflow: scope *

□jars needed to start spring webflow *

Spring-webflow: sample-flow-beans.xml & sample-flow.xml *
□entry-actions & render-actions & bean-actions *
□set bean-action in render-action *
□FormAction *
□businessLogic w/o extending AbstractAction *
□summary of [understanding alwaysRedirectOnPause] *
□alwaysRedirectOnPause *

□ClientContinuationFlowExecutionStorage *

□transaction *

□swf: useful URLs *

□pass data from SWF to SpringMVC *
□parameter of URL *

tag : Spring Web Flow webflow SWF

2007-07-04 23:58 : __fw__spring : コメント : 0 : トラックバック : 0 :
ホーム  次のページ »

search

ad



counter


tag cloud

category cloud