WAS/WAS수업

#48. Servlet (POST방식) / JSP / error시 띄어줄 페이지만들기

열하나요 2023. 9. 7. 14:05

48-1. 1_Servlet 

순서가 너무 헷갈린다!!!  

 

0-0) 서버를 만들고

0-1) New Dynamic Web Project 생성

0-2) 서버를 켠다!! (Server탭의 서버에서 우클릭 후 add and remove로 프로젝트 add해줌)

 

1. html File

1-1) view에서 동적화면 작성을 한 후  a태그와 같은 요소로 지정된 주소(href속성) 경로 이동~

 

저번에는 Servlet을 만들어서 거기서 화면도 만들고 입력값도 받아오고  Stream을 통해 out.print 출력도 해줬음

Servlet은 Controller의 역할만 하고!!!!! JSP에서 일을 분담해준다~~

(JSP는 화면을, Servlet에서 응답할 로직을 만들어줌 )

***Servlet이 Controller고, JSP가 View 역할인 듯

 

Tomcat은 Servlet container에 Servlet의 classes를 가지고 있음!!!

 

2. JSP File

JAVA언어로 HTML을 작성할 수 있다

2-1) 저번에는, 문서형태와 문자셋을 설정해주었는데 JSP파일을 생성하면 자동으로 해준다~

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

( + )객체 쓰려면 여기에 import 직접 해줘야 함!

 

( + ) clude 하면~ 그 파일을 읽어줌!

현재의 JSP 파일에다 다른 파일(JSP, HTML)을 포함시켜 사용을 할 수 있다.

<%@ include file="01_ScriptingElement.jsp" %>

 

2-2) 화면을 보여주고 사용자에게 입력값을 받는다. (submit하면 action값 경로로 전송)

 

3. Servlet 생성

3-0) Servlet 생성 시 @WebServlet("/ action값의 경로로 들어올 주소 ")

 

3-1) 전달한 값 중에 한글이 있을 경우 인코딩 처리(POST방식일 경우)

인코딩 설정 : request.setCharacterEncoding("UTF-8");

 

3-2) 요청 시 전달한 값을 뽑기!! 및 데이터 가공 처리 => 변수에 기록

request.getParameter("키") : String형의 값
request.getParameterValues("키") : String[]

 

3-3) 요청 처리 (화면으로 전송)            

 

3-4) 요청 처리 후 사용자가 보게 될 응답페이지 만들기 또는 JSP에게 위임

request의 attribute라는 영역에 응답페이지에 필요한 값 담기

=> request.setAttribute("nickName", nickName);

RequestDispatcher객체 생성(위임할 JSP파일의 경로 기술)

=> RequestDispatcher view = request.getRequestDispatcher("경로.jsp");

전달
view.forward(request, response);

 

4. JSP File

Servlet이 처리한 값을 사용자에게 보여줄 화면 

JAVA 언어를 쓰려면 <% %> <%= %>를 사용한다.

 

>> post방식

1. WebContent > index.html

<body>영역에 추가

<h3><a href="view/requestTest_Post.html">Post방식 테스트</a></h3>

 

2. WebContent > view > requestTest_Post.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>안녕 나는 포스트야</title>
</head>
<body>

	<h1>POST방식으로 요청 후 응답페이지 받아보기</h1>
	
	<p>
		특징.
		1. POST방식으로 요청하면 BODY영역에 데이터를 포함시켜서 요청 <br>
		=> 사용자가 입력한 값(데이터)들이 URL에 노출되지 않음 <br>
		=> 보안유지가 가능함
		=> 즉, 로그인이나 회원가입 같은 경우 POST방식이 적합함 <br><br>Web을 배워봅시다~
		
		2. BODY영역은 전송하는 길이에 제약이 없음 <br>
		=> 즉, 게시글 작성 같은 경우 POST방식이 적합함 <br><br>
		
		3. 즐겨찾기 불가능하지는 않지만 전달되는 데이터가 URL에 노출되지 않기 때문에 
		=> 기존에 봤던 응답화면을 볼 순 없음 <br><br>
		
		4. 최대 요청받는 시간이 존재함
	</p>

	<!--  localhost:8888/1_Servlet/test2.do  -->
	
	<form method="post" action="/1_Servlet/test2.do">
		<ul>
			<li>
				이름 : <input type="text" name="name">
			</li>
			<li>
				성별 : 
				남자 <input type="radio" name="gender" value="M">
				여자 <input type="radio" name="gender" value="F">
			</li>
			<li>
				나이 : <input type="number" name="age">
			</li>
			<li>
				사는 도시 : 
				<select name="city">
					<option>서울시</option>
					<option>경기도</option>
					<option value="GW">강원도</option>
					<option>충청도</option>
					<option>전라도</option>
					<option>경상도</option>
					<option>제주도</option>
				</select>
			</li>
			<li>
				키 : <input type="range" name="height" min="140" max="200">
			</li>
			<li>
				좋아하는 음식(모두 고르시오):
				빵 <input type="checkbox" value="빵" name="food">
				치킨 <input type="checkbox" value="치킨" name="food">
				피자 <input type="checkbox" value="피자" name="food">
				곱창 <input type="checkbox" value="곱창" name="food">
				아귀찜 <input type="checkbox" value="아구찜" name="food">
				샤브샤브 <input type="checkbox" value="샤브샤브" name="food">
				떡볶이 <input type="checkbox" value="떡볶이" name="food">
				까르보나라 <input type="checkbox" value="까르보나라" name="food">
				갈비탕 <input type="checkbox" value="얼큰갈비탕" name="food">
			</li>
			<li>
				<input type="submit">
				<input type="reset">
			</li>
			
		</ul>
	</form>	
	

</body>
</html>

 

3.  com.kh.controller > RequestPostServlet.java

>> view 폼태그의 액션값과 controller의 URL매핑 주소가 같아야 함

<form method="post" action="/1_Servlet/test2.do">

@WebServlet("/test2.do")

package com.kh.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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 RequestPostServlet
 */
@WebServlet("/test2.do")
public class RequestPostServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public RequestPostServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		// doPost에서 작업해도 어차피 이쪽으로 오기 때문에 여기서 작업해~
		
		// System.out.println("확인해보셔야죠~");
		
		// 1. 데이터 가공
		// 2. 응답화면 지정
		
		// 0단계 ) 
		// POST방식의 기본 인코딩 설정 ISO-8859-1 이상한 애로 설정
		// POST방식 일때만 값을 뽑기전에 미리 UTF-8방식으로 인코딩 설정을 진행해야 함!!
		request.setCharacterEncoding("UTF-8");
		
		
		
		// 1단계 )
		// request.getParameter() 또는 request.getParameterValues()로 값 뽑아내기
		String name = request.getParameter("name"); // : String
		// í = 홍
		String gender = request.getParameter("gender");
		int age = Integer.parseInt(request.getParameter("age"));
		String city = request.getParameter("city");
		Double height = Double.parseDouble(request.getParameter("height"));
		String[] foods = request.getParameterValues("food");
		
		
		System.out.println(name);
		System.out.println(gender);
		System.out.println(age);
		System.out.println(city);
		System.out.println(height);
		
		if(foods == null) {
			System.out.println("없음");
		} else {
			/*
			for(int i = 0; i < foods.length; i++) {
				System.out.println(foods[i]);
			}
			*/
			System.out.println(String.join("-", foods));
		}
		
		// 2단계
		// 처리 -> Service -> DAO -> DB
		
		// ArrayList / int / VO
		
		// 3단계
		// 응답데이터
		// 3_1. JSP이용해서 응답페이지 만들기
		// JSP(JAVA Server Page) 비스므리한 친구들로는 PHP / ASP
		// (젤빠름)                          /  (젤쉬움) / (망함. 윈도우에서만 돌아감)
		// 자바로 HTML쓰는 애
		
		// 응답화면(JSP)에서 필요한 데이터를 보내줄 것(request에 담아서)
		// Parameter영역은 getParameter("OOO") / setParameter가 없음.. 얘는 없음
		// request에 attribute영역이 있음 => 키-밸류 세트로 묶어서 담을 수 있음
		// request.setAttribute(키, 밸류); : 밸류가 Object(모든 값을 받기 위해서 => 다형성 적용)
		
		request.setAttribute("name", name);
		request.setAttribute("age", age);
		request.setAttribute("gender", gender);
		request.setAttribute("city", city);
		request.setAttribute("height", height);
		request.setAttribute("foos", foods);
		
		request.setAttribute("msg", "조회를 성공하셨습니다~");
		
		// 3_2. 현재 작업중인 doGet()에서 응답페이지를 만드는 과정을 위임해야 한다!
		// 응답페이지를 JSP에게 위임(전달하기)
		
		// 위임 시 필요한 객체 : RequestDispatcher
		// 1) 응답하고자 하는 뷰(JSP) 경로를 지정! request.getRequestDispatcher("JSP경로");
		// CPU는 한가지 일만 할 수 있는데, ready상태일 때만 일을 한다. 대기상태에서 준비상태로 만들어주는 디스패칭을 해주는 애
		RequestDispatcher view = request.getRequestDispatcher("view/responsePage.jsp");
		
		// 2) forwarding : forward()  // 전달해주는 애
		view.forward(request, response);
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

4.  WebContent > view > responsePage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// 이 구문을 스크립틀릿(scriptlet)이라고 해서 자바코드를 쓸 수 있는 영역
	// System.out.println("또 뻥치냐~~~~~~~~~~~~~~~~~?");

	// 현재 이 JSP파일에 필요한 데이터들 => request객체의 attribute영역에 담겨있음!!
	
	// request.getAttribute("키값")
	
	// 위에서 부터 읽어내려가기 때문에 쓸 변수는 맨 위에 생성해주고 간다.
	String name = (String)request.getAttribute("name");
	int age = (int)request.getAttribute("age");
	String gender = (String)request.getAttribute("gender");
	String city = (String)request.getAttribute("city");
	double height = (double)request.getAttribute("height");
	String[] foods = (String[])request.getAttribute("foods");
	
	String msg = (String)request.getAttribute("msg");
	
	
	// System.out.println(name);



%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h1>개인정보 응답화면~</h1>
	<!-- jsp는 java와 다르게 실행버튼을 다시 안눌러도 바로 반영됨 -->
	
	<span><%= name %></span>님은<br>
	<span><%= age %></span>살이며, <br>
	<span><%= city %></span>에 삽니다. <br>
	
	키는 <span><%= height %></span>cm 이고 <br>
	
	성별
	<% if(gender == null) { %>
		<!--  성별을 선택 안했을 경우 -->
		<span>선택을 안했습니다.</span><br>
	<% } else { %>
		<% if(gender.equals("M")) { %>
			<!--  남자 선택 -->
			<span>남자</span>입니다.<br>
		<% } else { %>
			<!--  여자 선택 -->
			<span>여자</span>입니다.<br>
		<% } %>
	<% } %>
	
	
	좋아하는 음식
	<% if(foods == null) { %>
		<!--  체크를 안했을 경우 -->
		
	<% } else { %>
		<!--  체크를 했을 경우 -->
		<ul>
		<% for(int i = 0; i < foods.length; i++) { %>
			<li><%= foods[i] %></li>
		<% } %>
		</ul>
		입니다.
	<% } %>
	

</body>
</html>

 

 

 

 

 

48-2. 2_JSP

include : header/footer 가져오는 용도로 많이씀!

(view에는 연산을 적게 하는 게 좋다??)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

48-3. error500 페이지

1. 에러가 뜨면 보여줄 jsp파일 만들어주기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ㅈㅅ;;;;;;;;;;;</title>
<style>
	h1{
		text-align : center;
		color : red;
		margin-top : 200px;
	}
</style>
</head>
<body>

	<h1>문제가 발생했어요!!!!!!!!!!!!!</h1>

</body>
</html>

2. web.xml에 error-page추가하기

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>2_JSP</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  
  <error-page>
  	<error-code>500</error-code>
  	<location>/view/error500.jsp</location>
  </error-page>
  
</web-app>

 

 

 

 

* JSP를 실행할 때는 서버를 다시 시작하지 않아도 됨.