// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents

今回は、下記のような感じのネストされた設定画面を作るときの定石をまとめます。
#ref(01.png)

チェックボックスをクリックすると、、

#ref(02.png)

ネストされた設定が現れる、こんな感じです。


**画面側 [#tbc8ba99]
config.jellyは以下のように記述します。
 <j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" 
  xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form">
 
 <f:block>
   <table>
   <f:optionalBlock name="useMail" title="チェック結果をメールで送信する" 
        checked="${instance.addresses!=null}" >
   <f:entry title="メール送信先" field="addresses" 
        description="チェック結果をメール送信する宛先をカンマ区切りで指定してください。">
     <f:textarea />
   </f:entry>
     </f:optionalBlock>
   </table>
 </f:block>
 </j:jelly>
基本的にはこれだけで画面が構成されるはずです。



**Java(Builder)側 [#l0e22710]
次に画面から入れられた値を保持したり使用したりするJava側です。以下のように記述します。

 public class Test2Builder extends Builder {
 
     // ネストしたテキストボックスを作成するときの定石。
     private final EnableUseMailTextBlock useMail;
 
     public static class EnableUseMailTextBlock {
         private String addresses;
 
         @DataBoundConstructor
         public EnableUseMailTextBlock(String addresses) {
             this.addresses = addresses;
         }
     }
 
     private String addresses;
 
     public String getAddresses() {
         return addresses;
     }
 
     @DataBoundConstructor
     public Test2Builder(EnableUseMailTextBlock useMail) {
         this.useMail = useMail;
         if (useMail != null) { // targetProjectsは、ココを通らなければ初期値に戻る。
         if (useMail != null) {
             this.addresses = useMail.addresses;
         }
     }
      @Override
     public boolean perform(AbstractBuild build, Launcher launcher,
             BuildListener listener) throws InterruptedException, IOException {
 
         if (useMail == null) {
             // チェックボックスがOffの時の処理
         } else {
             // チェックボックスがOnなので、なかの値にアクセスしてなんか処理する
             // チェックボックスがOnなので、なかの値(addresses)にアクセスしてなにか処理する
          }
         return true;
     }
 
     // Overridden for better type safety.
     // If your plugin doesn't really define any property on Descriptor,
     // you don't have to do this.
     @Override
     public DescriptorImpl getDescriptor() {
         return (DescriptorImpl) super.getDescriptor();
     }
    
 //     Descriptorは省略
 
 
    // Descriptorは省略
 }



Jenkinsは画面のパラメタとJavaの世界を @DataBoundConstructor で紐付けますが((詳細は[[プラグイン開発>Java/Jenkins/プラグイン開発#p9ad086d]]を参照))

 @DataBoundConstructor
 public Test2Builder(EnableUseMailTextBlock useMail) {
     this.useMail = useMail;
     if (useMail != null) {
         this.addresses = useMail.addresses;
     }
 }
 
 public static class EnableUseMailTextBlock {
     private String addresses;
 
     @DataBoundConstructor
     public EnableUseMailTextBlock(String addresses) {
         this.addresses = addresses;
     }
 }

このようにネストされた Javaクラス EnableUseMailTextBlock を作成しビルダのコンストラクタに指定します。EnableUseMailTextBlock クラスのコンストラクタの引数もconfig.jellyにそろえてaddressesにすることで、データが渡されてきます。





----
この記事は
#vote(おもしろかった,そうでもない)


#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS