出るみたいです。
原書買わずに待てば良かった。。。
2009/08/03
Programming in Scalaで勉強
配列に値を設定してfor文で出力
var greetings = new Array[String](3)
greetings(0) = "Hello"
greetings(1) = "Good Morning"
greetings(2) = "Good Evening"
greetings(3) = "Good Afternoon"
for(i <- 0 to 3){
prnitln(greeting(i)
}
こんな書き方もできる。
var greetings = Array("Hello","Good Morning","Good Afternoon","Good Afternoon")
for(i <- 0 to 3){
prnitln(greeting(i))
}
2009/08/02
Programming in Scalaで勉強
引数を2つ渡し、大きい方の値を返却するメソッドmaxを定義する。
public int max(int a, int b){
if(a > b){
return a;
} else {
return b;
}
}
上記のjavaで書いたメソッドをそのままscalaで書き換えると
def max(a:Int, b:Int):Int = {になる。
if(a > b){
return a;
} else {
return b;
}
}
scalaではメソッドはdefで始まる。
javaでは戻り値、メソッド名、引数の順番だが、scalaではメソッド名、引数、戻り値の順番になる。
また、javaの引数は型、仮引数の順番だが、scalaでは仮引数、型の順番になる。
scalaではセミコロンを省略できるので
def max(a:Int, b:Int):Int = {と書いてもよい。
if(a > b){
return a
} else {
return b
}
}
また、returnも省略できるので
def max(a:Int, b:Int):Int = {と書ける。
if(a > b){
a
} else {
b
}
}
ついでにカッコも省略して
def max(a:Int, b:Int):Int = {
if(a > b)
a
else
b
}
}
時刻:
17:12
Programming in Scalaで勉強
Scalaには2種類の変数(valとvar)がある。
valはjavaのfinal変数と同じ。
varはjavaのfinalでない変数と同じ。
var greeting = "Hello"はOKだが
greeting = "bey"
val greeting = "Hello"はエラーとなる。
greeting = "Bey"
2009/08/01
PrepareInterceptorはActionで実際に呼び出されるメソッドの前処理用のメソッドを呼び出す。使用するためにはActionクラスでPreparableを継承する。
前処理用のメソッドとして以下のメソッドが順番に呼び出される(1,2はメソッドが存在する場合のみ、また2は1のメソッドが存在したら呼び出されない。)
- prepare{メソッド名}()
- prepareDo(メソッド名}()
- prepare()
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.Preparable;
public class ProperSample extends ActionSupport implements Preparable{
public void prepareHoge() throws Exception {
System.out.println("prepareHoge()")
}
public void prepareDoHoge() throws Exception {
System.out.println("prepareHoge()")
}
public void prepare() throws Exception {
System.out.println("prepare")
}
public String hoge() throws Exception{
return SUCCESS;
}
}
例えば、上記のようなクラスが存在しhoge()メソッドが呼び出されるURLが叩かれたとすると、
まずprepareHoge()がよばれ、次にprepare()がよばれる。(prepareHoge()が存在するのでprepareDoHoge()は呼び出されない。)その後に、他に積まれているインターセプターがあればそれを実行し、その後hoge()メソッドが呼ばれる。
デフォルトではprepare()は必ず呼び出される。これを止めたい(要するにprepare{メソッド名}()またはprepareDo{メソッド名}()だけを呼び出したい)場合はalwaysInvokePrepareフィールドを"false"にする。で、これを行うためには以下のような記述をする。
<interceptor-ref name="prepare">
<param name="alwaysInvokePrepare">false</param>
</interceptor-ref>
PrepareInterceptorはstruts-default.xmlで宣言されているinterceptor-stackにはすべて組み込まれている。よって、struts-default.xmlで宣言されているいずれかを使用する場合はstruts.xmlにPrepareInterceptorを使用するための定義を書く必要はない。
時刻:
1:20
仮にサポートされるすべてのインターフェースを継承したクラスを作成すると以下のようになる。各setterメソッドに対してServletConfigInterceptorが値を設定してくれる。
ServletContextAware、ServletRequestAware、ServletResponseAwareを継承してしまうとservletApiに依存したクラスになってしまうので注意が必要。(テストがしにくくなるとか、フレームワークがせっかく隠してくれてたのに〜 っているのが理由)リクエストの値がとりたい場合はRequestAware、セッションの値がとりたい場合はSessionAwareを継承しとけば値がとれる(かつservletApiにも依存しなくて済む)のでそれらの値がとりたいだけであれば、上記インターフェースの継承は不要。
また、SessionAware,RequestAware、ParameterAware、を継承してServletConfigInterceptorに値を設定してもらわなくても、Action内で直接以下のように書けば同じように値を取得できる(ServletConfigInterceptorがやっていることと一緒だけど。。)
ActionContext.getContext().getSession().get("foo");
ActionContext.getCongext().get("request").get("bar");
ActionContext.getParameters().get("hoge");
Actionに対して使用するインターセプターをstruts-default.xmlで宣言しているinterceptor-stackを使用する場合はstruts.xmlに対して何も記述の必要はない。(struts-default.xmlで宣言されているすべてのinterceptor-stackにServletConfigInterceptorが入っているため)もし、自分でinterceptor-stackをstruts.xmlに宣言して、その中にServletConfigInterceptorを追加したい場合は以下の記述を追加する。
<interceptor-ref name="servletConfig"/>
ServletConfigInterceptorはActionクラスにHttpServletRequest、HttpServletResponse、ServletContextなどの情報を設定してくれる。ただし、設定される為にはサポートされてるインターフェースをActionで継承しなければならない。サポートされるのは以下のインターフェース。
- ServletContextAware
- ServletRequestAware
- ServletResponseAware
- ParameterAware
- RequestAware -
- SessionAware
- ApplicationAware
- PrincipalAware
仮にサポートされるすべてのインターフェースを継承したクラスを作成すると以下のようになる。各setterメソッドに対してServletConfigInterceptorが値を設定してくれる。
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.PrincipalAware;
import org.apache.struts2.interceptor.PrincipalProxy;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.util.ServletContextAware;
public class HogeAction extends ActionSupport implements ServletContextAware,
ServletRequestAware,
ServletResponseAware,
ParameterAware,
RequestAware,
SessionAware,
ApplicationAware,
PrincipalAware{
private ServletContext servletContext;
private HttpServletRequest request;
private HttpServletResponse response;
private MapparameterMap;
private MaprequestMap;
private MapsessionMap;
private MapapplicationMap;
private PrincipalProxy principalProxy;
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
public void setParameters(MapparameterMap) {
this.parameterMap = parameterMap;
}
public void setRequest(MaprequestMap) {
this.requestMap = requestMap;
}
public void setSession(MapsessionMap) {
this.sessionMap = sessionMap;
}
public void setApplication(MapapplicationMap) {
this.applicationMap = applicationMap;
}
public void setPrincipalProxy(PrincipalProxy principalProxy) {
this.principalProxy = principalProxy;
}
}
ServletContextAware、ServletRequestAware、ServletResponseAwareを継承してしまうとservletApiに依存したクラスになってしまうので注意が必要。(テストがしにくくなるとか、フレームワークがせっかく隠してくれてたのに〜 っているのが理由)リクエストの値がとりたい場合はRequestAware、セッションの値がとりたい場合はSessionAwareを継承しとけば値がとれる(かつservletApiにも依存しなくて済む)のでそれらの値がとりたいだけであれば、上記インターフェースの継承は不要。
また、SessionAware,RequestAware、ParameterAware、を継承してServletConfigInterceptorに値を設定してもらわなくても、Action内で直接以下のように書けば同じように値を取得できる(ServletConfigInterceptorがやっていることと一緒だけど。。)
ActionContext.getContext().getSession().get("foo");
ActionContext.getCongext().get("request").get("bar");
ActionContext.getParameters().get("hoge");
Actionに対して使用するインターセプターをstruts-default.xmlで宣言しているinterceptor-stackを使用する場合はstruts.xmlに対して何も記述の必要はない。(struts-default.xmlで宣言されているすべてのinterceptor-stackにServletConfigInterceptorが入っているため)もし、自分でinterceptor-stackをstruts.xmlに宣言して、その中にServletConfigInterceptorを追加したい場合は以下の記述を追加する。
<interceptor-ref name="servletConfig"/>
2009/07/29
Scalaが最近,将来のJava 後継者の有力候補として注目を集めている。Java の創作者である James Gosling 氏やJRuby の主要開発者である Charles Nutter氏に続いて,Groovy の創作者であるJames Strachan氏もScalaへの賛意を表明している。
Javaの将来的な後継者としての Scala
この記事でScalaに興味が湧き、いろいろといじり始めている。英語ダメダメなのに洋書のProgramming in Scalaも買ってしまった。
まずはお決まりのやつ
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello, Scala!")
}
}
登録:
投稿 (Atom)