JavaBeans
日本語 | 珈琲豆 |
英語 | java beans |
ふりがな | じゃばびーんず、じゃう゛ぁびーんず |
フリガナ | ジャバビーンズ、ジャヴァビーンズ |
画面表示に使用する「部品」クラスの仕様。
Javaにおいて最も分かりにくい仕様のひとつ。
画面表示に使用するクラスを、「部品」として再利用できるようにするため決められた「仕様」が「JavaBeans」である。
JavaBeansの仕様に則して作られたクラスを「Java Bean」もしくは単に「Bean」「ビーン」と呼ぶ。
「画面表示」とは広義のGUIを指し、ウィンドウアプリケーションからWebアプリケーションまで含む。また、直接画面表示をする必要はなく、「画面表示のための部品となるクラス」であればなんでも当てはまる。
実際、現在最も使用頻度の高いJavaBeansの使用方法は、Webアプリケーションでの利用である。
サーブレット側で「画面に出力するための情報」をJava Beanクラスに格納し、HttpServletRequestインターフェイスかHttpSessionインターフェイスのsetAttribute()メソッドで名前を付けてセットすることで、JSP側で<jsp:useBean>JSPタグでそのまま変数として使用することができる。
この使用例では、Java Beanクラスは「データクラス」としての利用であり、画面表示を直接行っているわけではない。このような利用方法もJavaBeansに当てはまる。
JavaBeansの仕様では、Java Beanクラスは「プロパティ」を持つ。
プロパティとは「フィールドとgetter/setterの組み合わせ」のことである。
このgetter/setterのメソッド名は、必ず「フィールド名の頭文字を大文字にし、その前にget/setを付けたもの」とする必要がある。
たとえば、フィールド名が「valueData」であれば、getterは「getValueData()」、setterは「setValueData()」というメソッド名となる。
このプロパティの命名規則は非常に重要である。それは、リフレクションによって「プロパティ名」を指定することで「getter/setterを呼び出す」という処理を行うことが多いためである。
そのため、プロパティ名を元にgetter/setterを作らないと、適切なメソッドが呼び出せなくなってしまう。
この「プロパティ」の存在はJava Beanクラスにおいて最も特徴的な仕様であり、「プロパティさえ存在すればJava Beanクラスである」とさえ言われるほどである。
もうひとつ、JavaBeansの仕様では、Java Beanクラスは「直列化可能」である必要がある。
Java Beanクラスは、プロパティに格納した情報を保存できる必要があるため、Serializableインターフェイスの実装クラスとする必要がある。
ただし、これは絶対必要な条件ではない。実際、通常のサーブレットとJSPで使用する場合には直列化可能である必要はない。
ただし、システムによっては必要不可欠であるため、Serializableインターフェイスの実装クラスとしておいた方が安全だろう。
JavaBeansは、そもそも、WindowsにおけるOCXやActiveXのような「画面のコンポーネント」に対抗する仕様として作られている。そのため、仕様書等にはGUIでの利用を前提に書かれているものが多い。
しかし、Javaの主な使用目的がWebアプリケーションとなっている現在では、GUIコンポーネントとしての利用はあまり行われていない。
現在は「単なるデータクラス」として使われる事もあり、これが「JavaBeansとはなんなのか」という点を分かりにくくしている。
現実的には「JSPで使用する、プロパティを持つクラス」がJava Beanクラスの一般的な定義となっている。細かい仕様にこだわるときりがなく、また、非常に便利でよく利用するもののため、深く考えずに利用するのがいいだろう。
Javaにおいて最も分かりにくい仕様のひとつ。
画面表示に使用するクラスを、「部品」として再利用できるようにするため決められた「仕様」が「JavaBeans」である。
JavaBeansの仕様に則して作られたクラスを「Java Bean」もしくは単に「Bean」「ビーン」と呼ぶ。
「画面表示」とは広義のGUIを指し、ウィンドウアプリケーションからWebアプリケーションまで含む。また、直接画面表示をする必要はなく、「画面表示のための部品となるクラス」であればなんでも当てはまる。
実際、現在最も使用頻度の高いJavaBeansの使用方法は、Webアプリケーションでの利用である。
サーブレット側で「画面に出力するための情報」をJava Beanクラスに格納し、HttpServletRequestインターフェイスかHttpSessionインターフェイスのsetAttribute()メソッドで名前を付けてセットすることで、JSP側で<jsp:useBean>JSPタグでそのまま変数として使用することができる。
この使用例では、Java Beanクラスは「データクラス」としての利用であり、画面表示を直接行っているわけではない。このような利用方法もJavaBeansに当てはまる。
JavaBeansの仕様では、Java Beanクラスは「プロパティ」を持つ。
プロパティとは「フィールドとgetter/setterの組み合わせ」のことである。
このgetter/setterのメソッド名は、必ず「フィールド名の頭文字を大文字にし、その前にget/setを付けたもの」とする必要がある。
たとえば、フィールド名が「valueData」であれば、getterは「getValueData()」、setterは「setValueData()」というメソッド名となる。
このプロパティの命名規則は非常に重要である。それは、リフレクションによって「プロパティ名」を指定することで「getter/setterを呼び出す」という処理を行うことが多いためである。
そのため、プロパティ名を元にgetter/setterを作らないと、適切なメソッドが呼び出せなくなってしまう。
この「プロパティ」の存在はJava Beanクラスにおいて最も特徴的な仕様であり、「プロパティさえ存在すればJava Beanクラスである」とさえ言われるほどである。
もうひとつ、JavaBeansの仕様では、Java Beanクラスは「直列化可能」である必要がある。
Java Beanクラスは、プロパティに格納した情報を保存できる必要があるため、Serializableインターフェイスの実装クラスとする必要がある。
ただし、これは絶対必要な条件ではない。実際、通常のサーブレットとJSPで使用する場合には直列化可能である必要はない。
ただし、システムによっては必要不可欠であるため、Serializableインターフェイスの実装クラスとしておいた方が安全だろう。
JavaBeansは、そもそも、WindowsにおけるOCXやActiveXのような「画面のコンポーネント」に対抗する仕様として作られている。そのため、仕様書等にはGUIでの利用を前提に書かれているものが多い。
しかし、Javaの主な使用目的がWebアプリケーションとなっている現在では、GUIコンポーネントとしての利用はあまり行われていない。
現在は「単なるデータクラス」として使われる事もあり、これが「JavaBeansとはなんなのか」という点を分かりにくくしている。
現実的には「JSPで使用する、プロパティを持つクラス」がJava Beanクラスの一般的な定義となっている。細かい仕様にこだわるときりがなく、また、非常に便利でよく利用するもののため、深く考えずに利用するのがいいだろう。
参考サイト
<%-- webapps/sample-servlet/WEB-INF/jsp/sample.jsp --%>
<%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %>
<%--
pageEncodingには、このファイルを保存した時の文字コードを指定してください。
Windowsであれば"Windows-31J"を指定すればいいでしょう。
--%>
<jsp:useBean id="sample_bean" class="bean.SampleBean" scope="request"/>
<%--
SampleServletでセットしたJava Beanを取得します。
idでは、HttpServletRequestインターフェイスかHttpSessionインターフェイスの
setAttribute()メソッドの第1引数で渡した文字列を指定します。
classで、第2引数で渡したクラスを指定します。
scopeでスコープをセットします。HttpServletRequestを使用した場合にはrequest、
HttpSessionを使用した場合はsessionを指定します。
--%>
<html>
<head>
<title>JSPのサンプル</title>
</head>
<body>
<%
// <jsp:useBean>のidで指定した名前が、そのまま変数名となります。
// この変数名で、サーブレット側でセットしたデータにアクセスできます。
int i = sample_bean.getData();
out.println( i );
// 100
%>
</body>
</html>
// webapps/sample-servlet/WEB-INF/src/SampleServlet.java
// http://localhost:8080/sample-servlet/servlet/SampleServlet でアクセスできます。
// このサンプルプログラムは「サーブレット」の項目に書かれている準備を行ってから使用してください。
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import bean.SampleBean;
/**
* サーブレットのテスト。
*/
public class SampleServlet extends HttpServlet
{
/**
* リクエストとしてHTTPメソッドのGETが渡されるとこのメソッドが呼ばれます。
*/
public void doGet( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException
{
System.out.println( "SampleServlet#doGet()" );
// Content-Typeをセット。
response.setContentType( "text/html;charset=Windows-31J" );
// SampleBean Java Beanクラスを作成し、JSPで使えるようにセットします。
SampleBean sampleBean = new SampleBean();
sampleBean.setData( 100 );
request.setAttribute( "sample_bean", sampleBean );
// サーブレットコンテキストを取得します。
ServletContext servletContext = getServletContext();
// リクエストディスパッチャーを取得します。
RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher( "/WEB-INF/jsp/sample.jsp" );
// 指定したJSPへと転送します。
requestDispatcher.forward( request, response );
}
}
// webapps/sample-servlet/WEB-INF/src/bean/SampleBean.java
package bean;
// Java Beanは、JSPで使用する関係でパッケージに入れる必要があります。
// ここではbeanパッケージに入れます。
// 一応、Java Beanは直列化可能にする必要があります。
// 実際には必要ない場合も多いですが。
import java.io.Serializable;
/**
* SampleServletで使用するJava Beanクラスです。
*/
public class SampleBean implements Serializable
{
/**
* プロパティ。
*/
private int data;
/**
* コンストラクタ。
*/
public SampleBean()
{
data = 0;
}
/**
* プロパティのgetter。
*/
public int getData()
{
return data;
}
/**
* プロパティのsetter。
*/
public void setData( int value )
{
this.data = value;
}
}
<%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %>
<%--
pageEncodingには、このファイルを保存した時の文字コードを指定してください。
Windowsであれば"Windows-31J"を指定すればいいでしょう。
--%>
<jsp:useBean id="sample_bean" class="bean.SampleBean" scope="request"/>
<%--
SampleServletでセットしたJava Beanを取得します。
idでは、HttpServletRequestインターフェイスかHttpSessionインターフェイスの
setAttribute()メソッドの第1引数で渡した文字列を指定します。
classで、第2引数で渡したクラスを指定します。
scopeでスコープをセットします。HttpServletRequestを使用した場合にはrequest、
HttpSessionを使用した場合はsessionを指定します。
--%>
<html>
<head>
<title>JSPのサンプル</title>
</head>
<body>
<%
// <jsp:useBean>のidで指定した名前が、そのまま変数名となります。
// この変数名で、サーブレット側でセットしたデータにアクセスできます。
int i = sample_bean.getData();
out.println( i );
// 100
%>
</body>
</html>
// webapps/sample-servlet/WEB-INF/src/SampleServlet.java
// http://localhost:8080/sample-servlet/servlet/SampleServlet でアクセスできます。
// このサンプルプログラムは「サーブレット」の項目に書かれている準備を行ってから使用してください。
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import bean.SampleBean;
/**
* サーブレットのテスト。
*/
public class SampleServlet extends HttpServlet
{
/**
* リクエストとしてHTTPメソッドのGETが渡されるとこのメソッドが呼ばれます。
*/
public void doGet( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException
{
System.out.println( "SampleServlet#doGet()" );
// Content-Typeをセット。
response.setContentType( "text/html;charset=Windows-31J" );
// SampleBean Java Beanクラスを作成し、JSPで使えるようにセットします。
SampleBean sampleBean = new SampleBean();
sampleBean.setData( 100 );
request.setAttribute( "sample_bean", sampleBean );
// サーブレットコンテキストを取得します。
ServletContext servletContext = getServletContext();
// リクエストディスパッチャーを取得します。
RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher( "/WEB-INF/jsp/sample.jsp" );
// 指定したJSPへと転送します。
requestDispatcher.forward( request, response );
}
}
// webapps/sample-servlet/WEB-INF/src/bean/SampleBean.java
package bean;
// Java Beanは、JSPで使用する関係でパッケージに入れる必要があります。
// ここではbeanパッケージに入れます。
// 一応、Java Beanは直列化可能にする必要があります。
// 実際には必要ない場合も多いですが。
import java.io.Serializable;
/**
* SampleServletで使用するJava Beanクラスです。
*/
public class SampleBean implements Serializable
{
/**
* プロパティ。
*/
private int data;
/**
* コンストラクタ。
*/
public SampleBean()
{
data = 0;
}
/**
* プロパティのgetter。
*/
public int getData()
{
return data;
}
/**
* プロパティのsetter。
*/
public void setData( int value )
{
this.data = value;
}
}
<%-- webapps/sample-servlet/WEB-INF/jsp/sample.jsp --%> <%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %> <%-- pageEncodingには、このファイルを保存した時の文字コードを指定してください。 Windowsであれば"Windows-31J"を指定すればいいでしょう。 --%> <jsp:useBean id="sample_bean" class="bean.SampleBean" scope="request"/> <%-- SampleServletでセットしたJava Beanを取得します。 idでは、HttpServletRequestインターフェイスかHttpSessionインターフェイスの setAttribute()メソッドの第1引数で渡した文字列を指定します。 classで、第2引数で渡したクラスを指定します。 scopeでスコープをセットします。HttpServletRequestを使用した場合にはrequest、 HttpSessionを使用した場合はsessionを指定します。 --%> <html> <head> <title>JSPのサンプル</title> </head> <body> <% // <jsp:useBean>のidで指定した名前が、そのまま変数名となります。 // この変数名で、サーブレット側でセットしたデータにアクセスできます。 int i = sample_bean.getData(); out.println( i ); // 100 %> </body> </html> // webapps/sample-servlet/WEB-INF/src/SampleServlet.java // http://localhost:8080/sample-servlet/servlet/SampleServlet でアクセスできます。 // このサンプルプログラムは「サーブレット」の項目に書かれている準備を行ってから使用してください。 import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import bean.SampleBean; /** * サーブレットのテスト。 */ public class SampleServlet extends HttpServlet { /** * リクエストとしてHTTPメソッドのGETが渡されるとこのメソッドが呼ばれます。 */ public void doGet( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException { System.out.println( "SampleServlet#doGet()" ); // Content-Typeをセット。 response.setContentType( "text/html;charset=Windows-31J" ); // SampleBean Java Beanクラスを作成し、JSPで使えるようにセットします。 SampleBean sampleBean = new SampleBean(); sampleBean.setData( 100 ); request.setAttribute( "sample_bean", sampleBean ); // サーブレットコンテキストを取得します。 ServletContext servletContext = getServletContext(); // リクエストディスパッチャーを取得します。 RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher( "/WEB-INF/jsp/sample.jsp" ); // 指定したJSPへと転送します。 requestDispatcher.forward( request, response ); } } // webapps/sample-servlet/WEB-INF/src/bean/SampleBean.java package bean; // Java Beanは、JSPで使用する関係でパッケージに入れる必要があります。 // ここではbeanパッケージに入れます。 // 一応、Java Beanは直列化可能にする必要があります。 // 実際には必要ない場合も多いですが。 import java.io.Serializable; /** * SampleServletで使用するJava Beanクラスです。 */ public class SampleBean implements Serializable { /** * プロパティ。 */ private int data; /** * コンストラクタ。 */ public SampleBean() { data = 0; } /** * プロパティのgetter。 */ public int getData() { return data; } /** * プロパティのsetter。 */ public void setData( int value ) { this.data = value; } }