JSP Tag

Let's Just Go·2022년 5월 17일
0

JSP

LIST(추가 공부)

  • LIST
    • 메서드로 접근할 수 있고 인덱스를 사용해서 접근할 수 있음

      <%@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>

Scriptlet

  • Scriptlet
    • 요청이 들어올 때 마다 실행할 부분을 작성

    • <% %> 로 표현

    • 자바 코드 부분만 <% %>를 통해서 구분

    • 자바코드의 실행 결과를 브라우저에서 보고 싶으면 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 이해를 위한 그림


Expression

  • Expression
    • <%= %>로 표현

    • 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>

Declaration

  • Declaration
    • <%! %>로 표현

    • 클래스 블록을 표현

      <%@ 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은 접근제한자와 메소드 선언도 가능함 
          %>

Comment

  • Comment
    • 주석

    • 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>

Directive

  • Directive(지시자)
    • jsp 페이지의 전체적인 속성을 지정할 때 사용


  • page
    • 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>

Include

  • include
    • 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>

JSP 내장 객체

  • 내장 객체
    • JSP 파일 내에 객체를 생성하지 않고 바로 사용할 수 있는 객체
    • JSP에서 제공되는 내장 객체는 JSP 컨테이너에 의해 서블릿으로 변환될 때 자동으로 객체가 생성
    • 종류
      • request, response, out, session, application
      • pageContext, page, config, exception

  • request
    • 웹 브라우저를 통해 서버에 어떤 정보를 요청하는 것

    • 이러한 요청 정보가 담기고 관리되는 곳이 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()

  • 요청 파라미터(정말 중요)
    • 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>

Practice

  • Tag
    • 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>

  • request
    • 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>
profile
안녕하세요! 공부한 내용을 기록하는 공간입니다.

0개의 댓글