JSP 3일 (23.03.27)

Jane·2023년 3월 27일
0

IT 수업 정리

목록 보기
88/124

1. 서블릿

1-1. 서블릿이란?

자바 서블릿(Java Servlet)은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말하며, 흔히 "서블릿"이라 불린다. 자바 서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종이다. 서블릿은 JSP와 비슷한 점이 있지만, JSP가 HTML 문서 안에 Java 코드를 포함하고 있는 반면, 서블릿은 자바 코드 안에 HTML을 포함하고 있다는 차이점이 있다.


HTTP 프로토콜을 캡슐화 시켜놓은 객체

1-2. 서블릿 페이지의 구성

  • @ (annotation) : 클래스 위에 기능을 제공
    • @WebServlet("/특정 주소") : '특정 주소'로 오면 객체 생성
    • @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    • @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  • HttpServletRequest, HttpServletResponse
  • doGet()과 doPost()

1-3. 통신을 위한 코드

  • Java Servlet의 프로그램 코드는 소켓 채팅 프로그램과 유사하다.
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter writer = response.getWriter();
		
	    writer.println("<html><head></head><body>");
	    writer.println("id = " + id + "<br>");
	    writer.println("name = " + name + "<br>");
	    writer.println("</body></html>");

2. 폼 태그의 내용 받아오기

2-1. 체크박스

  • body 안의 form 태그에 작성한다.
	<input type="checkbox" name="hobby" value="cook">cook
    <input type="checkbox" name="hobby" value="run">run
    <input type="checkbox" name="hobby" value="swim">swim
    <input type="checkbox" name="hobby" value="sleep">sleep<br/>
  • 서블릿 페이지
String[] hobbys = request.getParameterValues("hobby");



writer.println("hobbys = " + Arrays.toString(hobbys) + "<br>");

2-2. 라디오버튼

  • body 안의 form 태그에 작성한다.
      <input type="radio" name="major" value="kor">국어
      <input type="radio" name="major" value="eng" checked="checked">영어
      <input type="radio" name="major" value="mat" >수학
  • 서블릿 페이지
		String major = request.getParameter("major");
	    writer.println("major = " + major + "<br>");

3. 예제

3-1. 반지름을 입력받으면 원 넓이를 구하기

getarea.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Input Radius</title>
</head>
<body>
<form action="GetArea" method="get">
	반지름 : <input type="text" name="radius" size="10"/><br />
	<input	type="submit" value="전송" />
	<input	type="reset" value="재입력" />

</form>
</body>
</html>

(Servlet) GetArea.java

package edu.global.ex;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class GetArea
 */
@WebServlet("/GetArea")
public class GetArea extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public GetArea() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet()");
		request.setCharacterEncoding("UTF-8");
		
		String radius = request.getParameter("radius");
		double area = Double.parseDouble(radius) * Double.parseDouble(radius) * Math.PI;
		
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter writer = response.getWriter();
		
	    writer.println("<html><head></head><body>");
	    writer.println("입력한 반지름 : " + radius + "<br>");
	    writer.println("원의 넓이 : " + area + "<br>");
	    writer.println("</body></html>");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPost()");
		request.setCharacterEncoding("UTF-8");
		
		String radius = request.getParameter("radius");
		double area = Double.parseDouble(radius) * Double.parseDouble(radius) * Math.PI;
		
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter writer = response.getWriter();
		
		writer.println("<html><head></head><body>");
	    writer.println("입력한 반지름 : " + radius + "<br>");
	    writer.println("원의 넓이 : " + area + "<br>");
	    writer.println("</body></html>");
	}

}

  • 계산하는 것을 class로 만든 다음, 객체로 만들어서 관리할 수도 있다.

Circle.java

package edu.global.ex.shape;

public class Circle {
	private double radius;
	
	public Circle(double radius) {
		this.radius = radius;
	}
	
	public double getArea() {
		return radius * radius * Math.PI;
	}
}

GetArea.java

		String radius = request.getParameter("radius");
		Circle circle = new Circle(Double.valueOf(radius));
		
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter writer = response.getWriter();
		
	    writer.println("<html><head></head><body>");
	    writer.println("입력한 반지름 : " + radius + "<br>");
	    writer.println("원의 넓이 : " + circle.getArea() + "<br>");
	    writer.println("</body></html>");
  • parseInt, parseDouble 보다는 valueOf 를 자주 사용하는 추세이다.

3-2. 국영수 점수 입력받고 총점 평균 학점

Grade.java

  • 생성자 함수를 public으로 만들어야 다른 곳에서 import 가능하다!
package edu.global.ex.grade;

public class Grade {
	private int kor;
	private int eng;
	private int math;

	public Grade(int kor, int eng, int math) {
		this.kor = kor;
		this.eng = eng;
		this.math = math;
	}

	public int getSum() {
		return kor + eng + math;
	}

	public double getAvg() {
		return getSum() / 3.0;
	}

	public char getGrade() {
		char ch = '가';
		if (getAvg() >= 90) {
			ch = '수';
		} else if (getAvg() >= 80) {
			ch = '우';
		} else if (getAvg() >= 70) {
			ch = '미';
		} else if (getAvg() >= 60) {
			ch = '양';
		} else {
			ch = '가';
		}
		return ch;
	}


}

getgrade.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Score</title>
</head>
<body>
<form action="GetGrade" method="get">
	국어 : <input type="text" name="kor" size="10"/><br />
	영어 : <input type="text" name="eng" size="10"/><br />
	수학 : <input type="text" name="mat" size="10"/><br />
	<input	type="submit" value="전송" />
	<input	type="reset" value="재입력" />
</form>
</body>
</html>

(Servlet) GetGrade.java

package edu.global.ex;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import edu.global.ex.grade.Grade;
import edu.global.ex.shape.Circle;

/**
 * Servlet implementation class GetGrade
 */
@WebServlet("/GetGrade")
public class GetGrade extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public GetGrade() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet()");
		request.setCharacterEncoding("UTF-8");
		
		String kor = request.getParameter("kor");
		String eng = request.getParameter("eng");
		String mat = request.getParameter("mat");
		
		Grade grade = new Grade(Integer.valueOf(kor), Integer.valueOf(mat), Integer.valueOf(eng));
		
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter writer = response.getWriter();
		
	    writer.println("<html><head></head><body>");
	    writer.println("국어 점수 : " + kor + "<br>");
	    writer.println("영어 점수 : " + eng + "<br>");
	    writer.println("수학 점수 : " + mat + "<br>");
	    writer.println("총점 : " + grade.getSum() + "<br>");
	    writer.println("평균 : " + grade.getAvg() + "<br>");
	    writer.println("학점 : " + grade.getGrade() + "<br>" );
	    writer.println("</body></html>");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPost()");
		request.setCharacterEncoding("UTF-8");
		
		String kor = request.getParameter("kor");
		String eng = request.getParameter("eng");
		String mat = request.getParameter("mat");
		
		Grade grade = new Grade(Integer.valueOf(kor), Integer.valueOf(mat), Integer.valueOf(eng));
		
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter writer = response.getWriter();
		
	    writer.println("<html><head></head><body>");
	    writer.println("국어 점수 : " + kor + "<br>");
	    writer.println("영어 점수 : " + eng + "<br>");
	    writer.println("수학 점수 : " + mat + "<br>");
	    writer.println("총점 : " + grade.getSum() + "<br>");
	    writer.println("평균 : " + grade.getAvg() + "<br>");
	    writer.println("학점 : " + grade.getGrade() + "<br>" );
	    writer.println("</body></html>");
	}

}

3-3. 버튼을 누르면 로또 번호 보기

Lotto.java (내가 만든 로또 파일)

package edu.global.ex.lotto;

public class Lotto {
	private int[] lotto;
	
	public Lotto(){
		lotto = new int[6];
		
		for (int i = 0; i < lotto.length; i++) {
			lotto[i] = (int) ((Math.random() * 45) + 1);

			for (int j = 0; j < i; j++) {
				if (lotto[i] == lotto[j]) {
					i--;
				}
			}
		}
	
	
	}
	
	public int[] getLotto() {
		return lotto;
	}
}

LottoNum.java (강사님이 만든 파일)

public class LottoNum {
   
   public HashSet<Integer> getLottoNum(){
      HashSet<Integer> set = new HashSet<Integer>();

      while (set.size() < 6) {
         set.add((int) (Math.random() * 45) + 1);
      }
      
      System.out.println(set);
      
      return set;
   }

}

lotto.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Lotto Number</title>
</head>
<body>
<form action="GetLotto" method="post">
	<input	type="submit" value="로또 번호" />
</form>
</body>
</html>

(Servlet) GetLotto.java

  • 내가 만든 것 : doGet에서 출력 / form method="get"
  • 선생님이 만든 것 : doPost에서 출력 / form method="post"
package edu.global.ex;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import edu.global.ex.lotto.Lotto;
import edu.global.ex.lotto.LottoNum;

/**
 * Servlet implementation class GetLotto
 */
@WebServlet("/GetLotto")
public class GetLotto extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public GetLotto() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet()");
		request.setCharacterEncoding("UTF-8");
		
		Lotto num = new Lotto();
		
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter writer = response.getWriter();
		
	    writer.println("<html><head></head><body>");
	    writer.println("번호 : " + Arrays.toString(num.getLotto()));
	    writer.println("</body></html>");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPost()");
		request.setCharacterEncoding("UTF-8");
		
		LottoNum nums = new LottoNum();
		
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter writer = response.getWriter();
		
	    writer.println("<html><head></head><body>");
	    writer.println("번호 : " + nums.getLottoNum());
	    writer.println("</body></html>");
	}

}

4. JSP

  • JSP : Java Server Page (HTML 안에서 Java 페이지를 작업할 수 있게 한다)

4-1. JSP 개요

  • JSP > JSP를 Java 파일로 변환 (Servlet) > Servlet을 class로 변환 > 웹브라우저에 출력

    C:\Users\USER\Desktop\apache-tomcat-9.0.73-windows-x64\apache-tomcat-9.0.73\work\Catalina\localhost\servlet_yjy_echo\org\apache\jsp

class와 jsp가 만들어져 있다.

  • JSP 지시자
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

4-2. scriptlet을 이용하여 html 안에서도 java 코딩하기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>2단 출력하기</title>
</head>
<body>
<%
	int i = 0;
	while(true){
		i++;
		out.println("2 * " + i + " = " + (2 * i) + "<br />");
	
%>

======= <br>

<% if(i>=9)
	break; 

	}
%>

</body>
</html>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>구구단 출력하기</title>
</head>
<body>

<%
	for(int i=1; i<=9; i++){
		for(int j=2; j<=9; j++){
			out.println(j + "x" + i + " = " + i*j);
		}
		out.println("<br>");
	}
%>

</body>
</html>

4-3. 다양한 scriptlet의 사용

  • <% %> : java 코드 기술
  • <%! %> : java 변수 선언
  • <%= %> : 변수 값 사용 (out.println과 유사한 역할)
<%!
	int i = 10;
	String str = "abc";
	
	private int sum(int a, int b){
		return a+b;
	}
%>

<%= i %><br>
<%= str %><br>
<%= sum(1,5) %><br>

4-4. jsp로 form 받기

getarea.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Input Radius</title>
</head>
<body>
<!-- <form action="GetArea" method="get">
	반지름 : <input type="text" name="radius" size="10"/><br />
	<input	type="submit" value="전송" />
	<input	type="reset" value="재입력" />
</form> -->

<form action="circle_result.jsp" method="get">
	반지름 : <input type="text" name="radius" size="10"/><br />
	<input	type="submit" value="전송" />
	<input	type="reset" value="재입력" />
</form>
</body>
</html>

circle_result.jsp

<%@page import="edu.global.ex.shape.Circle"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>circle 결과</title>
</head>
<body>
<% 
	String radius = request.getParameter("radius");
	Circle circle = new Circle(Double.valueOf(radius));
%>

반지름 : <%= radius %><br />
넓이 : <%= circle.getArea() %><br />

</body>
</html>
  • jsp에서 클래스를 import 하려면 페이지 임포트 선언을 해줄 필요가 있다.
profile
velog, GitHub, Notion 등에 작업물을 정리하고 있습니다.

0개의 댓글