<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>language : 스크립트 언어의 유형을 정해주는 속성 기본 설정 값: java
contentType : MIME 형식을 지정해주고 캐릭터셋을 설정
pageEncoding : contentType과 동일한 기능, "해당 JSP 파일을 UTF-8로 인코딩 하겠다"
contentType: "클라이언트(웹브라우저)가 받아볼 페이지가 UTF-8 형식이다"
import : JSP 파일 내에서 외부 자바 패키지나 클래스 불러올 때 사용
<%@ page import="java.util.*" %>
errorPage : 현재 페이지가 오류가 발생할 경우 호출될 페이지를 지정
isErrorPage : 현재의 페이지가 일반적인 페이지인지 예외를 처리하는 페이지인지 지정할때 사용.
session : JSP 페이지가 HttpSession을 사용할지에 대한 여부 지정(기본 값: "true")
buffer : JSP 페이지의 출력 버퍼의 크기를 지정하는 속성(기본값: "8kb", 사용하지 않을때: "none")
autoFlush : JSP 페이지의 내용들이 클라이언트(웹 브라우저)에 출력되기 전 버퍼가 가득 찼을 경우 버퍼를 자동으로 비울 것인지 지정하는 속성(기본값: "true")
isThreadSafe : 다중쓰레드를 사용할 수 있는지 없는지 지정(기본값: "true"/ “false”: 순차적 진행)
info : 해당 JSP 페이지에 대한 설명 작성
extends : JSP 페이지가 어떤 클래스를 상속받는지 설정
- include: 외부 파일을 현재 JSP 페이지에 포함시킴
<%@ include file="삽입할 파일 이름" %>
<%@ taglib uri="/META-INF/mytag.tld" prefix="mytag" %>1. pageContext 영역에 '애트리뷰트' 이름 age, 값 23을 저장
<c:set var="age" value="13"/>
2. 저장된 애트리뷰트 값 출력
age: <c:out value="${age }"></c:out></h5> -> age는 애트리뷰트 이름
name: <c:out value="${name }"></c:out> ->name은 자바변수. 출력 안됨
3. 자바의 if 태그 대신 사용
<h5>c:if테스트</h5>
<!-- 조건식을 test 속성에 작성. EL 기호 안에 사용 -->
<c:if test ="${age<20 }">
<div style ="color:green">청소년입니다. </div>
</c:if>
<c:if test ="${age>=20 }">
<div style ="color:red">성인입니다. </div>
</c:if>
4. if~else 형식
<c:set var="age" value="23"/> <!-- 애트리뷰트 age값 변경 -->
<c:choose>
<c:when test="${age <20 }">
<div style ="color:green">청소년입니다. </div>
</c:when>
<c:otherwise>
<div style ="color:red">성인입니다. </div>
</c:otherwise>
</c:choose>
5. for문
<c:forEach var="i" begin="1" end="10" varStatus="status" step="2">
<div>
<c:out value="${i }"/>
<c:out value="${i*11}"/>
<!-- varstatus 속성은 for 반복 상태를 알 수 있는 값을 제공 -->
<c:out value="${status.count}"/>
<c:out value="${status.step}"/>
</div>
</c:forEach>
6. 자바 객체 활용하기
<%CustomerVo vo= new CustomerVo("momo","강모모"[,"momo22@daum.net](mailto:,%22momo22@daum.net)",29,null);
//만들어진 객체를 pageContext scope의 애트리뷰트로 저장
pageContext.setAttribute("customer",vo); %>
<c:out value="${customer }"/>
<ul>
<li>${customer.customId}</li>
<li>${[customer.name](http://customer.name/)}</li>
<li>${customer.email}</li>
<li>${customer.age}</li>
</ul>
7. 자바 객체의 컬렉션(list) 활용하기 -> jdbc로 sql 조회한 결과 List인 경우 활용 가능
List<CustomerVo> list = List.of(new CustomerVo("momo12","강모모","momo12@daum.net",25,null),
new CustomerVo("momo13","강모모","momo13@daum.net",26,null);
pageContext.setAttribute("list",list);%>
<!-- 컬렉션 list에서 값을 하나씩 가져와 애트리뷰트 이름 vo에 저장 -->
<c:forEach items="${list }" var="vo" varStatus="status">
<c:out value="${status.index }"/>, <c:out value="${vo }"/>
<!--varStatus 속성 index는 지금처럼 items 로 컬렉션 다룰 때 사용 -->
<!--vo에 저장된 객체 속성을 각각 출력하기 -->
<ul>
<li><c:out value="${vo.customId }"/></li>
<li><c:out value="${vo.name }"/></li>
<li><c:out value="${vo.email }"/></li>
<li><c:out value="${vo.age }"/></li>
</ul>
</c:forEach><!-- formatNumber는 서식(기본: 3자리마다 ,) 있는 출력과 저장 동작 , value에는 값을 직접 또는 el -->
<fmt:formatNumber value="9999999"/> <br>
<!-- fmt:parseNumber는 변수에 저장만 (출력별개). -->
<fmt:parseNumber var="test" value="8888888"/>
test :<c:out value=" ${test }"/><br> <!-- 서식 없는 출력 -->
<!-- 현재 locale : ko_kr 표기는 언어_국가 형식 :화폐단위 -₩ ->화폐, 날짜는 locale에 영향을 받음-->
<fmt:formatNumber value="9999999" type="currency"/><br>
<!-- locale 변경 : en_us :화폐단위 - $ -->
<fmt:setLocale value="en_us"/>
<fmt:formatNumber value="9999999" type="currency"/><br>
<!-- type: 화폐단위 , 퍼센트(percent) 등 표시 ,
pattern : 직접 소수점 이하, 전체 자리수 지정-->
<hr>
<!-- 789,789.123 기본패턴:소수점 최대 3자리 -->
<fmt:formatNumber value="789789.12345" /><br>
<!-- 789,789.12 -->
<fmt:formatNumber value="789789.12345" pattern="#,###.##"/><br>
<fmt:formatNumber value="789789.12345" pattern="#,###.#####"/><br>
<fmt:formatNumber value="789789.123" pattern="0000,000,000.00000"/><br>
<!-- 자릿수를 맞추기 위해 빈자리에 0을 넣음
fmt:formatXXX: 출력과 변수에 저장
fmt:parseXXX: 저장만 함 -->
<hr>
<!-- 날짜 패턴에 대소문자 유의 : 일 dd, 월 MM , 분 mm , 시(12) hh , 시(24) HH -->
<!-- Jan 20, 2023 *formatDate 도 var 로 변수 저장 -->
<!--now 애트리뷰트 값 : 테스트 위해 자바객체로 생성 -->
<fmt:setLocale value="ko_kr"/>
<c:set var="now" value="<%= new java.util.Date()%>"/>
현재시간과 날짜 : ${datetime1 }<br> <!-- 출력결과 : Thu Nov 03 20:14:00 KST 2022 -->
<fmt:formatDate value="${now }" /><br>
<!-- parseDate의 pattern은 value 값의 형식을 알려줍니다. pattern이 없으면 날짜 타입으로 변환을 못함..(문자열을 날짜 타입으로 캐스팅)-->
<fmt:parseDate value="2022-11-03 20:14" var="datetime1" pattern="yyyy-MM-dd HH:mm"/>
지정된 시간과 날짜 : <c:out value="${datetime1 }"/>
<hr>
<fmt:formatDate value="${datetime1 }" type="date"/><br> <!-- Jan 20, 2023 -->
<fmt:formatDate value="${datetime1 }" type="time"/><br> <!-- 10:35:29 AM -->
<fmt:formatDate value="${datetime1 }" type="both"/><br> <!-- Jan 20, 2023, 10:35:29 AM -->
<hr>
<fmt:formatDate value="${datetime1 }" pattern="yyyy-MM-dd HH:mm:ss"/><br>
<!-- 2022-11-03 20:14:00 시간이 24시 기준(HH)-->
<fmt:formatDate value="${datetime1 }" pattern="yyyy-MM-dd a hh:mm:ss"/><br>
<!-- 2022-11-03 PM 08:14:00 시간이 12시 기준(hh). a는 오전/오후 표시--><ul>
<li><c:out value="${fn:length(msg)}"/></li>
<li><c:out value="${fn:indexOf(msg,'am')}"/></li>
<li><c:out value="${fn:toUpperCase(msg)}"/></li>
<li><c:out value="${fn:substring(msg,3,6)}"/></li>
<li><c:out value="${fn:contains(msg,'am')}"/></li>
<li><c:out value="${fn:contains(msg,'are')}"/></li>
<li><c:out value="${fn:replace(msg,'Twice','Viviz')}"/></li>
<c:set value="he llo !" var="temp"/>
<li><c:out value="${temp }"/>공백 하나만 출력되는 이유: html 문서에는 공백이 하나만 반영됨, 연속적으로 출력하고 싶은 경우 사용해야함 </li>
<li><c:out value="${fn:replace(temp,' ',' ')}"/></li>
<li>${fn:replace(temp,' ',' ')}</li>
<!-- 리턴이 발생하는 split은 c:set 으로 실행, 리턴받을 var 정의 -->
<c:set value="${fn:split(msg,' ')}" var="temps"/>
</ul>
<h4>msgArr 배열 애트리뷰트값을 하나씩 출력</h4>
<ul>
<c:forEach items ="${msgArr }" var="arr" varStatus="status">
<li><c:out value="${arr }"/></li>
</c:forEach>
</ul><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%! public int add(int num1, int num2){ -> 선언부
return num1+num2;}
<html><head/>
<body>
<% int result = add(10, 20); %> ->스클립틀릿
덧셈결과 1: <%=result%> <br/> ->표현식
덧셈결과 2: <%=add(30,40)%> </body></html>| 내장객체 | 데이터 타입 |
|---|---|
| request | javax.servlet.http.HttpServletRequest |
| response | javax.servlet.http.HttpServletResponse |
| session | javax.servlet.http.HttpSession |
| application | javax.servlet.ServletContext |
| config | javax.servlet.ServletConfig |
| out | javax.servlet.jsp.JspWriter |
| pageContext | javax.servlet.jsp.PageContext |
page: 동일한 페이지에서만 공유, 페이지 벗어날 시 소멸
session: 접속후, 웹브라우저 닫을때까지
request
url 의 쿼리스트링 (조회)
a 태그 href 속성값으로 정하기.
자바스크립트의 location.href = '요청 url과 쿼리스트링'
form 태그 사용 (저장)
*쿼리스트링: URL 뒤 → “?키=값&키=값”
GET → 파라미터 값 노출 됨/ POST → 파라미터 값 노출안됨
<li>요청 URL: <%= request.getRequestURL() %></li>
<li>요청 URI: <%= request.getRequestURI() %></li>
<li>컨텍스트(context): <%=request.getContextPath() %></li>
<li>쿼리스트링: <%=request.getQueryString() %></li> ->키와 값 전체 (GET일때만 가능)
<li>값의 일부: <%=request.getParameter("han") %></li> -> "han" 원하는 값의 키(1개)
<li>여러 값: <%=request.getParameterValues("favo") %></li> -> "favo"키의 여러값 (foreach로 담기)
<li>클라이언트 ip : <%= request.getRemoteAddr() %></li>
<li>클라이언트 host : <%= request.getRemoteHost() %></li>
<li>클라이언트 포트 : <%= request.getRemotePort() %></li>
<!-- 기준이 서버이므로 remote 멀리 떨어진 것이 클라이언트.. local이 서버 -->
<li> 서버 ip : <%= request.getLocalAddr() %></li>
<li> 서버 name : <%= request.getLocalName() %></li>
<li> 서버 port : <%= request.getLocalPort() %></li>
----------------------------------------------------------------------
요청 URL : http://192.168.30.254:8088/jsp1/day2/9_request.jsp
요청 URI : /jsp1/day2/9_request.jsp -> 실제 자원 위치
컨텍스트(context) : /jsp1 //이클립스에서 프로젝트 이름을 기본으로 설정
클라이언트 ip :192.168.12.5
클라이언트 host : 192.168.12.5
클라이언트 포트 : 52335 //클라이언트에서 요청을 보내는 포트(임의의 값)
서버 ip :192.168.30.254
서버 Name : DESKTOP-HUJUVSS
서버 포트 : 8088 //특정 서비스 진입하는 포트req.setCharacterEncoding("UTF-8"); ->한글 입력시 필수
RequestDispatcher dispatcher = request.getRequestDispatcher("../../webapp/member/list.jsp");
dispatcher.forward(request, response);<ul>
<li><a href="5_param_receive.jsp?name=sana&age=24">1. name, age 2개의 파라미터 보내기</a></li>
<li><a href="5_param_receive.jsp?name=sana">2. name, age 2개의 파라미터 보내기-age 파라미터 없음</a></li>
<li><a href="5_param_receive.jsp?name=sana&age=">3. name, age 2개의 파라미터 보내기-age값 없음</a></li>
</ul><body><%
TblCustomerDao dao = new TblCustomerDao();
String name = request.getParameter("name");
String temp = request.getParameter("age");
List<CustomerVo> list = null;
if((name !=null && name.length()!=0)&&(temp!=null && temp.length() !=0)){
int age = Integer.parseInt(temp);
list = dao.selectBy(name, age);
out.print(list);
if(list.size()==0) out.print("<h4>조회결과가 없습니다</h4>");
} else{
out.print("파라미터 값을 모두 입력하세요");
}
%></body>정보: [MyInfo]: request URL :http://localhost:8088/jsp1/first.cc , URI: /jsp1/first.cc, ContextPath: /jsp1
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//사용자 요청에 대한 정보출력(request 객체의 속성값): 로그 출력에서 {}는 결과값 표시 ->{} 순서대로 () 가 들어감
logger.info("\n[MyInfo]: request URL :{} , URI: {}, 컨텍스트패스: {}",
request.getRequestURL(),request.getRequestURI(), request.getContextPath());
//고객전체 조회 요청은 a 태그 메뉴이므로 GET 방식 요청
@WebServlet(urlPatterns = {"/customers.cc"}, description="고객 전체 조회")
public class CustomerServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(CustomerServlet.class);
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//dao 실행하고 리턴받은 list를 로그로 찍어보기
TblCustomerDao dao = new TblCustomerDao();
List<CustomerVo> list = dao.allCustomers();
logger.info("[@,@] 전체 고객 조회: {}",list);
//뷰(jsp)에 애트리뷰트 값을 저장해서 보내기
//페이지 컨텍스트는 하나의 웹페이지 범위, request(매개변수명)는 하나의 요청 범위로 애트리뷰트 저장.
req.setAttribute("list",list);
//뷰 jsp로 '요청'을 '전달-애트리뷰트'하고 화면을 전환(forward)해야 함
RequestDispatcher dispqtcher = req.getRequestDispatcher("/day3/Customers.jsp");
dispqtcher.forward(req, resp); //forward가 전달..
//실행 브라우저: url: http://localhost:8088/jsp1/customers.cc
//화면 웹페이지는 customers.jsp
}//register.jsp 화면에서 입력된 값을 post 방식으로 전달받기
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//POST 요청값 인코딩 필수
req.setCharacterEncoding("UTF-8");
logger.info("[MyInfo]고객 데이터 저장이 요청되었습니다.");
String userid = req.getParameter("userid");
String name = req.getParameter("name");
String email = req.getParameter("email");
String temp = req.getParameter("age");
//나이가 필수 입력이 아니라면 값이 비어있을수 있음. 그때 parseint 확인 해보기 => 오류 발생
int age = 0;
//form 태그 요소에 name="age"가 있으므로 temp가 null일 경우는 없음 ->post에서는 입력요소가 있다면 무조건 공백으로라도 채워져있음/ get은 공백 O
if(temp.length() !=0) age = Integer.parseInt(temp);
//dao의 메소드 인자로 전달할 vo 객체 생성하기-join 메소드
CustomerVo vo= new CustomerVo(userid, name, email, age, null);
logger.info("\t 입력값 vo: {}", vo);
TblCustomerDao dao = new TblCustomerDao();
dao.join(vo); // pk 아이디 중복값있으면 무결성 오류 발생
//서버가 클라이언트에게 응답을 보냄 ->"customers.cc로 요청을 보내라
resp.sendRedirect("customers.cc");
//리다이렉트는 웹페이지의 js, out.print .. 출력 사용 불가능}ㄴ 모든 jsp페이지 공유, 이동 혹은 요청 응답 완료시 소멸
void setAttribute(String name, Object value)
-속성값 저장: name=속성명 , value= 저장할 값
Object getAttribute(String name)
-속성값 불러오기
void removeAttribute(String name)
-저장된 속성 삭제(존재하지 않아도 오류 X)