메서드로 접근할 수 있고 인덱스를 사용해서 접근할 수 있음
<%@page import="java.util.Collections"%>
<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%--
Arraylist
- 배열과 다르게 크기가 자동으로 조절
- 배열과 유사한 형태이기 때문에 순차적으로 데이터에 접근하기 좋음
- 인덱스를 활용하며 객체의 중복 저장을 허용
- 대부분 List라는 인터페이스로 생성
--%>
<%
List<String> nick = new ArrayList<> ();
/*
배열 -> 인덱스로 해당 영역에 바로 접근.
리스트 -> 메서드로 접근. (인덱스를 사용하긴 함 )
*/
// add(객체) : 리스트에 객체를 추가하는 메서드
String str = "야옹이";
nick.add("멍멍이");
nick.add(str);
nick.add(new String("개구리"));
System.out.println(nick);
// 리스트 이름만 적어도 가능
// add(인덱스, 객체) : 특정 인덱스에 객체를 삽입하는 메서드
nick.add(3, "어흥이");
System.out.println(nick);
// get(인덱스) : 리스트 내부의 객체를 참조하는 메서드
String name = nick.get(3);
System.out.println("3번 인덱스의 값: " + name);
// size() : 리스트의 크기를 반환
System.out.println("nick의 크기 : " + nick.size());
// set(인덱스, 수정할 객체) : 리스트 내부의 객체를 수정
nick.set(2, "삐약이");
System.out.println(nick.get(2));
// remove(인덱스), remove(객체) : 값을 삭제
// nick.remove(5);
// nick.remove(str);
System.out.println(nick);
// index번호가 5인 값이 삭제된 것을 확인
// 리스트의 반복문 처리
for (int i = 0; i < nick.size(); i++){
System.out.println(nick.get(i));
}
System.out.println("==============================");
// 향상for문(forEach) : 값을 직접 가져올 수 있음
for(String n : nick){
System.out.println(n);
}
// contains(객체) : 리스트 내의 객체의 존재 유무를 파악하는 메서드
System.out.println(nick.contains("삐약이"));
System.out.println(nick.contains("개구리"));
// clear() : 리스트 내부 요소 전체 삭제
nick.clear();
System.out.println(nick);
// isEmpty() : 리스트가 비어있는지 여부를 확인하는 메서드
System.out.println(nick.isEmpty());
/*
Collections
- 컬렉션 객체들의 부가 기능들을 지원
*/
List<Integer> score = new ArrayList<>();
// List는 객체들의 모음이므로 int이렇게 적으면 에러가 남
// 한번에 객체 많이 추가하기
Collections.addAll(score, 78,100,61,68,67,62,70,73);
// addALL(넣고 싶은 객체, 넣고자 하는 값들)
System.out.println(score);
// Collection 내 등장 횟수 구하기
System.out.println("100점 학생 수 : " + Collections.frequency(score, 100));
// collection안에 특정 값이 몇개 등장하는지 출력
// 최대값, 최소값 구하기
System.out.println("최대값 : " + Collections.max(score));
System.out.println("최대값 : " + Collections.min(score));
// 오름차순 정렬
Collections.sort(score);
System.out.println("오름차순 정렬 : " + score);
// 내림차순 정렬
Collections.reverse(score);
// 처음부터 내림차순 정렬
Collections.sort(score, Collections.reverseOrder());
System.out.println("내림차순 정렬 : " + score);
// swap(리스트, i, j) : 두 요소의 위치를 교체
Collections.swap(score, 0, 5);
System.out.println("swap 결과 : " + score);
// shuffle(리스트) : 리스트 내부 요소를 무작위로 섞는 함수
Collections.shuffle(score);
System.out.println("shuffle 결과 : " + score);
// fill(리스트, 원하는 값) : 원하는 값으로 컬렉션 초기화
Collections.fill(score, 100);
System.out.println("fill 결과 : " + score);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
요청이 들어올 때 마다 실행할 부분을 작성
<% %> 로 표현
자바 코드 부분만 <% %>를 통해서 구분
자바코드의 실행 결과를 브라우저에서 보고 싶으면 out.print()함수를 통해 출력 가능
메소드 블록을 표현
<%-- <%@ page language="java" contenttype="text/html; charset=UTF-8" pageencoding="utf-8"%>
--%>
<!-- 자동으로 생성한 문장인데 저것 때문에 오류가 났네... -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>initializejsp</title>
</head>
<body>
<!-- http://localhost:8181/jspbasic/jsptag/scriptlet.jsp
root주소 : jspbasic, jsptag안의 scriptlet.jsp파일을 서버가 찾아서 응답을 한 결과를 화면에서 볼 수 있음
html과 java 모두 사용 가능-->
<% for(int i = 1; i <= 5; i++){%> <!-- 자바 코드인 부분만 <% %>를 통해서 구분해야함 -->
<h2>jsp 작성</h2>
<p> 안녕하세요! 오늘은 5월 6일 금요일입니다.</p>
<p> 신기하고 재밌당 자바 코드만 특정문구로 구분</p>
<% }%> <!-- 자바 코드인 부분만 "<% %>"를 통해서 구분해야함 재밌네 -->
<hr>
<h2>구구단 3단</h2>
<% for (int hang = 1; hang <= 9; hang++){
// out.print() : 브라우저에 바로 출력을 실행하는 메소드
// 브라우저에 출력할 텍스트나 html 태그는 ""에 감싸서 전달
// 자바 변수나 메서드의 리턴 값은 바로 작성 가능
out.print("3 x " + hang + " = " + (3*hang) + "<br>");
} %>
<!--
반복문, 조건문을 사용하여 구구단을 홀수단(3,5,7,9)만 브라우저에 출력 -->
<h2> 구구단 홀수만 출력 (반복문 조건문 활용)</h2>
<% for (int hang = 2; hang <= 9; hang++){
if (hang % 2 != 0) {
out.print(hang + "단" + "<br>");
for (int col = 1; col <= 9; col++){
out.print(hang + "x" + col + " = " + (hang*col) + "<br>");
}}}%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
/* Scriptlet(메서드 블록)
지역변수 및 메서드 내부의 코드를 작성하는 태그
Scriptlet에 작성한 내용은 jsp 파일이 클래스로 변환될 때 jsp_service()라는 메서드 내부에 작성
페이지 요청이 발생할 때마다 실행할 로직을 작성할 수 있음
*/
int j = 1;
// 선언할 때 public을 사용하면 에러가 남 즉, scriptlet에서는 접근제한자를 사용할 수 없음
/* void hello() {
//out.print("안녕~");
}
Scriptlet은 접근제한자를 사용할 수 없고 메소드 선언도 불가능 */
i++;
j++;
/* 클래스로 변환될 때 Scriptlet은 메서드 블록으로 가고 Declaration은 클래스 블록으로 가기 때문에 차이가 남
그래서 Scriptlet은 메서드 블록이기 때문에 접근 제한자가 못오고 메소드 선언도 안되는 구나
하지만 Declaration은 클래스 블록이기 때문에 다 가능한거네
클래스 블록에 있는 변수들은 값을 지정하지 않아도 초기화(int는 0, String은 null)되는데
메서드 블록에 있는 변수들은 값을 지정하지 않으면 초기화되지 않는 특징이 Scriptlet과 Declaration에 모두 나타남
*/
int result = add(7,8);
double rn = Math.random();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Declaration</title>
</head>
<body>
i의 값 : <%= i %> <br>
j의 값 : <%= j %> <br>
result 값 : <%= result %> <br>
난수 값 <%= rn %>
</body>
</html>
.java 파일을 통해서 Scriptlet은 메소드 블록안에 있고 Declaration은 클래스 블록 안에 있는 것을 확인할 수 있음
Scriptlet과 Declaration 이해를 위한 그림
<%= %>로 표현
out.print()와 같은 기능
<%= %>을 통해서 화면에 자바의 실행 결과를 보여줄 수 있음
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<%
String name = "홍길동";
String address = "서울특별시";
%>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<%
out.print("이름: " + name + "<br>");
out.print("주소: " + address + "<br>");
%>
<hr>
이름: <%= name %> <br>
주소: <%= address %> <br>
난수값 : <%= Math.random() %> <br>
<hr>
<h2>구구단 7단</h2>
<% for(int hang = 1; hang<=9; hang++) { %>
7 X <%= hang %> = <%= 7 * hang %> <br>
<% } %>
</body>
</html>
<%! %>로 표현
클래스 블록을 표현
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
/*
declaration(클래스 블록)
jsp 파일 내부에서 사용할 멤버 변수나 메서드 등을 선언할 때 사용하는 태그
선언자에 작성한 코드는 jsp 파일이 클래스로 변환될 때 실제 클래스 블록에 선언
해당 클래스로 객체가 생성될 때 멤버변수(속성), 메서드(기능)로 동작하기 때문에
객체가 소멸하지 않는 이상 요청이 들어온다면 값을 계속 누적할 수 있고
메서드 호출 또한 가능
*/
public int i;
public int add(int n1, int n2){
return n1 + n2;
}
// declaration은 접근제한자와 메소드 선언도 가능함
%>
주석
jsp 파일 내에 태그를 통해서 다양한 주석을 작성할 수 있고 jsp 자체의 주석도 가능
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Comments</title>
</head>
<body>
<%
// Scriptlet 내부에서 자바 주석을 사용 가능
/*
여러줄 주석도 가눙~
*/
%>
<!-- 요것은 HTML 주석으로 이것도 당연히 가능 -->
여기는 주석 아님!<br>
<hr>
<%-- 이거는 jsp 주석이예용!
다른 주석은 페이지 소스에서 보이는데 jsp 주석은 페이지 소스에서 보이지 않음--%>
여기도 주석은 아니예용!
</body>
</html>
jsp 페이지에 대한 정보를 지정
jsp가 생성하는 문서 타입, import, 에러 페이지 등 페이지에서 필요로 하는 정보를 설정
<%@ page import="java.text.SimpleDateFormat"%>
<%@ page import ="java.util.Date" %>
<%@ 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>
<%
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년MM월dd일 a hh시 mm분 ss초");
String dayInfo = sdf.format(date);
//문자열로 된 날짜를 포맷형식으로 전달
%>
오늘은 <%=dayInfo %> 입니다.
</body>
</html>
jsp 페이지의 특정 영역에 다른 문서를 포함
바뀌지 않는 html 부분을 미리 만들어 다양한 페이지에 포함해서 사용할 수 있음
예시 : Header(메뉴바), Footer(저작권 사명 등 )
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- html형식은 다른 곳에도 있을 것이므로 지움 -->
<%! int visit; %>
<!-- 값을 누적시키기 위해 declaration 사용 -->
<% visit++; %>
<h2> 방문자 수 : <%= visit %> 명 </h2>
<!-- Header -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<hr>
Contact Us : abc123@gmail.com / SINCE 2022.05.09 ~ <br>
사업자 번호 : 123-456-789123 / 주소 : 서울특별시 강남구...
<hr>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Main(header + footer)</title>
</head>
<body>
<%@ include file ="Directive02_Header.jsp" %>
<p>
하잉 <br>
홈페이지 방문을 환영합니다!<br>
여기는 메인 페이지 입니다
</p>
<%@ include file ="Directive02_Footer.jsp" %>
<!-- include를 통해서 미리 지정한 파일을 불러올 수 있음 (재사용 가능) -->
</body>
</html>
웹 브라우저를 통해 서버에 어떤 정보를 요청하는 것
이러한 요청 정보가 담기고 관리되는 곳이 request 객체
제공 기능
get~~~() 로 시작
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>req_info</title>
</head>
<body>
<%--
request는 브라우저에 대한 정보, 사용자가 전달하는 값에 대한 많은 정보가 있음
(요청에 대한 전반적인 정보)
request객체는 내장 객체이며 직접 생성하지 않아도
요청이 들어올때 자동으로 객체가 생성되기 때문에
바로 사용 가능
--%>
URL 주소 : <%= request.getRequestURL() %> <br>
URI 주소 : <%= request.getRequestURI() %> <br>
컨텐스트 루트 : <%= request.getContextPath() %> <br>
서버이름 : <%= request.getServerName() %><br>
포트 번호 : <%= request.getServerPort() %> <br>
IP주소 : <%= request.getRemoteAddr() %>
</body>
</html>
request.getParameter(파라미터변수명);
클라이언트에서 서버로 데이터를 요청할 때 함께 전달되는 값들을 담은 변수를 요청 파라미터라고 함
요청 파라미터는 URL 주소 뒤에 ?를 붙이고 [파라미터변수명=값] 형식으로 서버에 데이터를 전송
요청 파라미터를 여러개 전달할 때에는 & 기호를 사용해 나열해 전달
http://localhost:8181/JSPBASIC/JspObjRequest/req_param.jsp?name=홍길동&나이=30&주소=부산광역시 ← 보내게 되면 여러개의 값들을 서버에 보낼 수 있음
https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=혁오 ←네이버도 똑같이 사용자가 입력한 값을 통해서 조회를 해서 처리하는 것을 볼 수 있음
사용자가 입력한 값을 URL의 ? 뒤에서 request로 가져온 값을 바탕으로 DB에서 조회하여 원하는 결과를 출력 (정말 중요)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%--
요청 파라미터 (request parameter)
클라이언트 측에서 서버로 데이터를 요청할 때 함께 전달되는 값들을
담은 변수를 요청 파라미터라고 함
요청 파라미터는 URL 주소 뒤에 ?를 붙인 후에 [파라미터변수명=값] 형식을 통해
서버로 데이터를 전송
요청 파라미터를 여러 개 전달할 때 & 기호를 사용하여 나열해서 전달
--%>
<%
// request.getParameter() : 클라이언트 쪽에서 전송된 요청 파라미터값을 읽는 방법
String name = request.getParameter("name");
String age = request.getParameter("나이");
String addr = request.getParameter("주소");
%>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<p> 이름 : <%=name %> </p>
<p> 나이 : <%=age %> 세</p>
<p> 주소 : <%=addr %> </p>
</body>
</html>
Tag를 이해하기 위한 연습
내가 생각한 코드 (중복 에러에 대해서 해결 X)
<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%--
- ArrayList를 생성해서 1 ~ 45범위의 난수 6개를 리스트에 저장하세요.
중복은 발생하면 안됩니다. 중복 방지 로직을 세워서 리스트에 난수를 삽입한 후
- body태그에 리스트 내부의 값을 출력해 주세요.
난수 생성은 Random객체든, Math.random()이든 상관 없습니다.
--%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Quiz1</title>
</head>
<body>
<h2>로또 번호 생성 결과!</h2>
<br>
<h3>이번주 로또 번호는 이 번호다!</h3>
<%HashSet<Integer> set = new HashSet<Integer>(); %>
<% for(int i = 0; i<6; i++) {
Random r1 = new Random();
set.add(r1.nextInt(45) + 1);
}
Iterator iter = set.iterator();
if (set.size() == 6) {
while( iter.hasNext()){
// System.out.println(iter.next() + " ");
out.print(iter.next() + " ");
}
}
else{
out.print("값이 6개가 아니라 출력하지 못했습니다.");
}
%>
</body>
</html>
List 사용 (중복 에러 처리 완료)
<%@page import="java.util.*"%>
<%@page import="java.util.Collections"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%--
- ArrayList를 생성해서 1 ~ 45범위의 난수 6개를 리스트에 저장하세요.
중복은 발생하면 안됩니다. 중복 방지 로직을 세워서 리스트에 난수를 삽입한 후
- body태그에 리스트 내부의 값을 출력해 주세요.
난수 생성은 Random객체든, Math.random()이든 상관 없습니다.
--%>
<%
List<Integer> n = new ArrayList<> ();
Random r1 = new Random();
while(n.size() < 6){ // 이게 핵심 중복 제거 논리
int temp_num = (r1.nextInt(45) + 1);
if (!n.contains(temp_num)) {
n.add(temp_num);
}
}
Collections.sort(n);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>로또 번호 생성 결과!</h2>
<br>
<h3>이번주 로또 번호는 이 번호다!</h3>
번호 :
<% for (int i = 0; i < n.size(); i++) {
out.print(n.get(i) + " ");
}
%>
</body>
</html>
requset를 이해하기 위한 연습
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%--
bmi지수 계산 공식: 체중(kg) / 신장(m) * 신장(m)
- bmi지수가 25를 초과한다면 "당신은 과체중입니다." 를 출력
- 18.5미만이라면 "당신은 저체중입니다." 를 출력
- 나머지는 "당신은 정상체중입니다." 를 출력하세요.
주의!)
request.getParameter()의 리턴 타입은 String입니다.
숫자가 전달되어도 타입이 문자열입니다.
그렇기 때문에 bmi 지수를 계산하려면 실수나 정수로 변환 후 계산해야 합니다.
Integer.parseInt(문자열), Double.parseDouble(문자열)
신장 -> cm, 체중 -> kg 두 값 모두 소수점 포함 값으로 받도록 하겠습니다.
--%>
<%
String s_m = request.getParameter("cm");
String k = request.getParameter("kg");
%>
<%
double i_m = (Double.parseDouble(s_m)/100);
double i_k = Double.parseDouble(k);
double bmi = i_k / (i_m *i_m);
String c = String.format("%.2f", bmi);
double bmi1 = i_k / (i_m * i_m);
bmi1 = Math.round(bmi1*100) / 100.0;
%>
<html>
<head>
<meta charset="UTF-8">
<title>bmi</title>
</head>
<body>
<h2>체질량 지수(BMI) 계산</h2>
<hr>
<p>- 신장 : <%= s_m %> cm</p>
<p>- 체중 : <%= k %> kg</p>
<p> BMI지수 : <strong><%= c %></strong></p> <br>
<p> MATH함수를 사용한 BMI지수 : <strong><%= bmi1 %></strong> </p><br>
<%
if (bmi > 25) {
out.print("당신은 과체중입니다.");
}
else if (bmi < 18.5){
out.print("당신은 저체중입니다.");
}
else {
out.print("당신은 정상체중입니다.");
}
%>
</body>
</html>