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
}
}
'비트교육센터[전문가반]' 카테고리의 다른 글
JavaScript 복습02 (0) | 2021.03.23 |
---|---|
JavaScript 복습01 (0) | 2021.03.22 |
2021.03.11 수업 내용 정리 (0) | 2021.03.11 |
이클립스 Git 연동, Commut&Push, Pull 하는 방법 (0) | 2021.03.08 |
선형자료구조 _ 연결리스트(단일, 이중, 환형) (0) | 2021.02.16 |