Top > SAStrutsあれこれ > Flexで従業員一覧を表示しましょう(異常系付き)


Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
-
|
-
|
-
|
|
|
!
|
|
!
!
package tutorial.action;
 
import java.io.IOException;
import javax.annotation.Resource;
import javax.xml.bind.JAXBException;
import org.seasar.struts.annotation.Execute;
import tutorial.dto.Employees;
import tutorial.service.EmployeeService;
import tutorial.util.XmlUtil;
 
public class SearchEmployeeAction {
 
    @Resource
    protected EmployeeService employeeService;
 
    @Execute(validator = false)
    public String findAll() throws IOException, JAXBException {
        Employees employees = new Employees();
        try {
            employees.employeeList = employeeService.findAll();
        } catch (RuntimeException e) {
            employees.result = Employees.FAULT;
            //とりあえず全部表示すると長いので適当に切ります。
            employees.message = e.toString().substring(0, Math.min(e.toString().length(), 150));
        }
        XmlUtil.sendXML(Employees.class, employees);
        return null;
    }
}

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
 
 
-
|
|
|
|
!
package tutorial.dto;
 
public class ResponseBase {
    final static public String SUCCESS = "success";  
    final static public String FAULT = "fault";
    public String result = SUCCESS;
    public String message = "";
}

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 
 
 
 
 
 
 
 
 
-
|
|
|
|
!
package tutorial.dto;
 
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import tutorial.entity.Employee;
 
@XmlRootElement(name="Response")
public class Employees extends ResponseBase {
    
    @XmlElementWrapper(name="Content")
    @XmlElement(name="Employee")
    public List<Employee> employeeList;
}
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 
 
 
 
 
 
-
|
|
|
|
|
!
    /**
     * 従業員情報を全件取得します。
     * 住所情報と部署情報も結合して取得します。
     * @return
     */
    @Override
    public List<Employee> findAll() {
        return select()
               .innerJoin(address())
               .innerJoin(department())
               .orderBy(asc(id()))
               .getResultList();
    }
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
|
|
|
|
|
|
!
!
package tutorial.util;
 
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.seasar.struts.util.ResponseUtil;
 
public class XmlUtil {
 
    /**
     * JAXB2ヘルパーメソッド
     * 渡されたオブジェクトをXMLに変換して、クライアントへ送信します。
     * @param clazz objのクラス情報
     * @param obj XMLへの変換対象オブジェクト
     * @throws JAXBException
     * @throws IOException
     */
    static public <T> void sendXML(Class<T> clazz, Object obj) throws JAXBException, IOException {
        HttpServletResponse httpServletResponse = ResponseUtil.getResponse();
        httpServletResponse.setContentType("application/xml");
        
        // POJO -> XML 変換を行うマーシャラを生成
        // clazzクラスをバインディングするコンテキストを生成
        JAXBContext context = JAXBContext.newInstance(clazz);
        Marshaller ma = context.createMarshaller();
        ma.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        
        // POJO -> XML 変換して送信
        PrintWriter out = new PrintWriter(httpServletResponse.getOutputStream());
        ma.marshal(obj, out);
        out.close();
    }   
}
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
<?xml version="1.0" encoding="utf-8"?>
<!-- (1)applicationComplete="show()"はHTMLのonloadです。-->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:web="*" applicationComplete="show()">
    <mx:Script>
        <![CDATA[
            import mx.rpc.http.mxml.HTTPService;
            import mx.utils.ObjectUtil;
            import mx.controls.Alert;
            import mx.utils.URLUtil;
            import mx.rpc.AsyncToken;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            import mx.collections.XMLListCollection;
            import mx.collections.ArrayCollection;
             
            // HTTPServiceを使用してHTTPリクエスト(GET)を行う
            private function show():void {
                
                // サーバーから受け取るエラーメッセージにマルチバイトが含まれている場合
                // この設定がないと文字化けします。
                // http://livedocs.adobe.com/flex/3_jp/langref/flash/system/System.html
                System.useCodePage = true;
  
                // HTTP通信用オブジェクトを生成
                var srv:HTTPService = new HTTPService();
                srv.addEventListener(ResultEvent.RESULT,resultHandler);
                srv.addEventListener(FaultEvent.FAULT,faultHandler);
                srv.showBusyCursor = true;
                srv.resultFormat = "e4x";
                srv.url = "http://localhost:8080/sastruts-flex/searchEmployee/findAll";
                srv.method = "GET";
                
                // リクエストを実行〜結果はresultHandlerで受け取ります。
                var at:AsyncToken = srv.send();
                
                // 投げたリクエストと非同期で発生するレスポンスを対応付けるために情報を持たせる
                at.url = srv.url.toLowerCase();
                at.resultFormat = "e4x";
            }
            
            // HTTPServiceが成功
            private function resultHandler(e:ResultEvent):void {
                
                //サーバー側の処理結果をチェックします。
                if( e.result.result  * "success" ) {
                    //DataGridにデータを渡します
                    dg1.dataProvider = XML(e.result.Content).children();
                } else {
                    Alert.show("サーバー処理失敗\n\n理由 : " + e.result.message);
                }
            }
            
            // HTTPServiceでエラーが発生した
            private function faultHandler(e:FaultEvent):void {
                Alert.show("HTTPService失敗\n\n理由 : " + e.fault.message);
            }
            
            //DataGridのDepartmentカラムにXMLの値をバインドする
            private function departmentColumnLabelFunction(item:Object, column:DataGridColumn):String {
                // itemにはEmployeeタグが来ます。子要素や属性はE4Xで取得
                return XML(item).department.name;
            }
            
            //DataGridのAddressカラムにXMLの値をバインドする
            private function addressColumnLabelFunction(item:Object, column:DataGridColumn):String {
                // itemにはEmployeeタグが来ます。子要素や属性はE4Xで取得
                return XML(item).address.name;
            }
            
        ]]>
    </mx:Script>
    
    <mx:Label x="10" y="10" text="Tutorial: Employee List" width="500" height="34" fontWeight="bold" fontFamily="MS ゴシック" fontSize="26"/>
    <mx:DataGrid width="500" id="dg1" editable="false" x="10" y="52" fontFamily="MS ゴシック">
        <mx:columns>
            <!-- (2)SAStrutsから取得するXMLデータと列をバインド-->
            <mx:DataGridColumn headerText="Id" dataField="id"/>
            <mx:DataGridColumn headerText="Name" dataField="name"/>
            <mx:DataGridColumn headerText="JobType" dataField="jobType"/>
            <mx:DataGridColumn headerText="Salary" dataField="salary"/>
            <mx:DataGridColumn headerText="Department" labelFunction="departmentColumnLabelFunction"/>
            <mx:DataGridColumn headerText="Address" labelFunction="addressColumnLabelFunction"/>
        </mx:columns>
    </mx:DataGrid>
    
</mx:Application>

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Response>
    <result>success</result>
    <message></message>
    <Content>
        <Employee>
            <id>1</id>
            <name>ALLEN</name>
            <jobType>SALESMAN</jobType>
            <salary>1600</salary>
            <departmentId>3</departmentId>
            <addressId>1</addressId>
            <address>
                <id>1</id>
                <name>STREET 1</name>
                <version>1</version>
            </address>
            <department>
                <id>3</id>
                <name>SALES</name>
                <version>1</version>
            </department>
        </Employee>
        <Employee>
            <id>2</id>
            <name>WARD</name>
            <jobType>SALESMAN</jobType>
            <salary>1250</salary>
            <departmentId>3</departmentId>
            <addressId>2</addressId>
            <address>
                <id>2</id>
                <name>STREET 2</name>
                <version>1</version>
            </address>
            <department>
                <id>3</id>
                <name>SALES</name>
                <version>1</version>
            </department>
        </Employee>
        <Employee>
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

添付ファイル: fileflex_emp_lst_e_1.jpg 216件 [詳細]

リロード   新規 編集 凍結解除 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2012-08-08 (水) 23:26:01 (2925d)