Spring MVC で簡単そうなエコーアプリを作って基本を学ぶ

前回は、プロジェクトに Spring MVC を設定したので簡単なアプリを作ってみます。

ponsuke-tarou.hatenablog.com

環境

ここで作るエコーアプリはこの本のSpring MVCの章にあるものです。

トップ画面から遷移した入力画面で値を入力して出力画面に表示します。
www.shoeisha.co.jp

トップ画面を作ります。

Controllerを作ります。

f:id:ponsuke_tarou:20180618154305p:plain

package example.app;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/** トップ画面用のController. */
@Controller
public class WelcomeController {
    /**
     * トップ画面の表示リクエストをハンドリングするためのメソッド.
     * RequestMappingアノテーションに"/"を指定することで、"/"というパスに対するリクエストがこのメソッドにマッピングされる.
     * @return トップ画面のView名.
     */
    @RequestMapping("/")
    public String home() {
        // トップ画面に表示するView名として"index"を返却すると「/src/main/webapp/index.jsp」が呼び出される。
        return "index";
    }
}

Viewを作成します。

以前、ViewResolverを設定しました。これにより、/WEB-INFディレクトリ配下に格納されているJSPファイルがViewとして扱われます。

index.jspを「/src/main/webapp/index.jsp」へ移動します。

以前、作ったindex.jspを表示できるようにControllerの@RequestMappingに合わせた場所へ移動します。
ponsuke-tarou.hatenablog.com
f:id:ponsuke_tarou:20180618160651p:plain

Tomcatを起動してindex.jspを表示してみます。

ponsuke-tarou.hatenablog.com
f:id:ponsuke_tarou:20180618161841p:plain

index.jspにエコーアプリケーションの入力画面を表示するリクエストを送信するリンクを追加します。

「c: 」は、以前プロジェクトにSpringを設定する中でJSPで使えるように設定しました。

<html>
<body>
    <h2>Hello World!</h2>
    <ul>
        <!--
         JSTL(JSP Standerd Tag Library)の「c:url」を使用して
         {アプリケーションのコンテキストパス} + "/echo"へのリンクを追加しています.
         -->
        <li><a href="<c:url value='/echo' />">エコーアプリケーションへ</a></li>
    </ul>
</body>
</html>
リンクが追加されたことを画面を表示して確認します。

f:id:ponsuke_tarou:20180618163551p:plain

入力画面を作成します。

HTMLのform要素内の入力値を保持するためのフォームクラスを作成します。

package example.app;

import java.io.Serializable;

/**
 * HTMLの<form>要素内で取り扱う入力値を保持するフォームクラス.
 */
public class EchoForm implements Serializable {

    /** serialVersionUID. */
    private static final long serialVersionUID = -3147370534900886671L;

    /** 入力値を保持するプロパティ定義. */
    private String text;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

Controllerを作成して表示リスクエストをハンドリングするためのメソッドを実装します。

package example.app;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * 入力画面のController.
 * RequestMappingアノテーションで指定する"echo"により"/echo"というパスのリクエストがこのControllerにマッピングされます.
 */
@Controller
@RequestMapping("echo")
public class EchoController {
    /**
     * 表示リスクエストをハンドリングするためのメソッド.
     * RequestMappingアノテーションでRequestMethod.GETを指定することで"GET /echo"というリクエストがこのメソッドにマッピングされます.
     * @param model
     * @return 入力画面を表示するJSPのView名.
     */
    @RequestMapping(method = RequestMethod.GET)
    public String viewInput(Model model) {
        // フォームオブジェクトを生成してModelに追加します。
        EchoForm form = new EchoForm();
        // 属性名を省略しているため、クラス名の"echoForm"という属性名で追加されます。
        // Modelに追加したオブジェクトは、HttpServletRequestにエクスポートされる仕組みとなっているため
        // JSPからは、リクエストスコープのオブジェクトとして参照できます。
        model.addAttribute(form);
        return "echo/input";
    }
}

Controllerのメソッドの返却値"echo/input"に合わせて「/WEB-INF/echo/input.jsp」で入力画面のViewを作成します。

<html>
<body>
    <h2>入力画面</h2>
    <!--
     Spring MVCから提供されている「form:form」要素を使用して、HTMLのフォームを作成すします.
     modelAttribute属性にフォームオブジェクトの属性名を指定します.
     「form:form」要素にはmethod/action属性が指定でき、省略すると
     method属性は"post"、action属性は画面表示時URLのアプリケーションのコンテキストパス以降の値 となります.
     ここのaction属性は、"{App名}/echo"となります.
     -->
    <form:form modelAttribute="echoForm">
        <div>テキストを入力してください :</div>
        <div>
            <!--
             Spring MVCから提供されている「form:input」要素を使用して、テキストフィールドを作成します.
             path属性に指定したechoForm(modelAttribute属性で指定)のプロパティが保持する値が初期値として表示されます.
             -->
            <form:input path="text" />
        </div>
        <div>
            <!-- Spring MVCから提供されている「form:button」要素を使用して、HTMLフォームの送信ボタンを作成します。 -->
            <form:button>送信</form:button>
        </div>
    </form:form>
</body>
</html>
トップ画面のリンクを押下して入力画面を表示してみます。

f:id:ponsuke_tarou:20180618173629p:plain

入力画面の入力値を出力画面に表示する処理を作成します。

入力値送信リクエストをハンドリングするためのメソッドをController(EchoController.java)に追加します。

    /**
     * 入力画面の送信リクエストをハンドリンクするためのメソッド.
     * RequestMappingアノテーションでRequestMethod.POSTを指定することで"POST /echo"というリクエストがこのメソッドにマッピングされます.
     * @param form 引数にフォームクラスを指定することでリクエストパラメータの値(入力値)をフォームオブジェクトに格納して受け取れます.
     *        また、フォームオブジェクトはModelにも自動的に追加される仕組みとなっているため、明示的にModelに追加する必要はありません.
     * @return 出力画面を表示するJSPのView名.
     */
    @RequestMapping(method = RequestMethod.POST)
    public String echo(EchoForm form) {
        return "echo/output";
    }

Controllerのメソッドの返却値"echo/output"に合わせて「/WEB-INF/echo/output.jsp」で出力画面のViewを作成します。

<html>
<body>
    <h2>出力画面</h2>
    <div>入力したテキストは・・・</div>
    <div>
        <!--
         JSTL(JSP Standerd Tag Library)の「c:out」を使用してフォームオブジェクト(echoForm)のプロパティ(text)値をHTMLに出力します.
         「c:out」を使用することで、XSS(クロスサイトスクリプティング)攻撃で使用される特殊な文字を単なる文字としてHTMLに出力できます.
         --><span><c:out value="${echoForm.text}" /></span></div>
    <div>です。</div>
    <br>
    <div>
        <!-- トップ画面を表示するリクエスト(GET /)を送信するリンクです. -->
        <a href="<c:url value='/' />">トップ画面へ戻る</a>
    </div>
</body>
</html>
出力画面を表示してみます。

f:id:ponsuke_tarou:20180618180909p:plainf:id:ponsuke_tarou:20180618180917p:plain

Bean Validationを使用した入力チェックを作成します。

Spring MVCでは、Bean Validationの仕組みを利用してフォームオブジェクトのプロパティに入力チェックルールを指定します。

フォームオブジェクト(EchoForm.java)にBean Validationの制約アノテーションを追加します。

Hibernate Validationは、前回pom.xmlで設定しました。

    /**
     * 入力値を保持するプロパティ定義.
     * Hibernate Validationが提供するNotEmptyアノテーションを付加することで入力必須チェックを行います.
     * Bean Validationが提供するSizeアノテーションを付加することで最大文字数のチェックを行います.
     */
    @NotEmpty
    @Size(max = 10)
    private String text;
Springのプロパティでは未入力時にデフォルトで空文字が設定されるため、必須チェックは @NotNull ではなく @NotEmpty を使用します。

Spring以外のプロパティ値に対しては Bean Validation が提供する @java.validation.constraints.NotNull で必須チェックが行えます。

Controllerの送信リクエストをハンドリンクするためのメソッド(EchoController#echo)でSpring MVCの入力チェック機能を有効化してエラーのハンドリング処理を追加します。

    /**
     * 入力画面の送信リクエストをハンドリンクするためのメソッド.
     * RequestMappingアノテーションでRequestMethod.POSTを指定することで"POST /echo"というリクエストがこのメソッドにマッピングされます.
     * @param form 引数にフォームクラスを指定することでリクエストパラメータの値(入力値)をフォームオブジェクトに格納して受け取れます.
     *        また、フォームオブジェクトはModelにも自動的に追加される仕組みとなっているため、明示的にModelに追加する必要はありません.
     *        <<入力チェック>>
     *        パラメータのフォームオブジェクトに Validアノテーションを付与することで、入力チェックを実施してその結果を BindingResult に格納できます.
     * @param result BindingResultは入力チェックするフォームオブジェクトの直後に指定します.
     *        BindingResult もModelに自動的に追加されるため、明示的にModelに追加する必要はありません.
     * @return 出力画面を表示するJSPのView名.
     */
    @RequestMapping(method = RequestMethod.POST)
    public String echo(@Valid EchoForm form, BindingResult result) {
        // BindingResult#hasErrorsを呼び出すことで入力チェックのエラー判定を行います。
        if (result.hasErrors()) {
            // エラーの場合は、入力画面のView名を返却し、入力画面にエラー情報を表示します。
            return "echo/input";
        }
        return "echo/output";
    }

View(input.jsp)にエラー情報を表示するパーツを追加します。

            <form:input path="text" />
            <!--
             Spring MVCが提供する「form:errors」要素を使用して、入力チェックのエラー情報を表示します.
             path属性に指定されたプロパティのエラー情報が表示されます。
             -->
            <form:errors path="text" />
        </div>
エラーになったときの入力画面を表示してみます。

f:id:ponsuke_tarou:20180618231043p:plainf:id:ponsuke_tarou:20180618231046p:plainf:id:ponsuke_tarou:20180618231050p:plainf:id:ponsuke_tarou:20180618231059p:plain

この本を読みながらやりました

www.shoeisha.co.jp

SpringプロジェクトにSpring MVCを設定する。

前回は、Springのプロジェクトを作ってTomcatを設定するところまでやりました。

ponsuke-tarou.hatenablog.com

環境

Spring MVC を設定します。

pom.xmlに依存関係を追加します。

  • pom.xml に追記して依存関係を追加していきます。
Spring MVC のモジュールを指定します。

spring-webmvc を指定すると Spring Web やその他のSpring Frameworkの依存モジュールへの依存関係を解決できます。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
</dependency>
Hibernate(ハイバネート) Validator を指定します。

Hibernate Validatorは、Bean Validation のリファレンス実装です。
Spring MVC は Bean Validation の仕組みを利用して入力チェックをします。
fits.hatenablog.com
you-tk.hatenablog.com

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>
JCL inplement over SLF4 と Logback を指定します。

Spring はJCL(Apache Commons Logging)のAPIを使ってログ出力を行います。
そのため、SLF4JのAPIにロギング処理をブリッジするJCLの実装クラスを提供するライブラリである JCL inplement over SLF4 と
SLF4Jの実装クラスを提供するライブラリであるLogbackを指定します。
ponsuke-tarou.hatenablog.com

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>

ContextLoaderListener のセットアップ

ContextLoaderListener クラスをサーブレットコンテナに登録することで、Webアプリケーション用のアプリケーションコンテキストを生成できます。
www.weblio.jp
qiita.com

空のコンフィギュレーションクラスを作成します。
package example.config;

import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
}
作成したコンフィギュレーションクラスをweb.xmlに設定して、アプリケーションコンテキストを生成できるようにします。

src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。

  <listener>
    <!-- ContextLoaderListenerクラスをサーブレットコンテナのリスナクラスとして指定します. -->
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>
  <context-param>
    <!-- AnnotationConfigWebApplicationContextクラスをサーブレットコンテナのパラメータに指定します. -->
    <param-name>contextClass</param-name>
    <param-value>
        org.springframework.web.context.support.AnnotationConfigWebApplicationContext
    </param-value>
  </context-param>
  <context-param>
    <!-- 作成したコンフィギュレーションクラスをサーブレットコンテナのパラメータに指定します. -->
    <param-name>contextConfigLocation</param-name>
    <param-value>example.config.AppConfig</param-value>
  </context-param>

DispatcherServlet のセットアップ

DispatcherServletクラスをサーブレットコンテナに登録することで、Spring MVC のフロントコントローラを利用できるようにします。
Spring MVCではWebアプリケーション用のアプリケーションコンテキストとは別に、DispatcherServlet 用のアプリケーションコンテキストを作成します。

DispatcherServlet 用のコンフィギュレーションクラスを作成します。
package example.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * DispatcherServlet用のコンフィギュレーションクラス.
 * EnableWebMvcアノテーション を指定すると、Spring MVC を利用するために必要となるコンポーネントのBean定義が自動で行われる.
 * ComponentScanアノテーション を指定すると、value属性に指定されたパッケージの配下にある Component や Controller などの
 * アノテーションを付与したクラスがスキャンされ、アプリケーションコンテキストにBean登録される.
 */
@Configuration
@EnableWebMvc
@ComponentScan("example.app")
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    // WebMvcConfigurerAdapterクラスを継承すると、デフォルトで適用されるBean定義を簡単にカスタマイズできる。
}
DispatcherServletクラスをサーブレットコンテナに登録します。

src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。

  <servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>
      <!-- DispatcherServletクラスをサーブレットコンテナに登録します. -->
      org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
      <!-- contextClassパラメータにAnnotationConfigWebApplicationContextを指定します. -->
      <param-name>contextClass</param-name>
      <param-value>
        org.springframework.web.context.support.AnnotationConfigWebApplicationContext
      </param-value>
    </init-param>
    <init-param>
      <!-- contextConfigLocationパラメータに作成したコンフィギュレーションクラスを指定します. -->
      <param-name>contextConfigLocation</param-name>
      <param-value>example.config.WebMvcConfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <!-- DispatcherServlet を使用してリクエストをハンドリングするURLのパターンを定義します. -->
    <servlet-name>app</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

日本語が文字化けしないようにCharacterEncordingFilter のセットアップをします。

CharacterEncordingFilterクラスをサーブレットコンテナに登録することで、画面から入力した日本語が文字化けしないようにします。
src/main/webapp/WEB-INF/web.xmlを開いて追記していきます。

  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>
      <!-- CharacterEncodingFilterクラスをサーブレットコンテナに登録します. -->
      org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
      <!-- encodingパラメータにリクエストパラメータの文字エンコーディングとしてUTF-8を指定します. -->
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <!--
       forceEncodingパラメータにリクエストとレスポンスの文字エンコーディングを上書きするかを指定します.
       trueを指定してリクエストは強制的に指定したUTF-8に上書きされ、レスポンスもUTF-8となります.
       -->
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <!-- CharacterEncodingFilterを適用するリクエストのURLパターンを指定します. -->
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

Viewを判別できるように ViewResolver をセットアップします。

Spring MVC では、ViewResolver を使用してView名を解決して使用するViewを判別します。
以下メソッドを作成したWebMvcConfigに追加します。

    /** ViewResolverのセットアップ用メソッド. */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        // ViewResolverRegistryクラスのjspメソッドを呼び出し JSP 用のViewResolverをセットアップします。
        // これにより、/WEB-INFディレクトリ配下に格納されているJSPファイルがViewとして扱われます。
        registry.jsp();
    }

JSPからSpring MVCのtaglibが利用できるように定義を追加します。

以前作成したinclude.jspに定義を追加します。
ponsuke-tarou.hatenablog.com

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

次回は、簡単なアプリを作ってみます。

ponsuke-tarou.hatenablog.com

この本を読みながらやっています。

www.shoeisha.co.jp

コモン・マロウの葉っぱを食べてみた。

天ぷらにしてみた。

味がしない・・・花も単品でお茶にすると味がしない・・・体にいいからいいか。
f:id:ponsuke_tarou:20180609215853j:plain

サラダにしてみた。

味がしない・・・何にでも合わせられるともいえる。
f:id:ponsuke_tarou:20180616140012j:plain

炒めてみた。

初めて味がした。ほうれん草っぽいような気がする。
f:id:ponsuke_tarou:20180616140100j:plain

Springのプロジェクトにプロジェクトファセットを設定する。

Tomcatを設定したのでプロジェクトファセットを設定します。
ponsuke-tarou.hatenablog.com

ファセットで、プロジェクトが使うものの定義をします。

  • ファセットの和訳 : 〔宝石などの〕面を刻む、〔物事の一つの〕相、様相

ファセットは、Java EE プロジェクトの特性および要件を定義し、ランタイム構成の一部として使用されます。
ファセットをプロジェクトに追加すると、そのプロジェクトは、特定のタスクを実行し、特定の要求を実現し、または特定の特性を持つように構成されます。
IBM Knowledge Center

プロジェクトの作成時にはさまざまな情報が収集され、それらに基づいてプロジェクト タイプの特定、標準ライブラリの追加、コンパイラ オプションの設定、パブリッシュ タスクの制御、ビルド パスの設定、アノテーション プロセッサの追加などが行われます。これらの情報は、プロジェクトの作成中にファセットを選択することによって指定します。
プロジェクト ファセットの設定

Eclipseでプロジェクトファセットを設定します。

  1. [Packge Exploer]でプロジェクトを選択します。
  2. 「Command + I」でプロジェクトの設定画面を開きます。
  3. 左側のメニューで[Progect Facets]を選択します。
  4. [Convert to Faceted...]リンクを押下します。f:id:ponsuke_tarou:20180311225506p:plain
  5. [Project Facet]の一覧で[Java]にチェックを入れて[Version]を「1.8」にします。
  6. [Dynamic Web Module]にチェックを入れて[Version]を「3.1」にします。
  7. 下の方に出てくる[Further configuration available...]リンクを押下します。f:id:ponsuke_tarou:20180311230123p:plain
  8. [Modify Faceted Project]画面で以下を設定します。
    • Content directory : /WebContent
      • HTMLや、CSSや、画像ファイルなどのコンテンツを格納するディレクトリルートです。
      • デフォルトで入っていたらそのままで。
    • Generate web.xml....... : チェックする
  9. [OK]ボタンを押下します。
  10. [Dynamic Web Module]で[Runtimes]を押下します。
  11. [Apatch Tomcat v8.0]にチェックを入れます。f:id:ponsuke_tarou:20180311230759p:plain
  12. [Apply] > [OK]ボタンを押下します。

f:id:ponsuke_tarou:20180606155313j:plain

わいるどふらい(WildFly)って何?から学ぶEJB

WildFlyは、オープンソースJavaEEアプリケーションサーバです。

WildFlyは、Javaで記述されたサーバサイドアプリケーションを動作させるための基盤を提供します。
www.ossnews.jp

JBoss Application Serverから改名しました。

WildFly(ワイルドフライ)とは、JBoss AS(コミュニティ版)とJBoss EAPエンタープライズ版)との混同を避けるため2014年4月にJBoss ASが改名された名称です。
その為、名称が変更されたのみとなっており、開発コミュニティ(オープンソースプロジェクト)やソフトウェア自体などJBoss ASと変わりません。
www.ossplaza.com

JBoss Application Server は1999年にEnterprise JavaBeansコンテナとして開発をされたJ2EEアプリケーションサーバです。
www.ossplaza.com

Tomcatとの違いはEJBが使えることです。

同様なサーバサイドプラットフォームとして「Tomcat」があります。
Tomcat」はJSP/Servletを処理するアプリケーションサーバです。
WildFly」は、TomcatをWebコンテナとして搭載しています。そのため、EJBJSP/Servletの両方を処理できます。
www.ossnews.jp

Tomcatで提供される機能は基本的にServlet, JSP, JDBC接続プールのみで、他のものは提供されていません。シンプルですが、他のものが必要になったときに、それらをインテグレーションするコストが発生するなど、少し面倒なことになります。
TomcatになくてJBossにあるものを軽く列挙してみます。

Java EEなもの
JTAトランザクションマネージャ
EJB
MDB
JPA
・JMS
JCA
JAX-WS
JBoss固有なもの
JMX
log4jを用いたログ基盤
・分散キャッシュなどの各種クラスタリングサービス
nekop.hatenablog.com

log4jはログを出力するAPIです。

ponsuke-tarou.hatenablog.com

EJBは、JavaEEに既定されているサーバサイド向けのJavaBeansです。

EJBを利用したシステムの開発者は必要な機能を「Bean」(ビーン)と呼ばれるJavaクラスとして開発していき、これを繋ぎ合わせてアプリケーションを構築する。BeanはEJBの仕様に準拠したアプリケーションサーバに組み込まれて実行される。サーバ側でトランザクション処理やDI(Dependency Injection:依存性注入)、セキュリティ制御などの諸機能を提供してくれるため、Beanの開発者はこれらに個別に対応する必要はなく、自らのビジネスロジックの記述に集中できる。
e-words.jp

まず、JavaBeansはJavaで書かれた再利用可能なソフトウェアコンポーネントのことです。

Java Beansはプログラムの再利用を目的としており、汎用的なロジックで構成されているクラスである。Javaで作成された移植可能なプラットフォームに依存しないコンポーネント・モデルで、JavaBean仕様に従う。 サーバーサイド向けのJavaBeansはEnterprise JavaBeansと呼ばれている。
JavaBeans - Wikipedia

JavaBeansは、Sun Microsystems社のJavaBeans仕様に準拠した再使用可能なソフトウェア・コンポーネントです。JavaBeans仕様は、JavaBeanとなる一式のJavaクラスによって実装されるインタフェースおよびパッケージングの詳細を規定します。 開発者は、JavaBeansをプログラムを使用して組み合せるか、Oracle JDeveloperなどのビジュアル・プログラミング環境を使用してアプリケーションを作成できます。
Oracle Javaロードマップ: JavaBeans

技術的な仕様のことを指してJavaBeansということもあります。

Javaで作成された移植可能なプラットフォームに依存しないコンポーネント・モデルで、JavaBean仕様に従う。 再使用可能なコンポーネントを作成できる。
用語集

JavaBeansの特徴

JavaによるWebアプリケーション入門

①プロパティ

JavaBeansは、「プロパティ」と呼ばれるものをもつJavaクラスです。あるBeanが持つ「属性」を「プロパティ」と考えることができます。
Javaのクラスでは、クラスの属性は、クラス中のフィールドで表現されると考えられます。ところが、あるBeanが持つプロパティは、クラスのフィールドとは関係ありません。ある特定のネーミング・ルールに従ったメソッドの存在が、そのBeanのプロパティを決めているのです。
JavaBeansのネーミング・ルールでは、あるBeanに次のようなメソッドがあるとき、そのBeanにはtitleというプロパティが存在することになります。

String getTitle ( ) ;
void   setTitle ( String title);
  • ネーミング・ルール
    • setter、getter:プロパティ名の先頭の文字を大文字にして、"set"や"get"の文字を加える
      • setter名 = "set" + ( プロパティ名 )'
      • getter名 = "get" + ( プロパティ名 )'
    • プロパティ名:setter名やgetter名から、先頭の"set"、"get"を取り除いた文字列
      • プロパティ名 = ( setter名から、先頭の"set"を取り除いたもの ) = ( getter名から、先頭の"get"を取り除いたもの )
② 永続化

Beanは、必要に応じてオブジェクトの状態を保存したり、復元したりすることができなければいけません。このことを、Beanを「永続化」する、といいます。このためには、Beanにjava.io.Serializableインタフェースを実装する必要があります。このインタフェースにはメソッドは定義されていないので、次のように定義するだけで構いません。

import java . io . Serializable;

public class HogeBean implements Serializable {
     .....
}
③ 引数無しのコンストラクタ

Beanには引数無しのコンストラクタが必要です。

import java . io . Serializable;

public class HogeBean implements Serializable {
public HogeBean ( ) {
.....
}
.....
}

Beanの種類

Session Bean:セッションを保持し、一時的なロジックを保存するオブジェクト

ビジネスロジックを実装するためのEnterprise Bean

  • Stateful Session Bean:クライアントごとの状態を保持するセッションBean
  • Stateless Session Bean:クライアントごとの状態を保持しないセッションBean
  • Singleton Session Bean:常に同じインスタンスへのアクセスが保証されているシングルトンなセッションBean
Message Driven Bean ( メッセージ駆動型Bean):非同期処理の記述などJMS(Java Message Service)を使い、非同期のメソッドの呼び出しをサポートするEnterprise Bean
Entity Bean:永続的なデータを保存するオブジェクト、(Java EE 7)EJB 3.2で廃止

f:id:ponsuke_tarou:20180529002156j:plain

うちの庭という名の極小花壇

アボカド

ハス

  • 2018-05-24 数年前に生ゴミを花壇にコンポストしたらガンガン生えてきた。現在4本成長中。虫もつかないが実もつかない。余裕で越冬してひたすらでかくなる。

f:id:ponsuke_tarou:20180529221234j:plain

パッションフルーツ

パッシフロラ・エドゥリス

  • 別名:クダモノトケイ
  • 原産地:ブラジル、パラグアイ
  • 収穫期:6-8月
  • 紫色系は、自家受粉性で1本で実がなる。
  • 2018-05-24 3年で1つしか実がならないがよくでかくなる。

あじさい

名称不明

f:id:ponsuke_tarou:20180520100157j:plain

ダンスパーティー

f:id:ponsuke_tarou:20180528185223j:plain

シソ科

ラベンダー

アングスティフォリア
  • 別名:イングリッシュラベンダー
  • 学名:Lavandula angustifolia
  • 名称不明

f:id:ponsuke_tarou:20180528185004j:plainf:id:ponsuke_tarou:20180609223003j:plain

  • ほのか

f:id:ponsuke_tarou:20180513135643j:plain

ストエカスラベンダー
  • 別名:フレンチラベンダー
  • 学名:Lavandula stoechas
  • 名称不明
    • 2018-05-22 春に盛大に切り戻したので今年のお花は諦める。

f:id:ponsuke_tarou:20180523083420j:plain
f:id:ponsuke_tarou:20180528185203j:plain

ラベンダーデンタータ
  • 別名:フリンジラベンダー、キレハラベンダー
  • 学名:Lavandula dentata
  • 名称不明

f:id:ponsuke_tarou:20180513142024j:plain

  • 名称不明

f:id:ponsuke_tarou:20180528184939j:plainf:id:ponsuke_tarou:20180609223043j:plain

ローズマリー

f:id:ponsuke_tarou:20180520100057j:plain

タイム

  • 別名:タチジャコウソウ、イブキジャコウソウ
  • 学名:Thymus vulgaris L.
  • 分類:シソ科イブキジャコウソウ属(ティムス属)
コモンタイム

f:id:ponsuke_tarou:20180520105234j:plain

ゴールデンレモンタイム
  • 学名:Thymus x citriodorus ”Aureus”

f:id:ponsuke_tarou:20180520105259j:plain

  • 2018-05-29 使いきれなくてオリーブオイルに突っ込んだ。流行りのハーバ何とかっぽい。

f:id:ponsuke_tarou:20180529222042j:plain

マロウ

コモンマロウ

f:id:ponsuke_tarou:20180528185112j:plain

ユリ科

ゆり

夫婦百合

f:id:ponsuke_tarou:20180520095741j:plain

名称不明

f:id:ponsuke_tarou:20180520102111j:plain
f:id:ponsuke_tarou:20180619223559j:plain

デルフィニウム

ブルーミラー

  • 学名:Delphinium chinensis
  • 別名:Larkspur、オオヒエンソウ
  • 耐寒性1年草
  • 2018-05-22 地植えしてから1年草なのを知った。1回目の花をドライフラワーにしたら凄く色が残って良かった。

f:id:ponsuke_tarou:20180513141419j:plain
f:id:ponsuke_tarou:20180528185245j:plain

トリフォリウム

  • 学名:Trifolium

プリンセス・クローバー

  • 学名:Trifolium repens
  • 分類:マメ科シャジクソウ属(トリフォリウム属)
  • 多年草
  • レオノーレ

f:id:ponsuke_tarou:20180513142006j:plain

コウモリラン

  • 別名:ビカクシダ
  • 分類:ウラボシ科ビカクシダ属
  • 原産地:東南アジア、ポリネシア、亜熱帯オーストラリア
  • 樹木や岩などに付着して生育する着生シダ
  • 根を保護したり落ち葉や雨水などを受けるための付着葉と、繁殖のための胞子がつく胞子葉、2種類の葉がある

f:id:ponsuke_tarou:20180520095534j:plain

月桂樹

f:id:ponsuke_tarou:20180520101148j:plain

すみれ

ムーランフリルネロ

  • スミレ科ビオラ
  • 時間が立つと黒から濃い紫色に変色していく
  • 2018-05-22 ナメクジの餌食中。

雲仙コメツツジ

f:id:ponsuke_tarou:20180524083628j:plain

キク科

ムギワラギク

  • 別名:帝王貝細工(ていおうかいざいく)
  • 分類:キク科ムギワラギク属
  • 学名:Xerochrysum bracteatum
コロロ
  • フランボワーズ

f:id:ponsuke_tarou:20180513140444j:plain

ダリア

  • 学名:Dahlia
  • 別名:テンジクボタン
  • キク科テンジクボタン属(ダリア属)
ラベラ・ピッコロ

f:id:ponsuke_tarou:20180523083157j:plain

カモミール

  • 学名: Matricaria chamomilla
  • 分類:キク科カミツレ
  • 2018-05-22 種から育成中。

f:id:ponsuke_tarou:20180524083724j:plain

ティランジア

銀葉種

チランジア・カプトメドゥーサエ

f:id:ponsuke_tarou:20180520234219j:plain

サンスベリア

  • 学名:Sansevieria trifasciata
  • 分類:キジカクシ科チトセラン属(サンスベリア属)※分類体系によってリュウゼツラン科
  • 別名:チトセラン、厚葉千歳蘭

サンスベリア・トリファスキアタ・ローレンティ

  • 学名:Sansevieria trifasciata 'Laurentii'
  • 別名:トラノオフクリンチトセラン
  • 原産地:熱帯アフリカ
  • 2018-05-22 水に入れておいたら切断面から根がめきめき出ていた。

f:id:ponsuke_tarou:20180523083000j:plain

お亡くなりになってしまった方々

パンジー:名称不明

  • 2018-05-22 ナメクジの餌食中。
  • 2018-06-20 ナメクジの餌食になったところをバッサリ切ったら蘇らなかった・・・。

f:id:ponsuke_tarou:20180523002513j:plain

MacにPython3をインストールする方法

f:id:ponsuke_tarou:20180512230306p:plain

環境

Mac にはデフォルトでPython2がインストールされています。

$ python --version
Python 2.7.10
$ which python
/usr/bin/python

qiita.com

方法

ActiveTcl をインストールします。

ここでインストールしておかないと Python のIDLEを起動いた時に警告メッセージが表示されます。
qiita.com

インストールする ActiveTcl をOSによって確認します。

www.python.org
今回は「ActiveTcl 8.5.18.0」です。
f:id:ponsuke_tarou:20180513002102p:plain

対象の ActiveTcl をダウンロードしてインストールします。

www.activestate.com
f:id:ponsuke_tarou:20180513002232p:plain
f:id:ponsuke_tarou:20180513003543p:plain

Python3 をインストールします。

qiita.com

公式サイトからダウンロードします。

Pythonの公式サイトにアクセスして pkg(今回はpython-3.6.5-macosx10.6.pkg)ファイル をダウンロードします。
pkgファイルをダブルクリックするとインストーラーが起動します。
www.python.org
f:id:ponsuke_tarou:20180512230455p:plain

インストーラーでインストールします。

インストールすると Pythonインタープリター と 標準ライブラリ だけでなく IDLE(アイドル)という統合開発環境までインストールされます。
f:id:ponsuke_tarou:20180512231150p:plainf:id:ponsuke_tarou:20180512231153p:plainf:id:ponsuke_tarou:20180512231206p:plainf:id:ponsuke_tarou:20180512231211p:plainf:id:ponsuke_tarou:20180512231303p:plainf:id:ponsuke_tarou:20180512231311p:plain

バージョンと場所を確認します。

バージョンを確認するコマンドはPython2だと `python --vesion` でしたが、Python3は `python3 --version` になります。

$ python3 --version
Python 3.6.5
$ which python3
/usr/local/bin/python3

note.nkmk.me

注意:デフォルトであったPython2を消してはなりません。

Apple が提供している Python のビルドは /System/Library/Frameworks/Python.framework と /usr/bin/python にそれぞれインストールされています。これらは Apple が管理しているものであり Appleサードパーティのソフトウェアが使用するので、編集したり削除したりしてはいけません。
4. Macintosh で Python を使う — Python 3.6.5 ドキュメント

統合開発環境であるIDLEをみてみます。

www.weblio.jp

IDLE を起動します。

Lanchpad から IDLE を起動します。
f:id:ponsuke_tarou:20180512233532p:plain

インタラクティブシェル が表示されます。

f:id:ponsuke_tarou:20180513002509p:plain
この画面で頑張っているのがインタラクティブシェルという方だそうです。
ここで具体的な操作をおこなうそうです。

「Hellow Python」と表示させてみます。

画面の「>>>」は入力待ち状態です。

>>> print('Hellow Python')
Hellow Python