サーブレット、jsp、mvcモード


会員管理Webアプリケーション要件
要件-名前、年齢機能
機能要件-メンバーの保存、メンバー・リストの表示
会員リポジトリ
package hello.servlet.domain.member;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap, AtomicLong 사용 고려
 */
public class MemberRepository {
 private static Map<Long, Member> store = new HashMap<>(); //static 사용
 private static long sequence = 0L; //static 사용
 private static final MemberRepository instance = new MemberRepository();
 public static MemberRepository getInstance() {
 return instance;
 }
 private MemberRepository() {
 }
 public Member save(Member member) {
 member.setId(++sequence);
 store.put(member.getId(), member);
 return member;
 }
 public Member findById(Long id) {
 return store.get(id);
 }
会員を保存し、会員リストの照会を実現する
メンバーストレージテストコード
 @AfterEach
void afterEach() {
memberRepository.clearStore();
}
AfterEachのテストが完了するたびに
サーブレットを使用した会員管理Webアプリケーションの作成
MemberFormServlet

エラー、まだ/servlet/membles/saveがないため
MemberSaveServlet

フォームからgetParameterを取り出し、memberを作成して保存し、htmlで結果に応答します.
jspを使用した会員管理Webアプリケーションの作成
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
jspドキュメントの意味
メンバーストレージロジック
<%
// request, response 사용 가능
 MemberRepository memberRepository = MemberRepository.getInstance();
 System.out.println("save.jsp");
 String username = request.getParameter("username");
 int age = Integer.parseInt(request.getParameter("age"));
 Member member = new Member(username, age);
 System.out.println("member = " + member);
 memberRepository.save(member);
%>
<%>にはJavaロジックが含まれています.
境界-論理とビューが1つの空間にあります.
そこでMVCモードが現れ,ビジネスロジックは別の場所で処理され,jspは最大限の描画画面に集中する.
MVCモード-概要
MVCモードは、変更ライフサイクルが異なるため、UIのいくつかの変更やビジネスロジックの変更を維持することが困難である.
コントローラ:httpリクエスト検証パラメータを受信し、ビジネスロジックを実行
≪モデル|Model|oraolap≫:出力するデータをビューに配置する場所.
ビュー:モデル内のデータを使用してスクリーンの位置を描画する

mvcモード、サーバをコントローラ、jspをビュー、httpservletRequestオブジェクトをモデルとして使用
@WebServlet(name = "mvcMemberListServlet", urlPatterns = "/servlet-mvc/
members")
public class MvcMemberListServlet extends HttpServlet {
 private MemberRepository memberRepository = MemberRepository.getInstance();
 @Override
protected void service(HttpServletRequest request, HttpServletResponse
response)
 throws ServletException, IOException {
 System.out.println("MvcMemberListServlet.service");
 List<Member> members = memberRepository.findAll();
 request.setAttribute("members", members);
 String viewPath = "/WEB-INF/views/members.jsp";
 RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
 dispatcher.forward(request, response);
 }
}
Dispatcherは他のサーバまたはJSPに移動可能
Web-infのリソースは外部で呼び出されません->呼び出すには常にコントローラ内で転送する必要があります

mvcモードの限界
≪プリアンブル繰返し|Previound Repeat|emdw≫:ビューに移動するコードは常に競合を繰り返します.
viewpath繰返し-拡張子または他のビューに変更する場合は、すべてのコードを変更する必要があります.
まとめ-共通しにくい=>フロントエンドコントローラの誕生