サーブレット、jsp、mvcモード
会員管理Webアプリケーション要件
要件-名前、年齢機能
機能要件-メンバーの保存、メンバー・リストの表示
会員リポジトリ
メンバーストレージテストコード
サーブレットを使用した会員管理Webアプリケーションの作成
MemberFormServlet
エラー、まだ/servlet/membles/saveがないため
MemberSaveServlet
フォームからgetParameterを取り出し、memberを作成して保存し、htmlで結果に応答します.
jspを使用した会員管理Webアプリケーションの作成
メンバーストレージロジック
境界-論理とビューが1つの空間にあります.
そこでMVCモードが現れ,ビジネスロジックは別の場所で処理され,jspは最大限の描画画面に集中する.
MVCモード-概要
MVCモードは、変更ライフサイクルが異なるため、UIのいくつかの変更やビジネスロジックの変更を維持することが困難である.
コントローラ:httpリクエスト検証パラメータを受信し、ビジネスロジックを実行
≪モデル|Model|oraolap≫:出力するデータをビューに配置する場所.
ビュー:モデル内のデータを使用してスクリーンの位置を描画する
mvcモード、サーバをコントローラ、jspをビュー、httpservletRequestオブジェクトをモデルとして使用
Web-infのリソースは外部で呼び出されません->呼び出すには常にコントローラ内で転送する必要があります
mvcモードの限界
≪プリアンブル繰返し|Previound Repeat|emdw≫:ビューに移動するコードは常に競合を繰り返します.
viewpath繰返し-拡張子または他のビューに変更する場合は、すべてのコードを変更する必要があります.
まとめ-共通しにくい=>フロントエンドコントローラの誕生
要件-名前、年齢機能
機能要件-メンバーの保存、メンバー・リストの表示
会員リポジトリ
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繰返し-拡張子または他のビューに変更する場合は、すべてのコードを変更する必要があります.
まとめ-共通しにくい=>フロントエンドコントローラの誕生
Reference
この問題について(サーブレット、jsp、mvcモード), 我々は、より多くの情報をここで見つけました https://velog.io/@thwn40/서블릿jspmvc패턴テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol