どうも、シンジです。

緊急事態です!

なんと、あの有名なフレームワークのサポートがあと2016年9月26日で終了します。

そう、 「Seasar2」 です。お世話になった人もたくさんおられるかと思います。私も実際に利用させていただきました。まだ、Seasar2が成長段階だったときに。。。

一時期、Seasar3が出るとか出ないとかという噂もありましたが、結局世に出ることなく、新規開発も止まってしまいました。(バグフィックスなどのサポートは継続)

どうでしょう。このタイミングで新しい世界に飛び込んでみませんか?

 

JavaEEへの移行

私は社内で「JavaEE」を勧めてきました。しかしながら現場によっては、Seasar2を使っていたり、学習コストを取るほどの余裕がないとか、理由は様々で、なかなか浸透せず。。もちろん、私が携わっているプロジェクトでは、積極的に利用するようにしています。なぜ、そこまで JavaEE を勧めるか?そういった疑問を抱く人も少なくはありません。

そういう人は一度Javaのカンファレンスなどに参加してみてください。Javaの素晴らしさ、JavaEEを使うことのメリットを実感することができると思います。私も毎年実施されているJava Day Tokyoに参加して、Javaの魅力に惹かれました。

JavaEEを使うことのメリット

 icon-chevron-circle-right 保守面
フルスタックなので、レイヤごとのライブラリの寄せ集めが不要。標準技術で実現が可能。
 icon-chevron-circle-right 生産面
フレームワークとしてのJavaEEは成長段階であり、更なる生産性向上が期待できる。
 icon-chevron-circle-right 品質面
バグ、脆弱性などが発見された場合は、APサーバのベンダによるサポートが行われる。

 

JavaEE 以外にも素晴らしいフレームワークはたくさん存在します。どれを使うかは、現場の状況やメンバーのスキルにもよると思います。私の場合は、情報に流されやすいので、ネットで使いやすいと書かれていたら試しに使ってみたりしています。これは使えるってなったら、実際に業務に導入してます。ちなみにマイブームは JavaEE Playframework です。その中でも今回は、JavaEEとの比較についてお話していきます。JavaEEへの移行の際の判断材料として参考にしていただければと思います。

まず、Seasar2のサポートが終了と聞いて、今すぐ移行せねばと考えている人、ちょっと待ってください。

あと、1年あります。様々なフレームワークをじっくり検討する時間はあります。ただ、一つ言えるのは新規案件ではSeasar2は採用しないでください。一方、既存システムにおいては、無理して移行する必要はありません。次期のリプレースの際に移行すればいいと思います。

Seasar2 から JavaEE へ移行する際に、実装はどう変わるの?と気になると思います。今回は簡単ですが、 MVCフレームワークを使った実装を使って比較していこうと思います。

 

アーキテクチャの違いは?

Seasar2 はSAStrutsというアクションベースの MVCフレームワークです。 JavaEE は(現在のところ)JPAというコンポーネントベースの MVCフレームワークです。

アクションベースとコンポーネントベースの違いについては、以前お話したJSFについてのブログを見てください。

【JavaEE】今からでも間にあうJSF入門 
http://www.dcom-web.co.jp/blog/2015/0622/  

 

サンプルアプリ使って比較してみる

 icon-check 環境について

[table id=36 /]
※1 JavaEEを開発する場合は NetBeansの方が使いやすいです。
※2 Tomcatでは動きません。

 

 icon-check サンプルアプリについて

サンプルアプリの概要は以下のとおりです。

 

1. ユーザ一覧画面表示

SAStruts
【IndexAction.java】
public class IndexAction {

    public List users;

    @Resource
    public UserService userService;

    @Execute(validator = false)
    public String index() {
        this.users = this.userService.findAll();
        return "index.jsp"; // 戻り値としてJSPを返却
    }
}
【index.jsp】
新規登録
氏名 誕生日 年齢    
${user.name} ${user.birthday} ${user.age} 編集 削除

 

JSF
【IndexBean.java】
@ManagedBean
@RequestScoped
public class IndexBean {
    
    @EJB
    private UserService userService;
    
    private List users;

    public IndexBean() {
    }
    
    @PostConstruct
    public void init(){
        this.users = this.userService.findAll();
    }

    public List getUsers() {
        return users;
    }    
}
【index.xhtml】
新規登録
氏名 誕生日 年齢    
#{user.name} #{user.birthday} #{user.age} 編集 削除
 icon-exclamation-circle ポイント!

・SAStruts のアクションの場合は JSPを返却するのに対し、JSFは画面表示後に管理ビーンが呼び出されるため返却なし
・JSPは JSTLタグ、FaceletsJSFタグを使って、データを出力する。
Faceletsでも JSTLを利用できるが、JSFタグと実行タイミングが異なるため利用しない方がいい。

 

2. ユーザ情報を登録

SAStruts
【CreateAction.java】
public class CreateAction {

    @Resource
    @ActionForm
    protected UserForm userForm;

    @Resource
    protected UserService userService;

    @Execute(validator=false)
    public String index(){
        return "form.jsp";
    }  
  
    @Execute(validator=false)
    public String save(){
        User entity = new User();
        BeanUtil.copyProperties(userForm,entity);
        this.userService.insert(entity);
        return "/?redirect=true";
    }
}
【form.jsp】
  氏名
  
  誕生日
  
  年齢
  
  保存

 

JSF
【CreateBean.java】
@ManagedBean
@RequestScoped
public class CreateBean {
    
    @EJB
    private UserService userService;
    
    private User user = new User();

    public CreateBean() {
    }
    
    @PostConstruct
    public void init(){
    }
    
    public String save(){
        this.userService.create(this.user);
        return "index?faces-redirect=true";
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    } 
}
【create.xhtml】
    氏名
    
    誕生日
    
    年齢
    
    

 icon-exclamation-circle ポイント!

・SAStrutsの場合、ActionFormを介してデータを受け取るが、JSFは直接エンティティで受け取れる

 

3. ユーザ情報を更新

SAStruts
【UpdateAction.java】
public class UpdateAction {

    @Resource
    @ActionForm
    protected UserForm userForm;

    @Resource
    protected UserService userService;

    @Execute(validator = false,urlPattern="{id}")
    public String index(){
        BeanMap conditions = new BeanMap();
        conditions.put("id", userForm.id);
        List entity = this.userService.findByCondition(conditions);
        BeanUtil.copyProperties(entity.get(0), userForm);
        return "form.jsp";
    }

    @Execute(validator = false,urlPattern="{id}/save")
    public String save(){
        User entity = new User();
        BeanUtil.copyProperties(userForm,entity);
        this.userService.update(entity);
        return "/?redirect=true";
    }
}
【form.jsp】
  氏名
  
  誕生日
  
  年齢
  
  
  保存

 

JSF
【UpdateBean.java】
@ManagedBean
@RequestScoped
public class UpdateBean {
    
    @EJB
    private UserService userService;
    
    private User user = new User();
    
    private Long id;

    public UpdateBean() {
    }
    
    public void init(){
        this.user = this.userService.find(this.id);
    }
    
    public String save(){
        this.userService.update(this.user);
        return "index?faces-redirect=true";
    }

    public void setId(Long id) {
        this.id = id;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}
【update.xhtml】
    
    


    氏名
    
    誕生日
    
    年齢
    
    
    

 icon-exclamation-circle ポイント!

・JSFはURLを意識させない設計のため、基本的にPOSTベースの通信になる。GETを利用する場合は、パラメータを受け取るための処理の実装が必要になる。

 

4. ユーザ情報を削除

SAStruts
【DeleteAction.java】
public class DeleteAction {

    @Resource
    @ActionForm
    protected UserForm userForm;

    @Resource
    protected UserService userService;

    @Execute(validator = false,urlPattern="{id}")
    public String index(){
        BeanMap conditions = new BeanMap();
        conditions.put("id", userForm.id);
        List entity = this.userService.findByCondition(conditions);
        BeanUtil.copyProperties(entity.get(0), userForm);
        return "index.jsp";
    }

    @Execute(validator = false,urlPattern="{id}/save")
    public String save(){
        User entity = new User();
        BeanUtil.copyProperties(userForm,entity);
        this.userService.delete(entity);
        return "/?redirect=true";
    }
}
【index.jsp】
  氏名
  ${name}
  誕生日
  ${birthday}
  年齢
  ${age}
  
  保存

 

JSF
【DeleteBean.java】
@ManagedBean
@RequestScoped
public class DeleteBean {
    
    @EJB
    private UserService userService;
    
    private User user = new User();
    
    private Long id;

    public DeleteBean() {
    }
    
    public void init(){
        this.user = this.userService.find(this.id);
    }
    
    public String save(){
        this.userService.delete(this.user);
        return "index?faces-redirect=true";
    }
    
    public void setId(Long id) {
        this.id = id;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }   
}
【delete.xhtml】
    
    


    氏名
    #{deleteBean.user.name}
    誕生日
    #{deleteBean.user.birthday}
    年齢
    #{deleteBean.user.age}
    
    

 

まとめ

主にView、Controllerを見てきましたが、いかがでしょうか?

他にModel層の実装がありますが、処理が類似しているので今回は割愛させていただきます。個人的にはやはりアクションベースの方がスッキリしますね。JSFの場合、無理矢理感が伝わってきます。。。Webアプリの場合はURLを意識した設計の方が作りやすい気がします。(個人的な感想)

JavaEEでアクションベースのフレームワークを使いたい人に朗報!!
参照実装として採用されるライブラリがあるので、興味がある人は使ってみてください。

【Ozark】Reference Implementation for MVC 1.0.
https://ozark.java.net/  

 

来年には JavaEE8が発表予定です。その中に JavaEE標準のアクションベースの MVCフレームワークが搭載される模様です。Seasar2から JavaEEの移行を検討している方、JSFを採用せず、次期 MVCを待った方がいいかもしれません。または、JSFを使わずに、JAX-RS + JSフレームワーク(Angularjs)の組み合わせで作るのもありだと思います。

実業務で JavaEEを使っている私でさえも、本当に JavaEEでいいのだろうかと不安に思うことはあります。でも、まずはいろんなフレームワークに触れてみることが大事です。使ってみないと気づかないことが沢山あります。

一つの選定基準としては、情報量が多い方がいいです。(欲を言えば、日本語)何か新しいものを使うときは、必ずって言っていいほど躓きます。それは当たり前のことです。その後が重要で、いかに早く解決策を見いだせるかで、大きく生産性に関わってきます。その分、Seasar2は日本語の情報があって羨ましい。JavaEEはほとんど英語のような気がします。

これからに期待ですね!!

それでは、残り少ない素敵な Seasar2ライフを!

TOP
TOP