웹 서버 페이지
- Servlet, JSP는 웹 서버 페이지이다. (톰캣과 같은 웹 어플리케이션 서버(WAS) 필요함)
- 웹 페이지는 url로 접근 -- 각 페이지는 접근할 수 있는 url을 가져야 함.
- JSP는 webapp 폴더가 /가 됨.
webapp/member/a.jsp -----> /member/a.jsp
웹 페이지 url ---- http://서버ip:port/프로젝트명/member/a.jsp
- Servlet은 @WebServlet(" ")에서 지정한 url로 접근
--- ( ) 안에 있는 경로는 마음대로 작성해도 되지만 중복이 되면 안됨.
@WebServlet("/test/Login") -----> /test/Login
웹 페이지 url ---- http://서버ip:port/프로젝트명/test/Login
(1) get 방식 요청
<a href = "/프로젝트명/test/Login"></a>
location.href = "/프로젝트명/test/Login";
<form action="/프로젝트명/test/Login" method = "get"></form>
response.sendRedirect("/프로젝트명/test/Login");
=> Login Servlet의 doGet() 호출
(2) post 방식 요청
<form action="/프로젝트명/test/Login" method = "post"></form>
=> Login Servlet의 doPost() 호출
1. controller (Servlet)
: 요청을 받아서 처리. -- 처리를 하려면 사용자가 요구한 기능을 수행하고 -> 결과 뷰페이지를 줘야함.
Servlet - doGet()
(request 요구) -- 이전 페이지
|
service 객체를 생성해서 원하는 기능을 실행. -- 기능이 구현된 service 객체 필요
|
기능수행 완료 후 결과 뷰 페이지 생성해서 응답으로 보냄.
|
(response 응답)
:
jsp 페이지 -- 폼 입력 후 폼파라메터와 함께 submit (request)
:
Servlet - doPost()
|
전송된 값을 읽어 변수에 담음. => String 변수명 = request.getParameter("파라메터이름");
| => int 변수명 = Integer.parseInt(request.getParameter("파라메터이름"));
service 객체를 생성해서 원하는 기능을 실행. -- 기능이 구현된 service 객체 필요
|
처리 결과를 request에 담아 뷰페이지에 전달 => request.setAttribute("뷰페이지에서 부를 이름", 전달할 값);
- Servlet에서 페이지 이동을 하고 싶으면 forward 방식과 redirect 방식이 있음.
(1) forward 방식
RequestDispatcher 변수명 = request.getRequestDispatcher("이동할 페이지 경로");
변수명.forward(request, response);
-- 서버 내에서 사용하던 request, response객체를 가지고 페이지 이동
-- 새로고침해도 똑같은 양식으로 남아있어서 같은 동작을 반복함. (중복 회원가입, 중복 계좌이체 같은 느낌)
(2) redirect 방식
response.sendRedirect("돌아갈 페이지 경로");
-- 클라이언트에게 페이지를 새로 요청하도록 시킴.
-- 이전에 저장한 데이터 모두 없어짐.
※ Servlet에 뷰페이지 만드는 방법
PrintWriter pw = response.getWriter(); //응답페이지에 출력할 출력 스트림 생성
pw.append("<html><body><h1>"); //html 문서에 써주기
pw.append("회원가입 완료<br/>");
pw.append("id: " + id + "<br/>");
pw.append("pwd: " + pwd + "<br/>");
pw.append("email: " + email + "<br/>");
pw.append("</h1></body></html>");
※ 한글 안 깨지게 하기
request.setCharacterEncoding("EUC-KR");
response.setCharacterEncoding("EUC-KR");
response.setContentType("text/html; charset=EUC-KR");
-- jsp와 server.xml의 문자코드와 통일해주기.
"UTF-8" 나 "EUC-KR"로 통일해야 함.
※ 요청 파라메터 관련 메서드
String getParameter(String name)
-- 한 개의 파라메터를 이름으로 검색하여 반환
Map<String, String[]> getParameterMap()
-- request 객체에 저장된 파라메터 모두를 검색하여 맵으로 반환
Enumeration<String> getParamenterNames()
-- request 객체에 저장된 모든 파라메터의 이름을 검색하여 Enumeration으로 반환
String[] getParameterValues(String name)
-- 체크박스처럼 한 파라메터의 값이 여러 개인 파라메터의 값을 읽어서 String[]으로 반환
※ 헤더 정보 검색
getHeader(String name)
-- 헤더 정보를 이름으로 검색하여 반환
getHeaderNames()
-- 헤더 정보 전체 이름을 검색하여 반환
getHeaders(String name)
-- 헤더 정보 전체를 검색하여 반환
2. view page(JSP)
: html, css, javascript, java 사용 가능 (요즘 추세는 java는 안쓰고 el, jstl 씀)
- Servlet(java)에서 쓴 코드를 웹뷰 언어로 인식하게 함. 뷰 페이지 만들어줌.
- /src/main/webapp/WED-INF/lib 에 ojdbc.jar 파일을 넣어야 가능. (tomcat@9 는 ojdbc6.jar 넣어주기)
(1) EL
${자바변수명 }
${자바변수명.멤버변수명 }
- Servlet 에서 request로 담은 값을 JSP에서 쓸 수 있음.
- 값이 있으면 출력, 없으면 출력 안함. error 안남.
- 멤버변수이름을 보면 자동으로 getter 호출함. (id -> getId())
-- VO에 setter getter 추가해야 자동 호출 가능
${pageContext.request.contextPath}
-- 현재 페이지의 기본경로 -- /프로젝트명
${pageContext.request.method}
-- 전송방식 값을 갖는 속성 (GET, POST)
※ 폼파라메터를 링크로 전달 (get방식)
"url경로 ? 파라메터이름 = 값 & 파라메터이름 = 값 & .. "
-- ?name=aaa&tel=111&age=20
<input type="button" value="내정보수정"
onclick="location.href='/webApp2/Editmyinfo?id=${m.id }'"><br/>
<a href="/webApp2/Delmyinfo?id=${m.id }"
onclick="javascript:alert('탈퇴하셨습니다.')">탈퇴</a><br/>
(2) JSTL
- 기본 로직을 태그로 정의한 라이브러리
- /src/main/webapp/WED-INF/lib 에 jstl.jar 파일을 넣어야 가능. (ojdbc.jar 와 같은 폴더)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
- jsp에서 자바코드 역할을 하는 라이브러리를 쓸 수 있게 해줌. (최상단에 코드 붙여넣기)
<c:forEach var="변수명" items="${배열 or 리스트 }"></c:forEach>
- for문 기능 구현
- 자동으로 배열/리스트 길이만큼 루프 돌며 "변수명"에 값을 넣어줌.
◆ forEach 예시
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <!-- page: jsp 설정 지시자 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="1">
<tr><th>제품번호</th><th>제품명</th><th>가격</th><th>수량</th></tr>
<c:forEach var="vo" items="${list }">
<tr><td>${vo.num}</td><td>${vo.name}</td><td>${vo.price}</td><td>${vo.amount}</td>
</c:forEach>
</table>
</form>
</body>
</html>
- 자바 코드 버전
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <!-- page: jsp 설정 지시자 -->
<%@ page import="java.util.ArrayList, product.ProductVo" %> <!-- array import -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="1">
<tr><th>제품번호</th><th>제품명</th><th>가격</th><th>수량</th></tr>
<%
ArrayList<ProductVo> list = (ArrayList<ProductVo>)request.getAttribute("list");
for(int i=0; i<list.size();i++){
ProductVo vo = list.get(i); //ArrayList에서 ProductVo 객체 하나씩 꺼내서
out.print("<tr>");
out.print("<td>" + vo.getNum() + "</td>"); // 번호
out.print("<td>" + vo.getName() + "</td>"); // 이름
out.print("<td>" + vo.getPrice() + "</td>"); // 가격
out.print("<td>" + vo.getAmount() + "</td>"); // 수량을 칸에 출력
out.print("<tr>");
}
%>
</table>
</form>
</body>
</html>
https://intheham.tistory.com/48
https://intheham.tistory.com/51
https://intheham.tistory.com/52