2020.06.04
ServerSide의 전체적인 flow구조
1) Attribute: HttpSession밖에는 못쓰기 때문에, 다른 부분을 먼저 배운 뒤에 session을 봅니다.
2) 페이지 이동 방법: 두가지가 있습니다. 이 두가지를 상황에 따라서 구분해서 사용해야합니다. 페이지 이동방법과 Attribute와 관련이 되어 있습니다. 이 두가지를 잘 연결해서 써야합니다. 이를 잘 못쓰면 불필요한 메모리 혹은 자원을 써야합니다.
3) Controller에 대한 역할을 확실하게 알아야합니다.
서블릿은 객체 생성을 개발자가 할 수 없습니다. 그렇기 때문에 다른 서블릿에 객체 생성을해서 set을 통한 주입 등의 hasing이 안됩니다. 객체 생성의 주체가 개발자가 아니기 때문에 attribute와 같은 객체에 내가 전달하고자 하는 객체를 담아서 보냅니다. 이중에서 가장 global한 attribute가 ServletContext입니다.
A에서 B로 객체를 보낼때 ServletContext 객체를 이용합니다.
SevletContext는 DD를 읽자마자 만드는 객체 입니다. servlet간에 comunication하는데 써야 하기 때문에 그 어느 객체보다도 가장 먼저 생기게 됩니다. was가 이걸 제일 먼저 만듭니다. 서버가 살아있는한 계속적으로 남아있는 객체 입니다. 서블릿 하나마다 있는게 servletConfig이빈다. 글로벌한 초기화는 servletContext입니다. servletContext는 web.xml처럼 context path마다 하나씩 있습니다. 여러 VO도 한꺼번에 servletContext에 담깁니다.
Attribute에 binding하고 다른 컨포넌트에서 lookup합니다.
data binding
data lookup
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2 align="center">Register Member Form</h2>
<form action="Register" method="post">
이 름<input type="text" name="name"><br>
나 이<input type="text" name="age"><br>
주 소<input type="text" name="addr"><br>
<input type="submit" value="회원가입">
</form>
</body>
</html>
package servlet.controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import servlet.model.MemberVO;
public class RegisterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private ServletContext context;
public RegisterServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 1)양방향한글치리
* 2)폼값 받습니다.
* 3) vo객체 생성
* 4) DAO리턴받습니다.(받았다고 가정합니다.)
* 5) 비지니스 로직 호출합니다.(호출 했다고 가정합니다.
* 6) 객체 바인딩...ServletContext
* 7) 페이지 이동 (a tag)
*/
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out= response.getWriter();
String name = request.getParameter("name");
int age = Integer.parseInt(request.getParameter("age"));
String addr = request.getParameter("addr");
MemberVO vo =new MemberVO(name, age, addr);
context=getServletContext();
context.setAttribute("vo", vo);
out.println("<a href='ViewServlet'>ViewServlet결과 확인 하러 가기</a>");
out.close();
}
}
package servlet.model;
public class MemberVO {
private String name;
private int age;
private String addr;
public MemberVO() {
}
public MemberVO(String name, int age, String addr) {
super();
this.name = name;
this.age = age;
this.addr = addr;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "MemberVO [name=" + name + ", age=" + age + ", addr=" + addr + "]";
}
}
package servlet.controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import servlet.model.MemberVO;
public class ViewServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private ServletContext context;
public ViewServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
/*
* 1. Attribute에 바인딩된 data를 받아서
* 2. 웹브라우저로 출력하는 조직을 작성
*/
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out= response.getWriter();
context = getServletContext();
MemberVO vo=(MemberVO)context.getAttribute("vo");
out.println("<h2>회원님의 정보를 출력합니다.....</h2><br>");
out.println("<li>당신의 이름은 :"+vo.getName()+"</li>");
out.println("<li>당신의 나이는 :"+vo.getAge()+"</li>");
out.println("<li>당신의 주소는:"+vo.getAddr()+"</li>");
out.close();
}
}
이제 view 부분을 jsp로 바꿔줍니다.
package servlet.controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import servlet.model.MemberVO;
public class RegisterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private ServletContext context;
public RegisterServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 1)양방향한글치리
* 2)폼값 받습니다.
* 3) vo객체 생성
* 4) DAO리턴받습니다.(받았다고 가정합니다.)
* 5) 비지니스 로직 호출합니다.(호출 했다고 가정합니다.
* 6) 객체 바인딩...ServletContext
* 7) 페이지 이동 (a tag)
*/
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out= response.getWriter();
String name = request.getParameter("name");
int age = Integer.parseInt(request.getParameter("age"));
String addr = request.getParameter("addr");
MemberVO vo =new MemberVO(name, age, addr);
context=getServletContext();
context.setAttribute("vo", vo);
//out.println("<a href='ViewServlet'>ViewServlet결과 확인 하러 가기</a>");
out.println("<a href='Result.jsp'>결과 확인 하러 가기</a>");
out.close();
}
}
<%--
JSP Element
1) 지시어 %@ %:container에게 알려줄 내용을 지정
2) 스클릿틀릿 % %: 자바 코드는 이안에 지정
3) 출려문 %= %: 출려하려는 내용을 지정
--%>
<%@page import="servlet.model.MemberVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
/*% %: Scriptlet Element:: 자바코드는 다 이안에 집어 넣는다.
jsp에서 application은 servlet의 servletContext와 같습니다.*/
MemberVO vo =(MemberVO)application.getAttribute("vo");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>회원님의 정보를 출력합니다.....</h2><br>
<!-- %= %::출력문 Expression Element -->
<li>당신의 이름은 :<%=vo.getName()%></li>
<li>당신의 나이는 :<%=vo.getAge()%></li>
<li>당신의 주소는:<%=vo.getAddr()%></li>
</body>
</html>
소스보기로 안보여지는 주석<%-- --%>
소스보기로 보여지는 주석<!-- -->
Filter
package servlet.controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import servlet.model.MemberVO;
public class RegisterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private ServletContext context;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/* request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");*/
PrintWriter out= response.getWriter();
String name = request.getParameter("name");
int age = Integer.parseInt(request.getParameter("age"));
String addr = request.getParameter("addr");
MemberVO vo =new MemberVO(name, age, addr);
context=getServletContext();
context.setAttribute("vo", vo);
out.println("<a href='ViewServlet'>ViewServlet결과 확인 하러 가기</a>");
//out.println("<a href='Result.jsp'>결과 확인 하러 가기</a>");
out.close();
}
}
package servlet.controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import servlet.model.MemberVO;
public class ViewServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private ServletContext context;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");*/
PrintWriter out= response.getWriter();
context = getServletContext();
MemberVO vo=(MemberVO)context.getAttribute("vo");
out.println("<h2>회원님의 정보를 출력합니다.....</h2><br>");
out.println("<li>당신의 이름은 :"+vo.getName()+"</li>");
out.println("<li>당신의 나이는 :"+vo.getAge()+"</li>");
out.println("<li>당신의 주소는:"+vo.getAddr()+"</li>");
out.close();
}
}
- RegisterServlet과 ViewServlet 둘다에 한글화 작업을 안해주게 되면 한글이 깨집니다. sevlet간에 정보를 communication할 때 계속 누적해서 정보가 가고 이때 계속 해서 한글처리를 해줘야 합니다. 한글화 작업뿐아니라 다른것에도 다 적용되는 얘기입니다. 이를 해결하기 위해서는 어떻게 해야할까요?
filter라는 개념이 도입됩니다.
클라이언트의 요청을 최전방에서 받는 servlet이 있고 이 servlet이 다른 servlet에 계속 요청을 전달한다. 이를 해결하기 위해서 제일 앞단에 클라이언트와 servlet간에 요청과 응답을 걸러주는 filter 역할을 하는 class를 만듭니다. chaining 기법으로 연결해주게 됩니다. 이렇게 되면 다른 컨포넌트에서 똑같은 작업을 해줄 필요가 없게 됩니다. 이것을 template처럼 만들어서 계속 써줍니다.
package servlet.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class EncodingFilter implements Filter{
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//한글처리....
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//사전 작업(한글처리)의 내용이 서버상의 다음번 컴포넌트에게 계속 적용되기 위한 작업....
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>servlet.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<display-name>web06_Attribute</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<description></description>
<display-name>RegisterServlet</display-name>
<servlet-name>RegisterServlet</servlet-name>
<servlet-class>servlet.controller.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegisterServlet</servlet-name>
<url-pattern>/Register</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>ViewServlet</display-name>
<servlet-name>ViewServlet</servlet-name>
<servlet-class>servlet.controller.ViewServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ViewServlet</servlet-name>
<url-pattern>/ViewServlet</url-pattern>
</servlet-mapping>
</web-app>
위와 같이 해주면, 한글이 깨지는 것 없이 다 한글화가 되는 것을 알 수 있습니다.
ServletContext에 list로 저장하기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
/*
* 나이를 문자로 입력 했을 때 숫자로 입력하는 메세지를 띄우고 return false 시킨다.
*/
function() {
var f = documnet.frm
if(isNaN(f.age.value)){
alert("나이는 숫자입력바랍니다.");
return false;
}
}
</script>
</head>
<body>
<h2 align="center">Register Cafe Member Form</h2>
<form name="frm" action="EntranceServlet" method="post"
onsubmit="return checkData()">
이 름<input type="text" name="name" required="required"><br>
나 이<input type="text" name="age" required="required"><br>
주 소<input type="text" name="addr" required="required"><br>
<input type="submit" value="회원가입">
</form>
</body>
</html>
package servlet.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import servlet.model.MemberVO;
/*
* 회원가입하면 정보를 바탕으로
* MemberVO를 생성 ArrayList에 추가
* 회원가입을 5명이면, MemberVO 5개
* ArrayList를 통째로 ServletContext에 바인딩
*/
public class EntranceServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
List<MemberVO> list=Collections.synchronizedList(new ArrayList<MemberVO>());//동기화처리 해줍니다.
private ServletContext context;
@Override
public void init() throws ServletException {
context = getServletContext();
System.out.println("ServletContext의 주소:"+context);
context.setAttribute("list", list);
System.out.println("ServletContext에 카페 입장명단을 저장할 List를 미리 바인딩 합니다.");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
int age = Integer.parseInt(request.getParameter("age"));
String addr = request.getParameter("addr");
System.out.println("1. 폼값을 받아 옵니다. ");
MemberVO vo =new MemberVO(name, age, addr);
System.out.println("2. MemberVO생성");
list.add(vo);
System.out.println("3. MemberVO를 List에 저장");//ServletContext에 바인딩 된 List에 VO가 저장
out.println(name+"님이 카페에 입장하셨습니다. ");
System.out.println(name+"님이 카페에 입장하셨습니다.");
out.println("<a href=viewMember.jsp?name="+name+">viewMember.jsp페이지로 이동합니다.</a>");
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<b><%= request.getParameter("name") %>님이 방금전 회원 가입 하신 분입니다.</b>
</body>
</html>
출력을 list로 해봅니다.
<%@page import="servlet.model.MemberVO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<b><%= request.getParameter("name") %>님이 방금전 회원 가입 하신 분입니다.</b><p>
<hr>
<h2>전체 카페 명단 리스트</h2>
<table border="2px">
<%
List<MemberVO> list = (List<MemberVO>)application.getAttribute("list");
for(int i=0; i<list.size();i++){
%>
<tr>
<td><%= i+1 %></td>
<td><%= list.get(i).getName() %></td>
<td><%= list.get(i).getAge() %></td>
<td><%= list.get(i).getAddr() %></td>
</tr>
<%
}
%>
</table>
</body>
</html>
Attribute
:서버상에서 data(객체)를 보관하는 저장소
: ServletRequest, HttpSession, ServletContext-> data가 보관되는 scope(유통기한의 개념?)가 다릅니다.
- Scope: ServletContext(모든애들이 공유할 수 있는 정보를 저장해야합니다. 서버 끄기 전까지는 계속 남아 있음>HttpSession(로그인이진행되는동안까지저장합니다. 로그아웃되면 사라집니다.)>ServletRequest(응답하기 전까지는 남아있습니다. 응답하면 사라집니다. )
set of Method
1) 보관: setAttribute(key(string), value(object))==Binding
2) 꺼낼때: getAttribute(key)==Lookup
- 동일한 메소드가 서로다른 객체에 있을 때는 기능은 똑같다.(이름은 똑같기 때문에)하지만, 서로 다른 객체 존재 한다는 것은 차이가 있습니다.
ServletRequest
container: 메모리
1. 만드는 시기: servletRequest(요청하면 만들어짐), HttpSession(요청하면 만들어짐), ServletContext(서버 가동되면 만들어짐)
- 요청에 응답하면 사라지므로 잘 사용해야합니다.
Page이동방법과 ServletRequest를 Attribute로 사용하기.
1) Forwarding: 응답하지 않고 서버상에서 다른 서블릿으로 다이렉트로 요청으로 가지고 갑니다. 페이지 이동중에 이 방법이 forwarding입니다. 그렇기 때문에 servletRequest에 data(객체를)를 넣어서 가는 게 좋습니다. 왜냐하면 응답을 하지 않기 때문에 다음 서블렛이 응답하기 전까지 살아 있기 때문입니다.
이동하고자 하는 페이지를 아래에 연결합니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
/*
* 나이를 문자로 입력 했을 때 숫자로 입력하는 메세지를 띄우고 return false 시킨다.
*/
function() {
var f = documnet.frm
if(isNaN(f.age.value)){
alert("나이는 숫자입력바랍니다.");
return false;
}
}
</script>
</head>
<body>
<h2 align="center">Register Cafe Member Form</h2>
<form name="frm" action="EntranceServlet" method="post"
onsubmit="return checkData()">
이 름<input type="text" name="name" required="required"><br>
나 이<input type="text" name="age" required="required"><br>
주 소<input type="text" name="addr" required="required"><br>
<input type="submit" value="회원가입">
</form>
</body>
</html>
package servlet.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import servlet.model.MemberVO;
/*
* 회원가입하면 정보를 바탕으로
* MemberVO를 생성 ArrayList에 추가
* 회원가입을 5명이면, MemberVO 5개
* ArrayList를 통째로 ServletContext에 바인딩
*/
public class EntranceServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
List<MemberVO> list=Collections.synchronizedList(new ArrayList<MemberVO>());//동기화처리 해줍니다.
private ServletContext context;
@Override
public void init() throws ServletException {
/* context = getServletContext();
System.out.println("ServletContext의 주소:"+context);
context.setAttribute("list", list);
System.out.println("ServletContext에 카페 입장명단을 저장할 List를 미리 바인딩 합니다.");*/
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
request.setAttribute("list",list);
String name = request.getParameter("name");
int age = Integer.parseInt(request.getParameter("age"));
String addr = request.getParameter("addr");
System.out.println("1. 폼값을 받아 옵니다. ");
MemberVO vo =new MemberVO(name, age, addr);
System.out.println("2. MemberVO생성");
list.add(vo);
System.out.println("3. MemberVO를 List에 저장");//ServletContext에 바인딩 된 List에 VO가 저장
out.println(name+"님이 카페에 입장하셨습니다. ");
System.out.println(name+"님이 카페에 입장하셨습니다.");
//out.println("<a href=viewMember.jsp?name="+name+">viewMember.jsp페이지로 이동합니다.</a>");
//네이베이션
RequestDispatcher rdp=request.getRequestDispatcher("viewMember.jsp");
rdp.forward(request, response);
out.println("페이지 이동 시켰습니다. forward");
}
}
<%@page import="servlet.model.MemberVO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<b><%= request.getParameter("name") %>님이 방금전 회원 가입 하신 분입니다.</b><p>
<!-- request에 똑같은걸 가져왔기 때문에 getParameter로 받을 수 있습니다. -->
<hr>
<h2>전체 카페 명단 리스트</h2>
<table border="2px">
<tr>
<td>회원번호</td>
<td>이름</td>
<td>나이</td>
<td>주소</td>
</tr>
<%
//List<MemberVO> list = (List<MemberVO>)application.getAttribute("list");
List<MemberVO> list = (List<MemberVO>)request.getAttribute("list");
for(int i=0; i<list.size();i++){
%>
<tr>
<td><%= i+1 %></td>
<td><%= list.get(i).getName() %></td>
<td><%= list.get(i).getAge() %></td>
<td><%= list.get(i).getAddr() %></td>
</tr>
<%
}
%>
</table>
</body>
</html>
out.println("페이지 이동 시켰습니다. forward");
이걸 썼는데, 안나온다. 왜냐하면 forwarding하면 제어권이 다시 안돌아 오기 때문입니다.
2) Redirecting
정리:
1. 서버상의 DD를 읽고 서블릭 컨텍스트가 만들어 진다.
2. DD에 맵핑되어져 있는 서블릿을 만든다.
서블릿이 생성된 직후에 만들어지는 객체가 서블릿 컨피그이다. (레디온 상태)
3. 클라이언트가 요청을 하면 서블릿퀘스트, 서블릿리스폰스가 알아서 만들어 진다. 이때 컨트롤러 역할을 하고 있는 서블릿이 아래와 같은 순서로 합니다.
4. controller
1) form값을 받아 옵니다.
2) VO객체 생성
3) DAO 리턴
4) BusinessLogic 호출
5) 바인딩(ex:ServletRequest 또는 ServletContext)
6) 네비게이션-> jsp로 directly하게 이동-> jsp에서는 request랑 response를 마음껏 씁니다. 다만 응답의 명의는 controller 입니다.
-> controller(servlet)+Model(vo, dao)+view(jsp)
MVC-> Front Controller-> factory method pattern