public interface BlogService {
public void save(Blog blog);
public List<Blog> findAll();
}
@Service("blogService")
public class BlogServiceImpl implements BlogService {
@Resource
private BlogDao blogDao;
@Resource
private TagDao tagDao;
public void save(Blog blog) {
blogDao.create(blog);
for (Tag tag : blog.getTags()) {
tag.setBlog(blog);
tagDao.create(tag);
}
}
public List<Blog> findAll() {
return blogDao.findAll();
}
}
最後、これらを呼び出すコードです。
Tag t1 = new Tag();
t1.setId(1);
t1.setName("NAME1");
Tag t2 = new Tag();
t2.setId(2);
t2.setName("NAME2");
Blog blog = new Blog();
blog.setContent("Test102");
Set<Tag> tags = new HashSet<Tag>();
tags.add(t1);
tags.add(t2);
blog.setTags(tags);
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
BlogService service = (BlogServiceImpl) context.getBean("blogService");
service.save(blog);
for (Blog b : service.findAll()) {
System.out.println(b);
}
・ただし、getCurrentSessionを使うと以下のエラー org.springframework.orm.hibernate4.HibernateSystemException : No Session found for current thread
これは以下のようにapplicationContext.xmlを変更して、TransactionManagerをアノテーションベースとし、サービスクラスのメソッド(save/findAll)に@Transactionalを付与することで解決できました。
・次なるエラー。。。 java.lang.ClassCastException: $Proxy19 cannot be cast to <クラス名>
ちなみに、mustacheを拡張したもので、Twitterからオープンソースとして提供されているhogan.jsというものがあります。これは、mustacheの記法で書いたテンプレートをAOT(Ahead Of Time)コンパイルして、JavaScriptに変換するというもので、レンダリングのたびにmustache記法のテンプレートを解析する必要がなく高速に動作するため、WebシステムでJSPなどのように利用できます。
最近、BaaS(Backend as a Service)っていう言葉をよく聞きます。これは、スマートデバイス(モバイル)アプリケーション向けに、サーバサイド実装の手間を省くため、データベースへの保存・参照、SNSとの連携、プッシュ通知、認証、ファイル保存などの機能を簡単に呼び出すことができるサービスです。(実際はモバイルのみが対象ではないものもあり、本当にモバイル特化の場合は、MBaaSという呼び方をする場合もあるそうです。)これらのサービスにはSDK(開発キット)が提供されておりAPIをコールするだけで呼び出すことができたり、RESTでアクセスする機能が提供されています。
var options = {
cert: 'cert.pem', /* Certificate file path */
certData: null, /* String or Buffer containing certificate data, if supplied uses this instead of cert file path */
key: 'key.pem', /* Key file path */
keyData: null, /* String or Buffer containing key data, as certData */
passphrase: null, /* A passphrase for the Key file */
ca: null, /* String or Buffer of CA data to use for the TLS connection */
gateway: 'gateway.push.apple.com',/* gateway address */
port: 2195, /* gateway port */
enhanced: true, /* enable enhanced format */
errorCallback: undefined, /* Callback when error occurs function(err,notification) */
cacheLength: 100 /* Number of notifications to cache for error purposes */
};
var apnsConnection = new apns.Connection(options);
cert, key には前節 App ID のところで取得した証明書を使う。
Development の Push SSL Certificate を使用する場合は、gateway の値を gateway.sandbox.push.apple.com に!
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = new Blog();
blog.setId(0);
blog.setContent("Test-Test");
mapper.insert(blog);
int count = mapper.countByExample(new BlogExample());
System.out.println(count);
session.close();
String resource ="mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sessionFactory.openSession();
// delete records
session.delete("deleteAllBlogs");
// insert records
session.insert("insertBlog", new Blog(0, "Test1"));
session.insert("insertBlog", new Blog(1, "Test2"));
// select records
Blog blog = (Blog) session.selectOne("selectBlog", 1);
System.out.println(blog);
for (Object v : session.selectList("selectAllBlogs")) {
System.out.println((Blog) v);
}
session.close();
別リンクのGoogle Cloud Messaging for Android(GCM)を試してみるで書かれているように、サーバプッシュ技術ということでNode.js+socket.ioあたりのことを書こうと思ってたんですが、ちょっと寄り道してNode.jsについて書いていこうと思います。node.jsすげぇー!(javascriptで全部書けるとか、v8が早いとか、スケールプログラムが書きやすいとか)の解説は他のサイトに譲るとして、ここでは簡単なプログラムを作っていろいろ試して行こうと思います。超簡単な以下のようなものをNode.jsでつくってみることで、アプリケーションに必要な各要素を実現してみます。
サーブレット作成 まずは、サーバサイドの仕組みを作るため、プロジェクト(Eclipse for JavaEEを使った場合は、Dynamic Web Project)を作成します。
AndroidをEclipseで開発するために、Android Development Tools(ADT)pluginをインストールして、Android SDK Managerで「Extras」⇒「Google Cloud Messaging for Android」を選択しGCMをダウンロードします。そのダウンロードしたディレクトリの中のgcm/gcm-server/dist/gcm-server.jarをプロジェクトにコピーします。(WEB-INF/libなどへ) ただ、このjarファイルだけですと、java.lang.ClassNotFoundExceptionが発生します。