본문 바로가기

비트교육센터[전문가반]

2021.03.12 수업 내용 정리

EL 표기법

<%= vo.getName()%>~> ${vo.name } 

※ EL(Expression Language)는 절대 자바 코드가 아니다!

${vo.name } 으로 썻을때 내부적으로 돌아가는 프로세스 설명

=>1) request 저장소에 vo라고 되어 있는 객체를 찾아보고,

    2) 있으면 name을 getName()으로 변환해서 

    3) 객체에 해당되는 값을 가져오는것!

반드시 클래스 내부에 get & set 메서드가 존재해야 가능한 표기법 이다.

 

 

1. 값 받아오기

[ _01Servlet.java ]

int iVal = 10;

long lVal = 10;

float fVal = 3.14f;

boolean bVal = true;

String sVal = "가나다라마바사";

 

request.setAttribute("iVal", iVal);

request.setAttribute("lVal", lVal);
request.setAttribute("fVal", fVal);
request.setAttribute("bVal", bVal);
request.setAttribute("sVal", sVal);

 

[ 01.jsp ]

${iVal } <br />

${lVal } <br />

${fVal } <br />
${bVal } <br />
${sVal } <br />

 

2. 객체 값 받아오기

[ _01Servlet.java ]

UserVo userVo = new UserVo();

userVo.setNo(10L);

userVo.setName("이갑성");

 

request.setAttribute("vo", userVo);

 

[ 01.jsp ]

${vo.name } <br />

${vo.name } <br />

 

3. 널 객체 받아오기

[ _01Servlet.java ]

Object obj = null;

request.setAttribute("obj", obj);

 

[ 01.jsp ]

${obj } <br>

 

==> 결과: 아무것도 출력되지 않는다.

 

4. Map을 사용해서 여러 값을 한 번에 넘기기

[ _01Servlet.java ]

MapM<String, Object> map = new HashMap<>();

map.put("ival", iVal);

map.put("fval", fval);

map.put("sval", sVal);

map.put("bval", bVal);

 

request.setAttribute("map", map);

 

[ 01.jsp ]

${map.ival } <br />

${map.fval } <br />

${map.sval } <br />

${map.bval } <br />

 

5. 산술 연산

${3*10+5 } <br />

${iVal*10+5 } <br />

 

6. 관계 연산

${ival == 10 } <br />

${iVal < 5 } <br />

${obj = null } <br />

${obj != null } <br />

// null로 비교하는 것 보다 empty를 활용하는게 더 좋은 방법!
${empty obj } <br />

${not empty obj} <br />

 

7. 논리 연산

${iVal == 10 && lVal < 10000 } <br />

${iVal < 5 || lVal - 10 == 0 } <br /> 

 

8. 요청 파라미터

uri 에 값이 들어있는 경우 (request.getParameter("a")로 표기했던 것을 EL 표기법은 어떻게 할까?)

${param.a } <br />

${param.a + 10 } <br />

${param.email } <br />

 

 

[참고!]

1. 객체가 오래 존속되는 순서

Application(Context) Scope > Session Scope > Request Scope > Page Scope

 

2. EL에서 이름을 찾는 순서

Page Scope -> Request Scope -> Session Scope -> Application(Context) Scope

 

Ex)

        // request scope

        UserVo vo1 = new UserVo();

        vo1.setNo(1L);

        vo1.setName("이갑성1");

       

        request.setAttribute("vo", vo1);

       

        // session scope

        UserVo vo2 = new UserVo();

        vo2.setNo(2L);

        vo2.setName("이갑성2");

       

        //세션을 구해서 세션에 값을 넣기

        request.getSession(true).setAttribute("vo", vo2);

       

        //현재 상황! 같은 vo 이름으로 객체 vo1 vo2 넣었다.

        request.getRequestDispatcher("/WEB-INF/views/02.jsp").forward(request, response);

 

[02.jsp] 에서 EL 표기법으로 값을 꺼내오면 결과는 어떻게 될까?

    <h1>Scope Test</h1>

    ${vo.no } <br />

    ${vo.name } <br />

==> request에 저장한 값이 나온다!

(같은 이름일때 찾는 순서가 세션보다 request가 더 우선순위가 높기 때문이다.)

 

 

JSTL 문법

* jstl문법을 쓰기전에 .jsp 페이지 상단에 taglib 추가해주어야한다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

 

1. if 조건문 (자바와 다르게 else if, else 가 없다.)

[형식]

<c: if test="조건문(el표기법)">

     .....

</c:if>

 

[EX]

<c:set var="row" value="${param.r }" .>

<c:set var="col" value="${param.c}" />

 

<c:if test="${empty row}">

    <c:set var="row" value="3" />

</c:if>

<c:if test="${empty col}">

    <c:set var="col" value="3"/ >

</c:if>

 

2. choose 조건문 (JSTL 조건문으로 많이 사용)

[형식]

<c:choose>

    <c:when test="조건문(el표기법)"> 

       ....

    </c:when>

    <c:otherwise> //위의 조건문에 해당 안되는 경우 (=else)

       ....

    </c:otherwise>

</c:choose>

 

[EX]

<c: choose>

    <c:when test="${'red' == param.c }">

       <h1 style="color:red">Hello JSTL</h1>

    </c:when>

    <c:when test="${'blue' == param.c }">

       <h1 style="color:blue">Hello JSTL</h1>

    </c:when>

    <c:otherwise>

       <h1>Hello JSTL</h1>

    </c:otherwise>

</c:choose>

 

3. 반복문 (foreach)

[형식] 

<c:forEach begin="시작값" end="마지막값" var="인덱스" step="증가값">

</c:forEach>

 

[EX]

<table border= "1">

    <c:forEach begin="0" end="${row-1}" var="i" step="1">

    <tr>

       <c:forEach begin="0" end="${col-1}" var="j" step="1">

           <td>cell(${i }, ${j })</td>

       </c:forEach>

    </tr>

    </c:forEach>

</table>

 

4. 함수

[ _03Servlet ] : UserVo 객체 list에 3개의 데이터를 넣고 request에 담아준다.

        List<UserVo> list = new ArrayList<>();

       

        UserVo vo1 = new UserVo();

        vo1.setNo(10L);

        vo1.setName("이갑성1");

        list.add(vo1);

       

        UserVo vo2 = new UserVo();

        vo2.setNo(20L);

        vo2.setName("이갑성2");

        list.add(vo2);

       

        UserVo vo3 = new UserVo();

        vo3.setNo(30L);

        vo3.setName("이갑성3");

        list.add(vo3);

       

        request.setAttribute("list", list);

        request.getRequestDispatcher("WEB-INF/views/03.jsp").forward(request, response);

 

[ 03.jsp ]

// list 객체의 길이를 구하는 함수

<strong>${fn:length(list) }</strong> <br />

 

// pageContext에 저장하기 (count 라는 이름에 list의 length 저장)

<c:set var="count" value="${fn:length(list)}">

 

// pageContext에 있는 list를 가져와 하나씩 뽑아서 vo 에 담아준다. | 반복의 상태값을 status에 저장한다.

<c:forEach items="${list }" var='vo' varStatus='status'>

     (${count-status.index }) -> [${status.index }: ${status.count }] [${vo.no } : ${vo.name }]

</c:forEach>

 

 

 

 

 

mysit02의 전체적인 프로세스

1. MainServlet 만들기

 

MainServlet에서 Cookie 를 만들어 관리한다.

 

int vistitCount = 0; // 방문횟수를 쿠키에 심는다.

1. 쿠키 읽기

1)

=> 쿠키는 request에 담아서 보내기때문에 request에서 가져온다.

Cookie[] cookies = request.getCookies(); 

 

2) request에 쿠키 여부 확인 

// 쿠키가 있는 경우( 만약, 쿠키가 없다면 cookies == null 이다.)

if(cookies != null && cookies.length > 0){

    for(Cookie cookie : cookies){

       if("visitCount".equals(cookie.getName())){

           visitCount = Integer.parseInt(cookie.getValue()); 

           // cookie.getValue() 의 리턴 타입은 String 이다.

        }

    }

}

 

2. 쿠키 쓰기

visitCount++; // MainServlet에 요청이 들어올때마다 visitCount 의 갯수를 늘려준다.

 

1) Cookie 객체 생성

Cookie cookie = new Cookie("visitCount", String.valueOf(visitCount));

// Cookie에 값을 넣을때 String 타입으로 넣는다.

 

2) 만든 cookie를 해당경로에 대한 하위경로에 쿠키 세팅

cookie.setPath(request.getContextPath());

 

* setPath() 설명

쿠키의 path 속성을 이용하면 웹서버의 특정 URL에 대해서만 쿠키를 전송할 수 있습니다. path 속성은 웹서버의 디렉터리 단위로 지정이 가능하며, 디렉터리를 지정하면 지정한 해당 디렉터와 그 하위 경로에만 쿠키가 전송됩니다. 디렉터리 단위라는것은 URL 경로상에 / (슬래쉬)로 구분되어지는 단위를 말합니다.

 

=> 위에서 request.getContextPath() 는 /mysite02 이다. /mysite02 의 하위 경로에는 쿠키를 심는다.

 

3) 쿠키 수명 설정

cookie.setMaxAge(24*60*60); //1day (하루있다가 쿠키 삭제)

 

4) 쿠키 쓰기

response.addCookie(cookie);

 

2. UserServlet 만들기

메인 페이지의 header 부분에 로그인, 회원가입, 회원정보수정, 로그아웃 을 구현 하고자하려면

==> UserServlet이 필요하다.

 

[ 회원가입 프로세스 ] 

 

[로그인 프로세스]

 

 

loginform에서 이메일과 비밀번호를 입력해서 DAO에 데이터를 보내 DB에서 조회한다.

 

UserVo authUser = new UserDao().findByEmailAndPassword(vo);

 

case1) 로그인에 실패한 경우

//request 저장소에 authResult 이름으로 fail 값을 저장하고 loginform 을 리다이렉트해준다.

 

if(authUser == null) {

    request.setAttribute("authResult", "fail");

    WebUtil.forword("/WEB-INF/views/user/loginform.jsp", request, response);

    return;

}

 

case2) 로그인에 성공한 경우

// 세션에 로그인 성공한 authUser 객체의 정보를 저장한다.

 

1. 톰켓의 Session Manager에게 sessionid에 맵핑된 세션객체 return

(매개변수 true: 없으면 새로 만들어줘!, false: 없으면 null로 반환해줘!)

==> 세션 하나를 만들어서 session 객체로 반환

 

HttpSession session = request.getSession(true);

 

2.  세션에 authUser 객체를 저장

session.setAttribute("authUser", authUser); //authUser 이름으로 authUser 객체를 담는다.

 

 

* 세션 내부 구조

[로그아웃 프로세스]

1. 세션을 가져온다.

HttpSession session = request.getSession();

if(session == null){ //세션이 없는 경우

     WebUtil.redirect(request.getContextPath(), request, response);

     return;

}

 

2. 세션에서 authUser 이름의 객체를 찾아본다.

UserVo authUser = (UserVo) session.getAttribute("authUser");

if(authUser == null){

     WebUtil.redirect(request.getContextPath(), request, response);

     return;

}

 

3. 세션 안에 있는 authUser 객체를 삭제한다. ==> 로그아웃 처리

if(session != null && session.getAttribute("authUser") != null){

     session.removeAttribute("authUser");

     session.invalidate();

}

 

 

[회원 정보 수정 프로세스]

 

1. 세션 객체 가져오기

HttpSession session = request.getSession();

if(session == null){

    WebUtil.redirect(request.getContextPath(), request, response);
    return;

}

 

2. 세션에서 authUser 객체 가져오기

UserVo authUser = (UserVo) session.getAttribute("authUser");

if(authUser == null) {

    WebUtil.redirect(request.getContextPath(), request, response);

     return;

}

 

3. updateform.jsp 에서 입력한 수정 데이터 값 가져오기 => UserDAO 에 보내서 DB 업데이트 하기

 

 

[참고사항]

 

* 객체를 저장할때: request와 Session 에 저장이 가능하다.

* Session 이란 같은 JSessionID 값의 처리를 말한다.

 

 

 

 

 

Filter 처리

public class EncodingFilter implements Filter {

public void init(FilterConfig fConfig) throws ServletException {

}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// request 처리
request.setCharacterEncoding("utf-8");

chain.doFilter(request, response);

// response 처리
}

public void destroy() {
// TODO Auto-generated method stub
}
}