230427 마흔 다섯 번째 수업_JSP,Servlet

mary·2023년 4월 27일
0

국비 수업

목록 보기
45/72
post-thumbnail

forward 예시 하나 더

--html파일(첫번째)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form method="post" action="08.2.action_forward_blood.jsp">
		<h3>혈액형으로 보는 성격테스트</h3>
		이름: <input name="name"></p>
		당신의 혈액형은?</p>
		<input type="radio" name="bloodType" value="A">A형<br>
		<input type="radio" name="bloodType" value="B">B형<br>
		<input type="radio" name="bloodType" value="O">O형<br>
		<input type="radio" name="bloodType" value="AB">AB형<br>
		<input type="submit" value="보내기">
	</form>
</body>
</html>


--두번째 jsp파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");
	String name = request.getParameter("name");
	String bloodType = request.getParameter("bloodType");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<jsp:forward page='<%=bloodType + ".jsp" %>'>
		<jsp:param value="<%=name %>" name="name"/>
		<jsp:param value="<%=bloodType %>" name="bloodType"/>
	</jsp:forward>
</body>
</html>

--A형 jsp파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String name = request.getParameter("name");
	String bloodType = request.getParameter("bloodType");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3><%=name %>님의 혈액형은 <%=bloodType %>형</h3>
	<p>
		A형입니다
	</p>
</body>
</html>

--다른 혈액형들은 p태그의 내용만 다르고 코드들은 똑같음


"name"에 들어있는 값을 name변수에 넣고
"bloodType"에 들어있는 값을 bloodType 변수에 넣는 것!
name값과 value값 혼동하지 않기




잘 안 써서 이런 것도 있구나 하고 넘어가기!
공식문(ex. <%, <%= ...)이 있는데 굳이 쓰진 않음

<%@ 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>
	<%-- <%! 선언문 %> --%>
	<jsp:declaration>
		public int max(int x, int y) {
			return x > y ? x : y;
		}
	</jsp:declaration>
	
	<%-- <% 스크립트릿 %> --%>
	<jsp:scriptlet>
		int num1 = 10;
		int num2 = 20;
	</jsp:scriptlet>
	
	<%-- <%= 표현식 %> --%>
	첫번째 값 <jsp:expression>num1</jsp:expression>과 
	두번째 값 <jsp:expression>num2</jsp:expression>중 큰 수는?<br>
	<jsp:expression>max(num1, num2)</jsp:expression>
</body>
</html>


plugin, useBean


useBean은 자바 Bean 파일을 사용할 때 빈에 들어있는 값을 얻어오거나 값을 넣어줄 때 사용



내장객체:

jsp에서 이미 가지고 있는 내부 객체이므로 선언하지 않고 사용 가능

내부객체 종류:


패키지명과 이름으로 구성되어 있음


내부객체의 공통 메소드

내부객체에서 공통적으로 사용할 수 있음


request 내부객체:

사용자가 넣은 값을 request에 담아서 얻어오는 방법

--html파일
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>request Ex1</h1>
	<form method="post" action="01.2.request.jsp">
		이름: <input name="name"><p/>
		학번: <input name="studentNum"><p/>
		성별: <input type="radio" name="gender" value="man">남자
			 <input type="radio" name="gender" value="women" checked>여자
		학과: <select name="major">
			<option value="국문학과">국문학과</option>
			<option value="영문학과">영문학과</option>
			<option value="수학과">수학과</option>
			<option value="컴퓨터학과">컴퓨터학과</option>
			<option value="정치학과">정치학과</option>
		</select>
		<br>
		<input type="submit" value="서버로 전송">
	</form>
</body>
</html>



--jsp파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");
	String name = request.getParameter("name");
	String studentNum = request.getParameter("studentNum");
	String gender = request.getParameter("gender");
	String major = request.getParameter("major");
	
	if(gender.equals("man"))
		gender = "남자";
	else
		gender = "여자";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	이름: <%=name %><p/>
	학번: <%=studentNum %><p/>
	성별: <%=gender %><p/>
	학과: <%=major %>
</body>
</html>

--html파일
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Request MultiParam Ex</h1>
	<form method="post" action="02.2.request.jsp">
		취미를 고르세요<p/>
		<input type="checkbox" name="hobby" value="운동">운동<br>
		<input type="checkbox" name="hobby" value="게임">게임<br>
		<input type="checkbox" name="hobby" value="넷플">넷플<br>
		<input type="checkbox" name="hobby" value="음악감상">음악감상<br>
		<input type="checkbox" name="hobby" value="독서">독서<br>
		<input type="submit" value="서버로 전송">
	</form>
</body>
</html>



--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>
<%
	request.setCharacterEncoding("utf-8");
	String hobby[] = request.getParameterValues("hobby"); 
	//getParameter는 request가 값 여러개를 받아오면 하나의 값만 가져오는 것
	//getParameterValues는 여러개 가져오는 것(변수를 배열로 받아야 여러개 가져올 수 있음)
	/*
	out.print("당신의 취미는 ");
	for(int i=0; i<hobby.length; i++) {
		out.print(hobby[i] + ", ");
	}
	out.print("입니다");
	*/
%>
	당신의 취미는
<%
	for(int i=0; i<hobby.length; i++) {
%>
		<%=hobby[i] %>, <!-- 이 부분은 html이어서 컴마 밖으로 빼도 됨 -->
<%
	}
%>
	입니다
</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>
	<%
		String protocol = request.getProtocol();
		String serverName = request.getServerName();
		int serverPort = request.getServerPort();
		String remoteAddr = request.getRemoteAddr();
		String remoteHost = request.getRemoteHost();
	%>
	<h1>Request 내장 메소드</h1>
	프로토콜: <%=protocol %><p/>
	서버이름: <%=serverName %><p/>
	서버의 포트번호: <%=serverPort %><p/>
	클라이언트 컴퓨터 주소: <%=remoteAddr %><p/>
	클라이언트 컴퓨터 이름: <%=remoteHost %><p/>
	요청 경로(URL): <%=request.getRequestURL() %><p/>
	요청 경로(URI): <%=request.getRequestURI() %><p/>
	<%="현재 사용하는 브라우저: " + request.getHeader("User-Agent") + "<p/>" %>
	<%="브라우저가 사용하는 파일 타입: " + request.getHeader("Accept") + "<p/>" %>
</body>
</html>

결과


response 내부객체


원래는 네트워크를 통해서 서버에 접속하지만 cache가 중간에 위치하면 cache에 잠깐 넣어놓고 교통량을 보고 서버에 전달해줌

--첫번째 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>
	<h1>Response Ex</h1>
	<h3>sendRedirect</h3>
	<%
		response.sendRedirect("04.2.response.jsp");
	%>
</body>
</html>


--두번째 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>
<%
	if(request.getProtocol().equals("HTTP/1.0")) {
		response.setHeader("pragma", "no-cache"); // http 1.0ver
	} else if(request.getProtocol().equals("HTTP/1.1")) {
		response.setHeader("Cache-Control", "no-store"); // http 1.1ver
	}
%>
	04.2.response.jsp파일입니다
</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>
<%
	response.sendRedirect("https://www.kh-academy.co.kr/main/main.kh");
	//입력한 주소값으로 바로 가게 됨
%>
</body>
</html>

out 내부객체

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" buffer="5kb" %>
    <!-- 버퍼 사이즈 변경하면 용량도 변함 기본값 8kb -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Out Ex</h1>
	<%
		int totalBuffer = out.getBufferSize();
		int remainBuffer = out.getRemaining();
		int useBuffer = totalBuffer - remainBuffer;
	%>
	현재 페이지의 buffer 상태<p/>
	출력 Buffer의 전체 크기: <%=totalBuffer %>byte<p/>
	남은 Buffer의 크기: <%=remainBuffer %>byte<p/>
	현재 Buffer의 사용량: <%=useBuffer %>byte
</body>
</html>



-http(네트워크 통신)은 저장공간이 없고 통신만 하기 때문에 session을 이용하여 다른 페이지로 넘어갈 때도 로그인이 된 상태를 유지하여 넘어갈 수 있게 함

-로그인된 정보는 session의 고유번호(=고유ID)를 부여하여 항상 따라다니면서 서버를 드나들며 상태를 유지하게 함

-session의 유지시간(마우스도 움직이지 않는 상태) 기본값은 30분임 => 시간이 지나면 로그인이 자동으로 풀림


--html파일(첫번째)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Session Ex1</h1>
	<form method="post" action="07.2.session.jsp">
		ID: <input name="id"><p/>
		PW: <input type="password" name="pwd"><p/>
		<input type="submit" value="로그인">&emsp;
		<input type="reset">
	</form>
</body>
</html>


-두번째 jsp파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");
	String id = request.getParameter("id");
	String pwd = request.getParameter("pwd");
	
	session.setAttribute("idKey", id);
	session.setMaxInactiveInterval(60*5); 
	//5분동안 유지, 기본값으로 하려면 아예 이 구문을 쓰지 않음
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form method="post" action="07.3.session.jsp">
	1. 가장 좋아하는 계절은?<p/>
		<input type="radio" name="season" value=""><input type="radio" name="season" value="여름">여름
		<input type="radio" name="season" value="가을">가을
		<input type="radio" name="season" value="겨울">겨울<p/><p/>
	
	2. 가장 좋아하는 과일은?<p/>
		<input type="radio" name="fruit" value="사과">사과
		<input type="radio" name="fruit" value="딸기">딸기
		<input type="radio" name="fruit" value="포도">포도
		<input type="radio" name="fruit" value="멜론">멜론<p/><p/>
		
		<input type="submit" value="전송">
	</form>
</body>
</html>


--세번째 jsp파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");
	String season = request.getParameter("season");
	String fruit = request.getParameter("fruit");
	
	String id = (String)session.getAttribute("idKey");
	//원래 session은 Object형이기 때문에 String으로 넣으려면 강제형변환 해야 됨
	String sessionId = session.getId();
	//서버측에서 클라이언트가 접속하면 고유한 세션 Id를 부여함
	int intervalTime = session.getMaxInactiveInterval();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%	//세션 유지기간 끝나면 null값이 됨
		if(id != null) {
	%>
		<h1>Session Ex</h1>
		<%=id %>님이 좋아하는 계절과 과일은 <%=season %>과 <%=fruit %> 입니다.<p/>
		세션 ID: <%=sessionId %><p/>
		세션유지시간: <%=intervalTime %>초<p/>
	<% 		
			session.invalidate(); //세션 끊기
		} else {
			out.print("세션 시간이 경과하였거나 다른 이유로 연결할 수 없습니다");
		}
	%>
</body>
</html>


application 내부객체

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String serverInfo = application.getServerInfo();
	String mimeType = application.getMimeType("01.1.request.html");
	
	// url 경로명
	String appPath = application.getContextPath();
	
	//웹애플리케이션 루트에 대한 로컬상의 실제 경로
	String realPath = application.getRealPath("/");
	
	application.log("application 내부 객체 로그 테스트");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Application Ex</h1>
	서블릿 컨테이너의 이름과 버전: <%=serverInfo %><p/>
	01.1.request.html 파일의 MIME Type: <%=mimeType %><p/>
	웹 애플리케이션의 url 경로명: <%=appPath %><p/>
	로컬 파일 시스템의 경로: <%=realPath %>
</body>
</html>


workspace에서 이클립스를 실행하고 있지만 실질적으로 파일들을 저 위치에 존재함


pageContext 내부객체

잘 안 씀

이런식으로 더 붙여서 써야되기 때문


config 내부객체

잘 안 씀

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!-- 자바에 있는 모든 클래스들을 임포트 시켜야 Enumeration 오류 안 남-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Config Ex</h1>
	<table border="1">
		<tr>
			<td>초기 파라미터 이름</td>
			<td>초기 파라미터 값</td>
		</tr>
	<%
		Enumeration e = config.getInitParameterNames();
	//getInitParameterNames(이름 모두 가져옴)가 Enumeration 자료형임
		while(e.hasMoreElements()) {
			String initParamName = (String)e.nextElement();
	%>
		<tr>
			<td><%=initParamName %></td>
			<td><%=config.getInitParameter(initParamName) %></td>
		</tr>
	<%
		}
	%>
	</table>
</body>
</html>

pageInfo 내부객체

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" info="JSP Program"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	현재 페이지의 정보: <%=this.getServletInfo() %>
</body>
</html>



서블릿(Servlet)

HttpServlet을 상속하면 Servlet, GenericServlet 모두 사용 가능

서블릿의 클래스의 메소드


jsp에서 <%!선언문으로 저렇게 만들면
인스턴스 변수(멤버변수)로 저렇게 클래스 바로 밑에 선언돼서 들어가게 됨

스크립트릿으로 하면 메소드 안에 지역변수가 만들어짐

package servlet1;

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;

@WebServlet("/servletTest")
public class servletTest extends HttpServlet {
	// jsp에서 선언문의 변수와 메소드는 이곳에 만들어짐
	// <%! int num, void method() {};>
	/*
	 int num;
	 void method() {
	 } 
	 */

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//프로그래밍은 여기서
		//jsp에서 스크립트릿으로 선언한 변수는 이곳에 만들어짐
		// <% int num2 = 0; %>
		/*
		 int num2 = 0;
		 */
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.print("<html>");
		out.print("<body>");
		out.print("<h1>서블릿으로 html문서 만들기</h1>");
		out.print("</body>");
		out.print("<html>");
	}

}


라이프 사이클

* 자바 파일 이름 수정할 때 f2보단
파일 우클릭 - refactor - rename


package servlet1;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/ServletTest2")
public class ServletTest2 extends HttpServlet {

	public void init(ServletConfig config) throws ServletException {
		//서블릿 최초로 객체가 생성될 때 한 번 호출
		System.out.println("init() 호출");
	}

	public void destroy() {
		// 서블릿이 삭제될 때 한 번 호출
		System.out.println("destroy() 호출");
	}

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 클라이언트가 요청이 있을 때마다 호출
		System.out.println("service() 호출");
	}
}

호출을 계속하려면 웹페이지를 새로고침하면 되고 destroy 삭제하려면 코드에서 아무 출력문이나 수정하고 저장하면 자동으로 실행됨


jsp와 Servlet 연결(get 메소드를 이용하여)

--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>
	<h1>Get Servlet방식</h1>
	<form method="get" action="GetServlet"> 
	<!-- 서블릿 파일에서 맵핑(@)에 넣은 값을 action으로 넣어줌 -->
		msg: <input name="msg"><p/>
		<input type="submit" value="전송">
	</form>
</body>
</html>
--servlet파일
package servlet1;

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;

@WebServlet("/GetServlet")
public class GetServlet3 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String msg = request.getParameter("msg");
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.print("<html>");
		out.print("<body>");
		out.print("<h1>Method Get Servlet 방식</h1>");
		out.print("<h3>메시지: " + msg + "</h3>");
		out.print("</body>");
		out.print("</html>");
	}
}

jsp의 server.xml에서 connector 태그를 찾아
URIEncoding="UTF-8" 값을 넣어주고 저장해야 서로 연결됨

결과

profile
내 인생을 망치러 온 나의 구원, 개발

0개의 댓글