본문 바로가기
백엔드/JSP & Servlet

JSP / Servlet - 2(기초)

by study_yeon 2023. 6. 14.

2023.06.09

제이슨
쌍을 이룸 

vsc로 확인하는 예시


{키 : 값 ...} 데이터가 모여있음
- 키 : "변수명"  
- 값 : 문자열, 숫자, 참거짓, 배열, object, 재귀 등이 들어감
[] 배열
{} 객체
제이슨방식으로 데이터를 교환함

프로그래밍에서 어떤 형식의 구조를 해석하는 것을 파싱(Parshing)한다고 함


● jsp

※ 복습
* 압축파일 jar , war
- war : 웹어플리케이션 압축파일
- jar : 자바실행 압축파일

 

* 태그
form : 서버와 통신하기 위해 필요
action : 전송하기 위한 주소
post/get : 보내는 방식
submit : 보내는 명령
양식태그 input : 양식은 바로 보내면 안됨

checkbox : 여러개 선택
radio : 하나만 선택

* 서블릿의 @WebServlet("/add")

- 해당 주소는 해당(add)클래스가 담당한다는 것을 알려줌
- HttpServlet(웹용 기능)를 상속받음 
- 서비스-화면을 가지지않음(=어플리케이션- 화면을 가짐)

- 뷰를 만들기 위한 서블릿

* request 정보가 수집이 됨
* response 결과물을 보내줌(outputstream으로 출력)


▶ 실습 

▷ jsp 파일 만들기
name : form.jsp (클래스 이름과 파일이름이 같아야함-권고)
<%-- --%> 가능하면 서버주석 이용하기

<%@ 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>
	<form action="Form" method="post">
		<!-- 이름 입력 -->
		이름 : <input type="text" name="name" size="10" /> <br>
		<!-- 아이디 입력 -->
		아이디 : <input type="text" name="id" size="10" /> <br>
		<!-- 비밀번호 입력 -->
		비밀번호 : <input type="password" name="pw" size="10"> <br>
		
		<!-- 취미 -->
		취미 : <input type="checkbox" name="hobby" value="read"> 독서
		<input type="checkbox" name="hobby" value="cook"> 요리
		<input type="checkbox" name="hobby" value="run"> 조깅
		<input type="checkbox" name="hobby" value="swim"> 수영
		<input type="checkbox" name="hobby" value="sleep"> 취침<br>
		
		<input type="radio" name="major" value="kor"> 국어
		<input type="radio" name="major" value="eng"> 영어
		<input type="radio" name="major" value="math"> 수학
		<input type="radio" name="major" value="des"> 디자인
		
		<!-- 서버로 전송 -->
		<input type="submit" value="전 송">		
	</form>
	
</body>
</html>

* input 태그는 화면에서 글씨 등을 입력할 수 있게 해줌
- type에 따라 입력 방식이 달라짐

* name은 request로 넘어오는 변수
- request는 브라우저(클라이언트)로부터 넘어오는 정보를 가지고 있음

 

▷서블릿 만들기 
- 패키지는 챕터로 구분 (choongang.web.jsp.ch2)
- 클래스 : Form(자바 클래스 이름이라 대문자)

next > next누르면
호출되면 바로 실행되는 메소드 설정 화면창

- get post는 동시에 일어나지 않으므로 doPost만 설정 > finish

-> doPost만 생성됨

* @WebServlet("/Form") jsp와 같아야함

 

* post 요청 처리구현
- actionDo() 메소드 만들어 요청 처리 -> 예외처리(던지기)
- 최상위로 해도 되나 IO로 처리하기

 * 요청을 처리하는 순서

 1. 데이터 호환을 위한 문자코드체계 설정(보통 UTF-8:유니코드)

request.setCharacterEncoding("UTF-8");

package choongang.web.jsp.ch2;

/**
 * Servlet implementation class Form
 */
@WebServlet("/Form")
public class Form extends HttpServlet {
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Form() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		actionDo(request, response);
	}
	
	protected void actionDo(HttpServletRequest request, HttpServletResponse response) throws IOException {
		// post 요청 처리구현
		/// 1. 데이터 호환을 위한 문자코드체계 설정(보통 UTF-8:유니코드)
		//  : 요청객체(=requset객체)의 문자코드체계 설정
		// request객체 : 데이터를 보내는 쪽(=요청하는 쪽 =웹브라우저(웹클라이언트)) 
		request.setCharacterEncoding("UTF-8");

}


 2. 요청브라우저의 요청값 분리 이 데이터를 바탕으로 비즈니스로직 전개

* getParameterValues 같은 값으로 여러개 넘어올때 사용
- 배열 처리에 사용
- 체크박스와 같이 여러개의 값이 있으면 사용

* getParameter 하나만 넘어오는 경우(단일변수)
- 데이터를 가지고옴
- 라디오버튼은 하나만 선택가능하여 단일변수로 처리

	동일 
    
    protected void actionDo(HttpServletRequest request, HttpServletResponse response) throws IOException {
		
        동일
        
        /// 2. 요청브라우저의 요청값 분리 이 데이터를 바탕으로 비즈니스로직 전개
		//  : 자바변수이름과 폼의 요청값 변수이름은 다르게 하는 것 추천(for 보안)
		String name = request.getParameter("name");
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		
		String[] hobbys = request.getParameterValues("hobby");
		String major = request.getParameter("major");
    }

 3. 비즈니스로직 실행 : 데이터 정제

	protected void actionDo(HttpServletRequest request, HttpServletResponse response) throws IOException {
		
        동일
        
		/// 3. 비즈니스로직 실행 : 데이터 정제
		//  : 데이터의 변환이 필요없으면 생략, 추후에 서비스로 분리됨
		User user = new User(name, id, pw, hobbys, major);
    }

 4. 처리된 결과를 이용하여 응답객체(뷰)에 데이터를 보내거나 다른 객체에 필터 또는 파이프 처리(후처리)

  4-1. 출력할 문자코드체계 설정
  4-2. 뷰 페이지 만들기 => HTML형식의 코드가 만들어진다.

* setContentType : 응답을 할때 지정되어야함
-> 웹브라우저가 데이터의 종류를 알 수 있음

	protected void actionDo(HttpServletRequest request, HttpServletResponse response) throws IOException {
		/// 4. 처리된 결과를 이용하여 응답객체(뷰)에 데이터를 보내거나 다른 객체에 필터 또는 파이프 처리(후처리)
		//  : 메소드로 분리	
		writeHtml(response, user);
		writeHtml(response, name, id, pw, hobbys, major);
	}
	public void writeHtml(HttpServletResponse response, User user) throws IOException {
		writeHtml(response,
				user.getName(),
				user.getId(),
				user.getPw(),
				user.getHobbys(),
				user.getMajor()
				);
	}
	public void writeHtml(
			HttpServletResponse response,
			String name,
			String id,
			String pw,
			String[] hobbys,
			String major ) throws IOException {
		// 4-1. 출력할 문자코드체계 설정
		// jsp스크립트 파일의 <%@ page contentType 태그와 같은 역할
		response.setContentType("text/html; charset=utf-8");
		// 4-2. 뷰 페이지 만들기 => HTML형식의 코드가 만들어진다.
		// 		HTML 코드가 웹브라우저(=웹클라이언트)로 보내짐
		// 		백엔드서버는 HTML코드를 만드는 것이지 HTML코드를 실행하는 것이 아님
		// 		HTML코드를 실행하는 책임은 웹브라우저 렌더링 코어에 있음
		// 웹브라우저로 전송할 출력스트림(OutputStream)필요
		// 문자출력스트림 필요
		// 출력스트림 작업중에 발생한 예외는 밖으로 던짐(throws)
		// response객체는 PrintWriter라는 문자 출력스트림이 있음
		PrintWriter writer = response.getWriter();
		// 실제 코드문자열 출력
		// 단순히 각 내용을 추가했습니다.
		/*
		writer.println("<html>");
		writer.println("<head>");
		writer.println("</head>");
		writer.println("<body>");
		writer.println("	이름 : " + name + "<br/> ");
		writer.println("	아이디 : " + id + "<br/> ");
		writer.println("	비밀번호 : " + pw + "<br/> ");
		writer.println("	취미 : " + Arrays.toString(hobbys) + "<br/> ");
		writer.println("	전공 : " + major + "<br/> ");
		writer.println("</body>");
		writer.println("</html>");
		*/
        
        // 위 주석의 내용을 간단하게 변경
		String htmlMsg = """
			<html>
				<head>
				</head>
				<body>
					이름 : %s <br />
					아이디 : %s <br />
					비밀번호 : %s <br />
					취미 : %s <br />
					전공 : %s <br />
				</body>
			</html>	
		 """.formatted(
				 name,
				 id,
				 pw,
				 Arrays.toString(hobbys),
				 major);
		writer.print(htmlMsg);

		// 마쳤으면 출력스트림 종료
		writer.close();
	}

- response에 우리가 만든 데이터를 넘기기
- 네트워크는 에러가 발생할 수 있으므로 throws ServletException, IOException

- 텍스트 블럭으로 편하게 작성하기
-> 내용은 마지막 따옴표를 기준으로 들여쓰기

- 자바에서 템플릿 문자열을 구현하기 위해서는 replace메소드나 formatted메소드를 활용해야함

 

▷ import

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 choongang.web.jsp.ch2.domain.*;

 

▷ User 클래스 만들기

* DTO의 역할

- request에서 정보를 가져와서 클래스에 담아서 디비로 전달하고 디비에서 다시 클래스로 담아서 뷰로 전달을 하는 구조

 


(참고)클래스에의해 객체가 힙에 생성되면 또 다른 장소에 객체를 보관함

package choongang.web.jsp.ch2.domain;

public class User {
	private String name;
	private String id;
	private String pw;
	
	private String[] hobbys;
	private String major;

	// 생성자
	public User(
			String name,
			String id,
			String pw,
			String[] hobbys,
			String major) {
		
		setAllMember(name, id, pw, hobbys, major);
	}
	// setter | getter 메소드
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public String[] getHobbys() {
		return hobbys;
	}
	public void setHobbys(String[] hobbys) {
		this.hobbys = hobbys;
	}
	public String getMajor() {
		return major;
	}
	public void setMajor(String major) {
		this.major = major;
	}
	
	public void setAllMember(
			String name,
			String id,
			String pw,
			String[] hobbys,
			String major) {

		this.name = name;
		this.id = id;
		this.pw = pw;
		this.hobbys = hobbys;
		this.major = major;
	}
	
}

* 디버그 
중단점 :
Form.java  : User user = new User(name, id, pw, hobbys, major);
User 클래스 : this.name = name;
Form.java  : response.setContentType("text/html; charset=utf-8");

디버그 온 서버
화면에 내용 작성하고 전송하면 sts에 디버그가 뜸

디버그를 마치면 서버 화면이 변경됨

▷ form.jsp에서 Run as

입력한 값이 서버로 받아짐


◎ jsp 서블릿 기초태그
지시자 : <%@ %> 페이지 속성
선언 : <%! %> 변수, 메소드 선언(멤버 영역으로 페이지 전체에서 사용할 수 있음)
표현식 : <%= %> 결과값 출력
스크립트릿 : <% %> JAVA코드
액션태그 : <jsp:action> </jsp:action> 자바빈 연결

 

▶ 기초태그 연습
* jsp 파일 : ch3-1.jsp

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

<%-- p는 하드코딩된 정적영역 --%>
<p>
안녕하세요
안녕하세요
안녕하세요
안녕하세요
안녕하세요
</p>
<%-- 스크립트릿 --%>
<p>
<%
	String say = "안녕하세요";
	//msg변수는 html코드 출력으로 나갈것이므로 지금은 null보다는 공백("")이 더 적합함
	String msg = ""; 
	for(int i = 1; i <= 6; i++) {
		//out.println("<h" + i + ">안녕하세요</h" + i + ">");
		// 이전 msg변수의 값에다 새로운 html코드를 추가하고 그 문자열을 새로 msg변수에 대입
		msg = msg + "<h" + i + ">안녕하세요</h" + i + ">";
	}	
%>
	<%= msg %>
</p>

<%-- 자바(jsp)가 만들어서 동작해낸 결과물, 표현식 --%> 
<h<%= 1 %>>안녕하세요</h<%= 1 %>>
<h<%= 2 %>>안녕하세요</h<%= 2 %>>
<h<%= 3 %>>안녕하세요</h<%= 3 %>>
<h<%= 4 %>>안녕하세요</h<%= 4 %>>
<h<%= 5 %>>안녕하세요</h<%= 5 %>>
<h<%= 6 %>>안녕하세요</h<%= 6 %>>

</body>
</html>
<%@ 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>
<%!
	// 선언문은 전체 페이지에서 재사용이 가능한 객체 멤버 코드
	// 선언부 = 자바클래스 멤버변수와 멤버 메소드와 같은 기능
	int i = 10;
	String str = "abc";
	
	private int sum(int a, int b) {
		return a + b;
	}
%>
<%-- 표현식 --%>
<%= i %> <br />
<%= str %> <br />
<%= sum(1,5) %> <br />

<%-- 표현식이 얼마나 편리한지 다음 코드와 비교해보기 --%>
<!-- 서버태그 밖에서(정적내용) 클라이언트 주석과 -->
<%-- 서버주석이 공존한다 --%>
<%
// 서버태그 안에서는 자바주석 사용
// 스크립트릿 : 지역 코드 = 여기서만 쓸 수 있는 일회성 코드
// 간단한 계산이나 지역루프 등에 활용
// 표현식의 '=' => out.println(값);
// out : writer 스트림을 의미(문자 출력스트림)
out.println(i + "<br />");
out.println(str + "<br />");
out.println(sum(1,5) + "<br />");
%>

<%= 10 %> + <%= 20 %> = <%= sum(10, 20) %>
<%-- 서블릿으로 변경 --%>
<%
// 위의 JSP 표현식태그 코드를 서블릿 방식으로 변환하기
// jsp는 내부적으로 내부객체라는 익명객체가 몇개 있다
// 그 중 하나가 response로부터 출력스트림을 만들어 가지고 있습니다.
// 이 출력스트림(HTML코드 문자를 다루므로 실제는 문자출력스트림)의 변수이름이 out입니다.
out.println(" 10 " + " + " + " 20 " + " = " + 
			sum(10, 20));
%>
</body>
</html>

out.println(값);은 표현식<%= %>으로 작성 가능.

* (참고)톰캣은 jsp에서 var를 지원해주지않아서 500에러 발생함

- JSP에서는 var 실행시 컴파일하는 기능이 없음


* 자바스크립트
이름 = `name = ${name}, 이름 = ${이름 + "입니다."}`
${} 변수를 담음
콘솔창은 로그가 자동으로 나옴