Java 8のシンプルなwebdev

JavaでWeb開発を行うというアイデアを思いついた方法についてお話したいと思います。



そのため、この問題について熟成したらすぐに、選択した開発ツールに対応する短いリストを作成しました。



ひどくグーグルで、必要なものを見つけました: Sparkjade4jOrmLite



そのため、ツールが選択され、それぞれを個別に検討します。



Sparkフレームワーク



Java 8が動作する最新バージョンを選択しましたが、フレームワーク自体はSinatraにインスパイアされたものとして位置付けられています。



特に、すでにExpressで前向きな経験があったため、アイデアは近かった。 ドキュメントは質が悪いように見えますが、開発プロセス中にそれで十分であると確信しています。 また、開発には環境の予備設定、サーブレットコンテナのインストールなどが必要ないことも素晴らしいと思います。 必要なのは、pom.xmlに依存関係を追加し、2、3行を書くことだけです。すべてがうまくいきます。



Jade4j



Node.jsテンプレートエンジン、特にjadeで作業した場合は、おそらく再び使用することになるでしょう。 読みやすいコード、優れたドキュメント、多くの美しい機能、および以前の使用経験により、このテンプレートエンジンを選択しました。



layout.jadeの小さな例:



doctype html html head block headsection body header div#main block content footer
      
      





このようにして、他のファイルに{block blockname}要素を実装します。



 extends layout block headsection title , ! block content h1 Hello, habr!
      
      







オームライト



おそらく、一部のAndroid開発者はこのORMに精通しています。 使いやすく、軽量で、注釈を使用して構成できます。



以下に、Userクラスの簡単なpojoの例を示します。



 package com.vagga.pojo; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; @DatabaseTable(tableName = "users") public class User { @DatabaseField(columnName = "user_id", generatedId = true) private int userId; @DatabaseField(columnName = "username", unique = true, canBeNull = false) private String userName; @DatabaseField(columnName = "user_pass") private String password; public User() { } /* *  - */ }
      
      





データベースとの対話は、組み込みのORM Daoを介して実行できます。 私は自分の人生を単純化するために小さなシングルトンクラスを作成しました(以下のコードが少し気分を害するかもしれないので、もう一度予約します。主な目標は実装と使用の容易さでした)。



 package com.vagga.utils; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.dao.DaoManager; import com.j256.ormlite.jdbc.JdbcConnectionSource; import com.vagga.pojo.Category; import com.vagga.pojo.Comment; import com.vagga.pojo.Post; import com.vagga.pojo.User; import java.sql.SQLException; public class DbUtil { private static DbUtil ourInstance = new DbUtil(); private JdbcConnectionSource dbSource; private Dao<User, Integer> userDao; private Dao<Post, Integer> postDao; private Dao<Category, Integer> categoryDao; private Dao<Comment, Integer> commentDao; public static DbUtil getInstance() { return ourInstance; } private DbUtil() { try { dbSource = new JdbcConnectionSource("jdbc:mysql://localhost:3306/vagga?user=root&characterEncoding=utf8"); userDao = DaoManager.createDao(dbSource, User.class); postDao = DaoManager.createDao(dbSource, Post.class); categoryDao = DaoManager.createDao(dbSource, Category.class); commentDao = DaoManager.createDao(dbSource, Comment.class); } catch (SQLException e) { e.printStackTrace(); System.out.println("Cannot establish DB connection " + e.getMessage() + " " + e.getCause()); } } public Dao<User, Integer> getUserDao() { return userDao; } public Dao<Post, Integer> getPostDao() { return postDao; } public Dao<Category, Integer> getCategoryDao() { return categoryDao; } public Dao<Comment, Integer> getCommentDao() { return commentDao; } }
      
      





あなたを落ち込ませるかもしれないいくつかの解決策



コーディングプロセスを開始した後、何らかの方法で解決する必要があるいくつかの問題に出会いました。



一番の問題は、Sparkが箱から出してすぐにヒスイをサポートしなかったため、それをグーグルで検索し、友達にする方法を見つけなければなりませんでした。 問題の解決策は非常に簡単であることが判明しました。 TemplateEngineクラスから継承し、インターフェイスrenderメソッドを実装するだけです。



同じグーグルグループで、私はこの非常に機能するコードを見つけました:



 package com.vagga.utils; import de.neuland.jade4j.JadeConfiguration; import de.neuland.jade4j.exceptions.JadeException; import de.neuland.jade4j.model.JadeModel; import de.neuland.jade4j.template.FileTemplateLoader; import de.neuland.jade4j.template.JadeTemplate; import de.neuland.jade4j.template.TemplateLoader; import spark.ModelAndView; import spark.TemplateEngine; import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.util.Map; public class JadeEngine extends TemplateEngine { private JadeConfiguration configuration; private String directory = new File(".").getCanonicalPath(); public JadeEngine() throws IOException { this.configuration = new JadeConfiguration(); this.directory = this.directory + "/src/main/resources/templates/"; TemplateLoader loader = new FileTemplateLoader(directory, "UTF-8"); configuration.setTemplateLoader(loader); } @SuppressWarnings("unchecked") @Override public String render(ModelAndView modelAndView) { StringWriter stringWriter = new StringWriter(); try { JadeTemplate template = this.configuration.getTemplate(modelAndView.getViewName()); JadeModel jadeModel = new JadeModel((Map<String, Object>) modelAndView.getModel()); template.process(jadeModel, stringWriter); } catch (JadeException | IOException e) { e.getCause(); } return stringWriter.toString(); } }
      
      





次の問題は、リクエストのマッピングを異なるクラスに適切に分割する方法がわからなかったという事実によるものでした。 その結果、次の3つの方法でインターフェイスを作成することにしました。



 package com.vagga.routes; public interface BaseRoute { public void initBeforeAction(); public void initActions(); public void initAfterActions(); }
      
      





次に、ルートの基本クラスを作成し、テンプレートレンダリングヘルパーを初期化しました。



 package com.vagga.routes; import com.vagga.utils.JadeEngine; import com.vagga.utils.JsonTransformer; import java.io.IOException; public class Route { protected JadeEngine templateEngine; protected JsonTransformer jsonTransformer; protected Route() throws IOException { templateEngine = new JadeEngine(); jsonTransformer = new JsonTransformer(); } }
      
      





最終的なマッパークラスの実装は次のとおりです。



 package com.vagga.routes; import com.vagga.pojo.Category; import com.vagga.pojo.User; import com.vagga.utils.DbUtil; import spark.ModelAndView; import java.io.IOException; import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; import static spark.Spark.*; public class HomeRoute extends Route implements BaseRoute { public HomeRoute() throws IOException { super(); } @Override public void initBeforeAction() { } @Override public void initActions() { get("/", (req, res) -> { Map<String, Object> model = new HashMap<String, Object>(); try { List<Category> categories = DbUtil.getInstance().getCategoryDao().queryForAll(); User user = DbUtil.getInstance().getUserDao().queryForId(1); model.put("user", user); model.put("categories", categories); model.put("title", ""); } catch (SQLException e) { e.printStackTrace(); } return new ModelAndView(model, "home/index.jade"); }, this.templateEngine); } @Override public void initAfterActions() { } }
      
      





ここで、すべてのマッパークラスを何らかの方法でインスタンス化する必要があります。 私はより賢いものを思いついていないので、メインクラスでそれを正しく行います(誰かがこれをもっと良くする方法を提案してくれたら感謝します):



 public class VaggaMain { public static void main(String[] args) { try { ArrayList<BaseRoute> routes = new ArrayList<>(); routes.add(new HomeRoute()); routes.add(new AdminRoute()); routes.add(new ApiRoute()); routes.forEach((route) -> { route.initBeforeAction(); route.initActions(); route.initAfterActions(); }); } catch (IOException e) { e.printStackTrace(); } } }
      
      







まとめ



私が自分のために設定したすべての目標が実現しました。 ツールに満足しました。 遭遇する主な問題は、上記のツールに関するインターネット上の情報が極端に不足していることです。 一般的に、フレームワークはクールでシンプルで、あなたを喜ばせます。



ご清聴ありがとうございました! 建設的な批判は大歓迎です。



All Articles