WebServlet(name = "memberFormServlet", urlPatterns = "/servlet/members/newform")
public class MemberFormServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter w = response.getWriter();
w.write("<!DOCTYPE html>\n" +
"<html>\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <title>Title</title>\n" +
"</head>\n" +
"<body>\n" +
"<form action=\"/servlet/members/save\" method=\"post\">\n" +
" username: <input type=\"text\" name=\"username\" />\n" +
" age: <input type=\"text\" name=\"age\" />\n" +
" <button type=\"submit\">전송</button>\n" +
"</form>\n" +
"</body>\n" +
"</html>\n");
}
}
이전에 작성한 서블릿이다. 자바안에서 html을 냅다 작성한다고 생각하면 된다.
특별할게없지만 그렇기에 진짜 이게 맞나 생각이 들정도다.
위의 상황을 개선하고자 html안에서 필요한것들을 자바 코드로 조작하는 방법인거같다.
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// 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);
%>
<html>
<head>
<meta charset="UTF-8">
</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>
편하게 html을 작성하면서 필요한곳에 자바 코드를 넣고 필요한 데이터들은 위에서 import로 받아오는것을 볼 수 있다.
근데 보면 이거도 먼가 html같은곳에 자바 코드가 덕지덕지 들어가있는 느낌이다.
각각의 단점을 보완 하면서 장점만 가져오기위해 업무를 분단 하게된다.
@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);
}
}
회원을 조회하는 기능인데 서블릿에서 데이터전달과 뷰호출을 한다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/index.html">메인</a>
<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>
컨트롤러를 분리해서 jsp에서는 필요한부분에만 자바코드로 데이터를 삽입하게된다.
이런 방식으로 서로의 단점을 보안하지만 중복코드나 공통처리의 문제로 인해서 단점이 아직 많긴하다.
서블릿이 정말 웹 데이터 전달의 기초이며 지금의 SSR방식의 많은 기술들 (타임리프)같은것들이 jsp에서 시작됐겠구나 유추할 수있다. 지금은 잘 안쓰이는 기술이지만 웹통신의 이해를 위해서는 꼭 필요한거같다.