Rails と Java Servlet + JSP によるWEBアプリ開発の比較

### Rails と Java Servlet + JSP によるWEBアプリ開発の比較

||Rails|Java Servlet + JSP|
|---|---|---|
|Model|XXX.rb|XXX.java|
|View|XXX.erb|XXX.jsp|
|Controller|XXXController.rb|XXXServlet.java|
|ルーティング|routes.rbで指定|XXXServlet.javaのアノテーションで指定|

### ルーティングの指定方法
#### Rails
routes.rbで指定

```ruby:routes.rb
Rails.application.routes.draw do
 get '/sample' => 'コントローラ名#アクション名' 
 post '/sample' => 'コントローラ名#アクション名' 
end 
```

#### Java Servlet + JSP
XXXServlet.javaのアノテーションに指定

```java:XXXSerblet.java
package src;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


@WebServlet("/sample")
public class XXXServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		RequestDispatcher dispatcher = request.getRequestDispatcher("遷移先のファイル");
		dispatcher.forward(request, response);
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");

		RequestDispatcher dispatcher = request.getRequestDispatcher("遷移先のファイル");
		dispatcher.forward(request, response);

	}

}
```

### Java Servlet + JSP によるWEBアプリ開発
例：ログイン・ログオフ機能

- ブラウザに`http://localhost:8080/SampleApp`に入力すると **INDEXページ** にアクセスできる
- **INDEXページ** の `to INDEX PAGE`リンクをクリックすると、**LOGINページ** に飛ぶ
- **LOGINページ** の名前欄に`任意の名前`を、パスワード欄に`1234`を入力の上`submit`ボタンをクリックすると、**MAINページ** に飛ぶ
- パスワード欄に`1234`以外の文字を入力して、`submit`ボタンをクリックしても **MAINページ** には飛ばない
- **MAINページ** の`to LOG OUT`リンクをクリックするとログアウトし、**LOGINページ**に戻る

INDEXページ
![スクリーンショット 2019-11-17 13.41.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199441/5cf6b59d-d868-b94b-45f6-f874cd7d1186.png)

LOGINページ
![スクリーンショット 2019-11-17 13.42.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199441/20b6ae63-002d-932c-98b1-8e13170afbbe.png)

MAINページ
![スクリーンショット 2019-11-17 13.42.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199441/50e907f5-3fdf-3f4f-80d9-f099f46e21dd.png)

#### 開発環境
|項目|値|備考|
|---|---|---|
|PC|MacBook Air||
|OS|MacOS Catalina||
|言語|Java|※JavaEEを利用|
|IDE|Eclipse|※Eclipse 2019_09を[《Pleiades All in One Eclipse ダウンロード》](https://mergedoc.osdn.jp/)からダウンロード|

#### コード例
ユーザー情報を保持するモデル

```java:User.java
package model;
import java.io.Serializable;

public class User implements Serializable {
	private String name;
	private String password;

	public User() {};

	public User(String name,String password){
		this.name = name;
		this.password = password;
	}

	public String getName() {
		return name;
	}

	public String getPassword() {
		return password;
	}
}
```

ログイン情報を処理するクラス

```java:LoginLogic.java
package model;

public class LoginLogic {
	public boolean execute(User user) {
		if(user.getPassword().equals("1234")){
			return true;
		}
		return false;
	}
}
```

ログインを処理するコントローラ

```java:Login.java
package src;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import model.LoginLogic;
import model.User;



@WebServlet("/Login")
public class Login extends HttpServlet {
	private static final long serialVersionUID = 1L;


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/login.jsp");
		dispatcher.forward(request, response);
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");

		String userName = request.getParameter("name");
		String password = request.getParameter("password");
		User user = new User(userName,password);
		LoginLogic loginLogic = new LoginLogic();

		boolean isLogin = loginLogic.execute(user);

		if(isLogin==true) {
			HttpSession session = request.getSession();
			session.setAttribute("loginUser",user);
			response.sendRedirect("/SampleApp/Main");
		} else {
			response.sendRedirect("/SampleApp/Login");
		}
	}
}
```

ログアウトを処理するコントローラ

```java:Logout.java
package src;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/Logout")
public class Logout extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		session.invalidate();
		response.sendRedirect("/SampleApp/Login");
	}
}
```

**INDEXページ** を表示するビュー

```jsp:index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>INDEX PAGE ｜ SAMPLE APP</title>
</head>
<body>
<h1>SAMPLE APP</h1>
<h2>INDEX PAGE</h2>
<a href="/SampleApp/Login">to LOGIN PAGE</a>
</body>
</html>
```

**LOGINページ** を表示するビュー

```jsp:login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>LOGIN FORM | SAMPLE APP</title>
</head>
<body>
<h1>SAMPLE APP</h1>
<h2>LOGIN FORM</h2>
<form action="/SampleApp/Login" method="post">
<p>Name:</p>
<input type="text" name="name">
<p>PassWord:</p>
<input type="password" name="password"><br>
<input type="submit" value="submit"><br>
<br>
</form>
<br>
<a href="/SampleApp/">to INDEX PAGE</a>
</body>
</html>
```

**MAINページ** を表示するビュー

```jsp:main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="model.User" %>
<%
User loginUser = (User)session.getAttribute("loginUser");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><%= loginUser.getName() %> | SAMPLE APP</title>
</head>
<body>
<h1>SAMPLE APP</h1>
<p>Hello,<%= loginUser.getName() %>!</p>
<h2>Articles posted by <%= loginUser.getName() %></h2>
<a href="/SampleApp/Logout">to LOG OUT</a>
</body>
</html>
```

### 参考資料
- [スッキリわかる サーブレット&JSP入門 (スッキリシリーズ)](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B-%E3%82%B5%E3%83%BC%E3%83%96%E3%83%AC%E3%83%83%E3%83%88-JSP%E5%85%A5%E9%96%80-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%9B%BD%E6%9C%AC/dp/4844335804)]
- [GitHub - tanakadaichi1989](https://github.com/tanakadaichi1989/SampleApp)