StrutsでFormに値を突っ込むときのあれこれ

最近結構使ったのでメモ。

以下のコードたちは基本的に、記憶頼り、脳内構築で
動作確認してないので注意。

(1)基本

<input type='text' name="TestForm" property="test">

なんて書くと、submitしたときに

public class TestForm extends Actionform {
    String test = null;

    public void setTest(String test) {
        this.test = test;
    }
    public String getTest() {
        return test;
    }
}

ってあるFormのtestに値を突っ込めるのはStrutsさんの基本。
なんとなく、id、name、propertyの順で書くと分かりやすい気がする。
String testId = TestForm.test;
見たいな感じで。

(2)プロパティにクラス
そして、こんな風に書くと

<input type='text' name="TestForm.TestBean" property="test">
public class TestForm extends Actionform {
    TestBean testBean = new TestBean();

    public void setTestBean(TestBean testBean) {
        this.testBean = testBean;
    }
    public String getTestBean() {
        return testBean;
    }
}
public class TestBean {
    String test = null;

    public void setTest(String test) {
        this.test = test;
    }
    public String getTest() {
        return test;
    }
}

こんな感じで持ってる、TestBeanの中のtestに値を突っ込める。

new TestBean();

newはしておかないと、何とか例外が出る。


(3)プロパティに配列とかリスト
それからそれから

<input type='text' name="TestForm[0]" property="test">
<input type='text' name="TestForm[1]" property="test">

こんな風にも書くことができて

public class TestForm extends Actionform {
    List<String> testList = new ArrayList<String>();

    public void setTestList(List<String> testList) {
        this.testList = testList;
    }
    public void getTestList() {
        return testList;
    }

    public String getTest(int index) {
        return testList.get(i);
    }
}

リスト(配列でも良いはず)の中に値を突っ込める。
property="XXXXX"

getXXXXX
のXXXXXが対応してるから、好きな名前をつけられたはず。
あと、実際にはgetterであうとおぶばうんずを起こさないような実装をする必要がある
こんな感じかしら?

public String getTest(int index) {
    for (int i = testList.size(); i < index; i++) {
        testList.add(new String());
    }
    return testList.get(index);
}


(4)プロパティにクラスのリスト
最後に(2)と(3)の組み合わせ。

<input type='text' name="TestForm[0].TestBean" property="test">
<input type='text' name="TestForm[1].TestBean" property="test">
public class TestForm extends Actionform {
    List<TestBean> testBeanList = new ArrayList<TestBean>();

    public void setTestBeanList(List<TestBean> testBeanList) {
        this.testBeanList = testBeanList;
    }
    public String getTestBean(int index) {
        return testBeanList.get(i);
    }
}

public class TestBean {
  //(略)
}

iterateタグ使ってたり

動的に要素が増えるようなjavascriptを組んでたりする場合にとても便利

HttpClient4でmixiにつないでみた

こことJavaのHttpClient 4 を触ってみた。
ここのHttpClientでログイン認証を試す(POST)
まるパクリだけど、あまりにもさっくり繋がってびっくりした。

HttpClient3でaddParameterでできてた、パラメータの設定が
一度NameValuePairのリストに詰め込んでから、setEntityでするようになった?
HttpClientとか3とか4とか以前に、触ったことがないからわからんけれど。

HTTPSでつなぐのに、特別な設定はいらない模様?
これはHttpClient3の公式でも
HTTPS通信は、普通のHTTP通信と同じくらいシンプルじゃなきゃいけない」
みたいな事書いてあるし、そうなんだろう。4でめんどくさくするとは思えないしw

それから

// 取得したレスポンスのストリーム(?)をクローズ
response.getEntity().getContent().close();

これをやらないと
HttpClient で例外
こういうことになる。

とりあえず、これで、自分のmixiのトップページが見られたので満足。
以下、ほぼまるパクリなソースコード

public class HttpClientTest {

    public static void main(String[] args) {

        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost("https://mixi.jp/login.pl");
        HttpPost httpGet = new HttpPost("http://mixi.jp/home.pl");
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("email", "xxxxxxxx@hotmail.co.jp"));
        params.add(new BasicNameValuePair("password", "xxxxxxxxxxxxx"));
        params.add(new BasicNameValuePair("next_url", "/home.pl"));
        try {
            httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
            System.out.println("executing request " + httpPost.getURI());
            System.out.println("-------------------------------------");

            HttpResponse response = httpClient.execute(httpPost);

            // レスポンスヘッダーの取得
            int statusCode = response.getStatusLine().getStatusCode();
            System.out.println(statusCode);
            System.out.println("-------------------------------------");
            
            // 取得したレスポンスのストリーム(?)をクローズ
            response.getEntity().getContent().close();
            if (statusCode == 200) {

                response = httpClient.execute(httpGet);

                statusCode = response.getStatusLine().getStatusCode();
                System.out.println(statusCode);

                Header[] headers = response.getAllHeaders();
                for (Header header : headers) {
                    System.out.println(header.getName() + ": " + header.getValue());
                }

                System.out.print(System.getProperty("line.separator"));

                // レスポンスボディの取得
                HttpEntity httpEntity = response.getEntity();
                System.out.println(EntityUtils.toString(httpEntity));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // HTTP接続を閉じる(shutdownを実行するとセッションが切れます)
            httpClient.getConnectionManager().shutdown();
        }
    }
}


俺の知ってるJAVAの配色じゃない・・・