2012年1月19日木曜日

Struts2(BeanとActionの分離)

Struts1 では, Action に相当するクラスと, データであるBean をActionFormのimplements で実装し, struts-config.xml に<form-bean>として定義しました。

Struts2 では,  ActionSupport の拡張クラスつまり, Actionの中に, Beanも定義できました。
しかし, データとActionは別のクラスとして, 実装しておいた方が, 見やすいといったこともあるでしょう。

Struts2のWebページには, そのようなサンプルがのっています。それを動作サンプルとして構成してみました。

簡単なフォルダ構成です
- Struts2Sample
| - web
|      | -  nameform.jsp   :   入力用フォーム
| - WEB-INF
       | -  classes
       |        | - struts.xml
       | - jsp
             | - person.jsp   :   結果の表示

ソースファイルなどのパスは省略
PersonAction.java       :   Action用
Person.java                 :   Form の Bean用

用意するもの
-  設定ファイル
-  Actionクラス
-  Bean(Formのデータを入れる)
-  入力フォーム JSP
-  結果の出力 JSP


●設定ファイル struts.xml   Action の登録をします

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts SYSTEM "http://struts.apache.org/dtds/struts-2.0.dtd" PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN">
<struts>
<package name="default" extends="struts-default">
  <action name="registerbean" class="com.atmarkplant.struts2.action.PersonAction"> <result name="success">/WEB-INF/jsp/person.jsp</result>
  </action>
   </package>
</struts>

●Action(PersonAction.java)
ActionSupport を拡張します。 PersonクラスというBeanのインスタンスを
入れておきます。変数はこれだけです。getter/setterも用意します。
  

package com.atmarkplant.struts2.action;

import com.atmarkplant.struts2.bean.Person;
import com.opensymphony.xwork2.ActionSupport;

public class PersonAction extends ActionSupport
{
private Person personBean;

       @Override
public String execute() throws Exception
{
return "success";
}
public Person getPersonBean()
{
return personBean;
}
public void setPersonBean(Person personBean)
{
this.personBean = personBean;
}

}


● Bean  (Person.java)
必要なデータをここで定義します。Formから得られる値を格納するためのものです
ここでもgetter/setterを用意しました。

package com.atmarkplant.struts2.bean;

import java.io.Serializable;

public class Person implements Serializable
{
private static final long serialVersionUID = -4873617641500115092L;

private String firstName;

private String lastName;

private String email;

private int age;

public String getFirstName()
{
return firstName;
}

public void setFirstName(String firstName)
{
this.firstName = firstName;
}

public String getLastName()
{
return lastName;
}

public void setLastName(String lastName)
{
this.lastName = lastName;
}

public String getEmail()
{
return email;
}

public void setEmail(String email)
{
this.email = email;
}

public int getAge()
{
return age;
}

public void setAge(int age)
{
this.age = age;
}

public String toString()
{
return "First Name: " + getFirstName() + " Last Name: " + getLastName() +
" Email: " + getEmail() + " Age: " + getAge();
}
}


●入力フォーム JSP(nameform.jsp)
普通のJSPです。ただし, name 属性のところにActionで使う変数名.Beanのフィールド名
という形でいれておきます。これでForm に値をいれて, Actionに飛ばすと, Actionの中のBean
のフィールドに1つ1つ入っていくわけです。(もちろん型を合わせなければなりません)


<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Register</title>
</head>
<body>
<h1>Register for a prize by completing this form</h1>
<s:form action="registerbean">
  <s:textfield name="personBean.firstName" label="First name" />
  <s:textfield name="personBean.lastName" label="Last name" />
  <s:textfield name="personBean.email" label="Email" />
  <s:textfield name="personBean.age" label="Age" />
  <s:submit value="Submit"/>
</s:form>
</body>
</html>


● 結果の出力 JSP(person.jsp)
<s:property> タグで取り出します。Actionで定義した名前でそのまま出力されます
(toString()のoverrideをしたので, それが表示されます)


<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Person Results</title>
</head>
<body>
<h1>Thank you for registering for a prize.</h1>
<p>Your registration information: <s:property value="personBean" /></p>
</body>
</html>


※このように, Formで得られた値をBean へ放り込むことができます。













0 件のコメント:

コメントを投稿