MemberSaveServlet.java
@WebServlet(name="memberSaveServlet", urlPatterns = "/servlet/members/save")
public class MemberSaveServlet extends HttpServlet {
private MemberRepository memberRepository=MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("MemberSaveServlet.service");
String username=request.getParameter("username");
int age=Integer.parseInt(request.getParameter("age"));
Member member=new Member(username,age);
memberRepository.save(member);
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter w=response.getWriter();
w.write("<html>\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
"</head>\n" +
"<body>\n" +
"성공\n" +
"<ul>\n" +
" <li>id="+member.getId()+"</li>\n" +
" <li>username="+member.getUsername()+"</li>\n" +
" <li>age="+member.getAge()+"</li>\n" +
"</ul>\n" +
"<a href=\"/index.html\">메인</a>\n" +
"</body>\n" +
"</html>");
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
선언 > 서버 내부에서 서블릿으로 변환됨<%@ page import="~~" %>
자바의 import 문<% ~~ %>
자바 코드를 입력<%= ~~ %>
자바 코드를 출력save.jsp
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<% //자바 코드를 넣는 부분
//이 표시가 없는 곳은 그냥 다 HttpResponse부분에 담김
//response.getWriter().write()
//request,response는 그냥 사용 가능(문법 상 지원됨)
MemberRepository memberRepository=MemberRepository.getInstance();
System.out.println("MemberSaveServlet.service");
String username=request.getParameter("username");
int age=Integer.parseInt(request.getParameter("age"));
Member member=new Member(username,age);
memberRepository.save(member);
%>
<html>
<head>
<title>Title</title>
</head>
<body>
성공
<ul>
<li>id=<%=member.getId()%></li>
<li>username=<%=member.getUsername()%></li>
<li>age=<%=member.getAge()%></li>
</ul>
<a href="/index.html">메인</a>
</body>
</html>
MVC 패턴의 등장
서블릿과 JSP의 한계
MvcMemberFormServlet.java
//컨트롤러
@WebServlet(name="mvcMemberFormServlet", urlPatterns = "/servlet-mvc/members/new-form")
public class MvcMemberFormServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// mvc패턴에서는 항상 컨트롤러를 거쳐서 뷰로 들어감(서버에서 내부적으로 호출), 제어권을 뷰로 넘겨줌
String viewPath="/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher=request.getRequestDispatcher(viewPath);
//getRequestDispatcher() > 컨트롤러에서 뷰로 이동해야 할 때 사용
dispatcher.forward(request,response);
//서블릿에서 jsp 호출
}
}
dispatcher.forward()
/WEB-INF
new-form.jsp
<body>
<!-- 상대경로 사용, [현재 URL이 속한 계층 경로 + /save] -->
<form action="save" method="post">
username: <input type="text" name="username" />
age: <input type="text" name="age" />
<button type="submit">전송</button>
</form>
</body>
MvcMemberSaveServlet.java
@WebServlet(name="mvcMemberSaveServlet",urlPatterns = "/servlet-mvc/members/save")
public class MvcMemberSaveServlet extends HttpServlet {
private MemberRepository memberRepository=MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//요청정보를 받고 실제 비지니스 로직 호출
String username=request.getParameter("username");
int age=Integer.parseInt(request.getParameter("age"));
Member member=new Member(username,age);
memberRepository.save(member);
//Model에 데이터를 보관
request.setAttribute("member",member);
//request의 내부 저장소에 저장
//뷰로 던짐
String viewPath="/WEB-INF/views/save-result.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
save-result.jsp
<ul>
<li>id=${member.id}</li>
<li>username=${member.username}</li>
<li>age=${member.age}</li>
</ul>
request.getAttribute()
members.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
...
<body>
<table>
<thead>
<th>id</th>
<th>username</th>
<th>age</th>
</thead>
<tbody>
<c:forEach var="item" items="${members}">
<tr>
<td>${item.id}</td>
<td>${item.username}</td>
<td>${item.age}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
<c:forEach>
를 사용해서 members 리스트에서 member를 순서대로 꺼내 item 변수에 담고, 출력하는 과정을 반복<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
을 선언해야 <c:forEach>
사용 가능참고
JSP는 성능과 기능면에서 다른 템플릿 엔진과의 경쟁에서 밀리면서, 점점 사장되어 가는 추세이다. 요즘에는 주로 스프링과 잘 통합되는 Thymeleaf를 사용한다.
이 문제를 해결하려면 컨트롤러 호출 전에 먼저 공통 기능을 처리해야 함
프론트 컨트롤러(Front Controller) 패턴을 도입하면 이런 문제를 깔끔하게 해결