본문 바로가기
JSP/Java Script

2024_07_11_목

by 알케니브 2024. 7. 11.

오늘의 코딩순서

(폴더: och04)

  • application.jsp
  • colot.html+ color.jsp
  • doWhile.jsp + for2.jsp(앞의 do-while문을 for문으로 변경)
  • member.html + member.jsp
  • request.jsp

(폴더: och05) (error에 관한 경우의 수는 num2부터 참고하기!)

  • num1.html + Cal.java + Cal2.java +  Cal3.java + error.jsp
  • gugu.html + gugu.jsp
  • name.html + name.jsp + error2.jsp
  • num2.html + num2.jsp
  • num2.html + cal1.jsp(현장HW) + cal2.jsp(현장HW) + cal3.jsp(현장HW) + cal4.jsp 

(폴더: error + 05폴더의 num2.html과 cal5.jsp를 이용하여 error 발생 및 error 페이지로 이동시키기

  • cal5.jsp + web.xml
  • errorArithmetic.jsp
  • errorNumFormat.jsp

오늘의 코딩

(폴더: och04)

  • application
    Tip)
    • application: 서블릿의 버전을 알고 싶을 때 사용
    • major: 서블릿의 버전에서 소숫점 앞자리
    • application.getMajorVersion: 웹 애플리케이션의 서블릿 스펙의 주요 버전을 확인하거나, 특정 기능을 지원하는지 여부를 판단하는 용도로 사용됨
    • minor: 서블릿의 버전에서 소숫점 뒷자리, 큰 틀의 기능보다는 삭제 같은 자잘한 기능
    • application.getMinorVersion: 웹 애플리케이션의 서블릿 스펙의 부가 버전 번호를 반환
      주로 웹 애플리케이션이 실행 중인 서블릿 컨테이너의 부가 버전을 확인하거나, 특정 기능을 지원하는지 여부를 판단하는 데 사용됨
      • 서블릿 컨테이너?
        • 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 함 ex) 톰캣
        • 주로 서블릿 객체를 생성, 초기화 호출, 종료하는 생명주기를 관리함
          여기서 서블릿 객체는 Singleton으로 관리됨
        • JSP도 서블릿으로 변환되어 상요됨
        • 동시 요청을 위한 멀티 스레드(Multi-thread) 처리를 지원
    • ⭐⭐⭐"/" : 웹 애플리케이션의 루트 경로를 나타냄
      • /WEB-INF/: 이 디렉터리에는 웹 애플리케이션의 구성 파일과 클래스 파일이 위치함
        /WEB-INF/web.xml 파일은 배치 서술자로서 웹 애플리케이션의 구성을 정의함
      • /index.html: 웹 애플리케이션의 루트에 위치한 정적 HTML 파일임
      • /servlets: 서블릿 클래스가 위치하는 디렉터리임
    • getRealPath: 웹 애플리케이션의  루트 경로를 실제 파일 시스템의 경로로 반환하는 메소드
      웹 애플리케이션 내에서 특정 파일이나 디렉터리의 절대 경로를 얻고자 할 때 사용됨
<%@ 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 info = application.getServerInfo();
	int major = application.getMajorVersion();
	int minor = application.getMinorVersion();
	String path = application.getRealPath("/");
%>
	<h2>Application 내장객체</h2>
	웹 컨테이너의 이름과 버전 :
	<%=info %>
	서블릿의 버전:	<%=major %>.<%=minor %>	<p>
	웹 어플리케이션 폴더의 로컬 시스템 경로: <%=path %>
</body>
</html>

 


  • color.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>좋아하는 색은?</h2>
<form action="color.jsp">
	빨강<input type="radio"	name="color" value="0" checked="checked"><br>
	주황<input type="radio"	name="color" value="1"><br>
	노랑<input type="radio"	name="color" value="2"><br>
	초록<input type="radio"	name="color" value="3"><br>
	파랑<input type="radio"	name="color" value="4"><br>
	남색<input type="radio"	name="color" value="5"><br>
	보라<input type="radio"	name="color" value="6"><p>
	<input type="submit" value="확인"><br>
</form>
</body>
</html>
  • color.jsp => switch문 활용
<%@ 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>
<style type="text/css">
	div {		/* 내가 아래에서 기술하여 적용해준 div에만 적용이 됨 */
		margin: 10px;
		padding: 20px;	/* 상하좌우 20px 공간주기 */
		background-color: white;
		font-size: 30px;
	}
</style>
</head>
<%
	String color = "", str = "";
	int num = Integer.parseInt(request.getParameter("color"));
	switch	(num)	{
		case 0:		color = "red";
					str = "빨강";
					break;
		case 1:		color = "orange";
					str = "주황";
					break;
		case 2:		color = "yellow";
					str = "노랑";
					break;
		case 03:		color = "green";
					str = "초록";
					break;
		case 4:		color = "blue";
					str = "파랑";
					break;
		case 5:		color = "navy";
					str = "남색";
					break;
		case 6:		color = "violet";
					str = "보라";
					break;
	}	
%>

<body	bgcolor=<%=color %>>
	<div>당신은 <%=str %>색을 좋아하는군요</div>

</body>
</html>


  • doWhile.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>
 <h2>구구단</h2>
 <table border="1" bgcolor="pink">
 	<tr>
 		<%
	 		int i = 2, j = 2;
	 		do	{		/* 제목을 보여주는 do-while문 */
	 			out.println("<th>" + i + "단</th>");
	 			i++;
	 		}	while	(i <= 9);
	 		out.println("<tr>");
	 		out.println("</tr>");
	 		i = 2;
	 		j = 1;
 		
	 		do	{	/* n단의 셀 컬러 출력 */
	 			
	 			if	(i % 2 == 0)	/* 짝수 조건문 */
	 				out.println("<td bgcolor=white>");
	 			else				/* 짝수의 나머지니까 홀수 조건문이 됨 */
	 				out.println("<td bgcolor=skyblue>");
	 			
	 			do{
	 				out.println(i + " * " + j + " = " + (i * j) + "<br>");
	 				j++;
	 			}	while	(j <= 9);	/* 여기까지 n단 아래로 추출 */
	 			out.println("</td>");
	 			j = 1;
	 			i++; 		/* n단이 끝나면 다시 if문으로 이동하여 다음단 출력 */
	 			
	 		}	while	(i <= 9);
 			
 		%> 
 </table>		
</body>
</html>

  • for2.jsp (위의 do-while문을 for문으로 변경)
<%@ 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>
<style type="text/css">
	td: hover	{
		background: yellow;
	}
</style>
</head>
<body>
 <h2>구구단</h2>
 <table border="1" bgcolor="yellow">
 <%
	for(int i = 2; i <= 9; i++)	{
		out.println("<th>" + i + "단</th>");		
	}
 	out.println("</tr>");
 	out.println("<tr>");
 	for(int i = 2; i <= 9; i++)	{
 		if	(i%2==0) out.println("<td bgcolor=white>");
 		else		 out.println("<td bgcolor=skyblue>");
 		for (int j = 1; j<=9; j++)	{
 			out.println(i + " *  " + j + " = " + (i * j) + "<br>");
 		}
 		out.println("</td>");
 	} 
 %>
 </tr>
 </table>
</body>
</html>


  • member.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
 function chk()		{
	if (!frm.id.value)	{
		alert("아이디를 입력해 주세요");
		frm.id.focus();
		return false;
	}
	if (!frm.password.value)	{
		alert("비밀번호를 입력해 주세요");
		frm.password.focus();
		return false;
	}
	return true;
	}

</script>
</head>
<body>
	<h2>회원가입</h2>
	<form action="member.jsp" name="frm" onsubmit="return chk()">
		아이디 : <input type="text" name="id">
		<p>
			암호 : <input type="password" name="password">
		<p>
			이름 : <input type="text" name="name">
		<p>
			취미 : <select name="hobby" multiple="multiple" size="5">
						<option value="바둑">바둑</option>
						<option value="정치">정치</option>
						<option value="축구">축구</option>
						<option value="여행">여행</option>
						<option value="게임">게임</option>
					</select>
		<p>
			성별 :남자<input type="radio" name="gender" value="남자" checked="checked">
				  여자<input type="radio" name="gender" value="여자">
		<p>
			<input type="submit" value="확인">
			<input type="reset" value="취소">
	</form>
</body>
</html>

  • member.jsp (현장HW)
    Tip
    • ("/WEB-INF/file/" + 파일명 하고픈거 +".txt")
      /WEB-INF/: 이 디렉터리에는 웹 애플리케이션의 구성 파일과 클래스 파일이 위치함
<%@page import="java.io.FileWriter"%>
<%@ 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>
<%
	// 1. 아래 해결
	// 2. "/WEB-INF/file/"+id+".txt"
	//		아이디 : "+id+"\r\n암호 : "+password+"\r\n이름 : "+name\r\n
	//		취미 : "+hobbys+"\r\n성별 : + gender
	request.setCharacterEncoding("utf-8");
	
	String hobbys = "";
	String id		= request.getParameter("id");
	String password = request.getParameter("password");
	String name		= request.getParameter("name");
	String[] hobby	= request.getParameterValues("hobby");
	String gender	= request.getParameter("gender");
	
	String real = application.getRealPath("/WEB-INF/file/" + id +".txt");
	
	String str = "아이디 : " + id + "\r\n암호 : "+password+"\r\n이름 : "+name;
	System.out.println("real->" + real);
	
	/* String msg = "아이디 : " + id + "\r\n";
	msg += "암호" + password + "\r\n";
	msg += "이름" + name + "\r\n"; */
	
	for (int i = 0; i < hobby.length; i++)	{
		hobbys += hobby[i] +" ";
	}
	
	str += "\r\n취미 : " + hobbys + "\r\n성별 : " + gender;
	FileWriter fw = new FileWriter(real);
	fw.write(str);
	fw.close();
	

%>
<h2>회원정보</h2>
아이디 : <%=id %><p>
암호 : <%=password %><p>
이름 : <%=name %><p>
취미 : <%=hobbys %><p>
성별 : <%=gender %>

</body>
</html>


  • request
    Tip)
메소드 설명 클라이언트 정보 메소드
Protocol 네트워크상에서 약속한 통신규약 (0708, 0709 일지 참고) String getProtocol(): 프로토콜명, 즉 사용 중인 프로토콜(HTT/1.1) 을 리턴함
Server 웹에서 서비스를 제공하는 컴퓨터 시스템 String getServerName(): 접속한 서버명, 즉 서버의 도메인 이름을 리턴함
Port
⭐⭐⭐⭐⭐
컴퓨터 사이에서 데이터를 주고받을 수 있는 통로(0709 일치 참고 int getServerPort(): 접속한 서버의 port번호를 리턴함
ClientIP 클라이언트의 IP 주소 String getRemoteAddr(): 클라이언트의 IP 주소를 리턴함
ClientHost 클라이언트의 호스트 정보 String getRemoteHost(): 클라이언트 호스트명을 리턴함
MethodType 클라이언트가 보낸 HTTP 요청의 메소드
- GET: 서버로부터 데이터를 가져올 때 사용됨
ex) 웹페이지를 불러오기, 검색결과 요청

- POST: 리소스에 새로운 데이터를 전송할 때 사용됨, 주로 서버에 데이터를 제출하고 데이터 처리를 요청할 때 사용됨
ex) 로그인 정보 제출, 폼 데이터 제출

- PUT: 지정된 리소스의 업데이트를 요청할 때 사용되며, 요청 본문에 업데이트할 데이터를 포함하여 전송함
ex) 파일 업로드, 데이터베이스 레코드 업데이트
String getMethod(): 요청에 사용된 요청 방식(GET, POST, PUT), 즉 현재 페이지의 method 방식을 리턴함
URL - URL(식별자+위치) ⊂ URI(식별자)
- 리소소의 정확한 위치 정보(파일의 위치)를 나타냄, URL을 통해 리소스가 어디에 있는지, 어떻게 접근할 수 있는지 알 수 있음
ex) https://elancer.co.kr => 이름과 더불어 어떠헥 도달할 수 있는지 위치까지 함께 나타냄
new String(request.getRequestURL()): 요청에 사용된 URL로부터 호출된 FULL 주소, 즉 요청한 현재페이지의 경로(URL)을 리턴함 
URI - URL(식별자+위치) ⊂ URI (식별자)
- URI는 그 자체로 이름이 될 수 있음
즉, 리소스의 위치뿐만 아니라 자원에 대한 고유 식별자로서 URL의 의미를 포함함
ex) elancer.co.kr=> 리소스의 이름만 나타냄
String getRequestURI(): 요청에 사용된 URL로부터 URI를 리턴함, 도메인 이후 하부주소
ContextPath
⭐⭐⭐
- context: 코드의 배경이 되는 조건이나 환경
JSP의 경로앞에 붙여 절대경로로 사용하길 추천
- ContextPath ⭐⭐⭐: context 경로는 웹 애플리케이션에 루트 경로를 나타내는 변수,
웹 애플리케이션이 배치된 경로를 기준으로 모든 리소스(JSP 페이지, 이미지, 스타일 시트, 자바스크립트 파일 등)의 절대 경로를 생성하는데 사용됨
String getContextPath(): 해당 JSP 페이지가 속한 웹 어플리케이션의 컨텍스트 경로를 리턴함
Browser 사용자가 인터넷을 통해 웹 페이지를 조회하고 상호작용하는 소프트웨어
ex) 크롬, 파이어폭스, 사파리 등
String getHeader("User-Agent")
: 사용중인 접속 브라우저, 운영체제를 리턴함
- User-Agent: 브라우저 체크의 핵심,
요청에 기반한 사용자 웹 브라우저 및 운영체제 정보를 포함함
MediaType - 웹에서 전송되는 문서나 데이터의 형식을 나타내는 식별자
- HTTP 헤더에 포함되어 서버와 클라이언트 사이에서 데이터 전송 시 올바르게 처리될 수 있도록 해줌
- MIME( Multipurpose Internet Mail Extensions) 타입이라고도 함
String getHeader("Accept")
: 웹 브라우저가 지원하는 매체(media)의 타입을 리턴

 

 

<%@page import="javax.naming.Context"%>
<%@ 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 server = request.getServerName();
	int port = request.getServerPort();
	String clientIp = request.getRemoteAddr();
	String clientHost = request.getRemoteHost();
	String methodType = request.getMethod(); 
	String url = new String(request.getRequestURL());
	String uri = request.getRequestURI();
	String ContextPath = request.getContextPath();
	String browser = request.getHeader("User-Agent");
	String mediaType = request.getHeader("Accept");

%>
	<h2>Request 내장 객체 예제2</h2>
	프로토콜명 : <%=protocol %><p>
	접속한 서버명 : <%=server %><p>
	접속한 서버의 포트 번호 : <%=port %><p>
	클라이언트의 IP : <%=clientIp %><p>
	클라이언트의 호스트명 : <%=clientHost %><p>
	현재 페이지의 method 방식 : <%=methodType %><p>
	요청한 현재 페이지의 경로(URL) : <%=url %><p>
	요청한 현재 페이지의 경로(URI) : <%=uri %><p>
	웹 어플리케이션에서의 컨텍스트 경로 : <%=ContextPath %><p>
	사용한 웹 브라우저 :<%=browser %><p>
	웹 브라우저가 지원하는 매체(media)의 타입 : <%=mediaType %><p>
	
</body>
</html>



(폴더: och05)

  • num1.html 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>연산할 숫자 입력</h2>
	<form action="Cal">
		첫번째 숫자 : <input type = "text" name="num1"><p>
		두번째 숫자 : <input type = "text" name="num2"><p>
		<input type = "submit" value="확인">
	</form>
</body>
</html>
  • Cal.servlet ==> 실행은 되지만, 값에 0을 넣어도 맞지 않는 값이 출력되는 오류가 생김
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("<html><body><h2>연산결과</h2>");
		
		int num1 = Integer.parseInt(request.getParameter("num1"));
		int num2 = Integer.parseInt(request.getParameter("num2"));
		out.printf("%d + %d = %d<p>", num1,num2,(num1+num2));
		out.printf("%d - %d = %d<p>", num1,num2,(num1-num2));
		out.printf("%d * %d = %d<p>", num1,num2,(num1*num2));
		out.printf("%d / %d = %d<p>", num1,num2,(num1/num2));
	}
  • Cal2.servlet
    Tip)
    • NumberFormatException: 문자열로 되어있는 데이터를 숫자로 변경하는 경우에 자주 발생
    • ArithmeticException: 정수를 0으로 나누기하면 발생하는 에러
    • Exception e: Error 범용 처리, 여기서는 어떤 Exception이 걸려도 여기서 처리가 됨
    • e.getMessage: 에러의 원인을 간단하게 출력함
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("<html><body><h2>연산결과</h2>");
		try	{
			int num1 = Integer.parseInt(request.getParameter("num1"));
			int num2 = Integer.parseInt(request.getParameter("num2"));
			out.printf("%d + %d = %d<p>", num1,num2,(num1+num2));
			out.printf("%d - %d = %d<p>", num1,num2,(num1-num2));
			out.printf("%d * %d = %d<p>", num1,num2,(num1*num2));
			out.printf("%d / %d = %d<p>", num1,num2,(num1/num2));
			
		}catch(NumberFormatException e)	{
			out.println("연산결과");
		}catch(ArithmeticException e) {
			out.println("0 으로 나누었음");
		}catch (Exception e) {
			out.println("e.getMessage");
		}
		
	}

 

NumberFormatException

 

 

ArithmeticException

  • Cal3.java ==>  error 페이지로 이동하게 만들어줌
    Tip)
    • requestDispatcher
      • 서블릿에서 값을 넘겨주고 해당 페이지에서 처리할 수 있도록 하는 방법
      • 서블릿에서 처리한 데이터를 jsp에서 가져다가 사용해야 할 때 쓰는 객체
      • 생성된 객체를 가지고 forward 메소드를 통해 해당 경로 페이지로 이동할 수 있음
      • 호출된 페이지에서는 request.getAttribute() 메소드를 통해 넘겨받은 데이터를 처리할 수 있음,
        이때 sendRedirect와는 다르게 request와 response 객체를 가지고 이동할 수 있음
      • RequestDispatcher는 이동할 경로를 설정하고 생성
    • forward 메소드: 현재 요청을 다른 서블릿이나 JSP로 전달함
      이 메서드를 호출하면, 현재 서블릿이 생성한 요청과 응답 객체를 전달받은 서블릿이나 JSP로 제어를 넘김
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("<html><body><h2>연산결과</h2>");
		try	{
			int num1 = Integer.parseInt(request.getParameter("num1"));
			int num2 = Integer.parseInt(request.getParameter("num2"));
			out.printf("%d + %d = %d<p>", num1,num2,(num1+num2));
			out.printf("%d - %d = %d<p>", num1,num2,(num1-num2));
			out.printf("%d * %d = %d<p>", num1,num2,(num1*num2));
			out.printf("%d / %d = %d<p>", num1,num2,(num1/num2));
			
		}catch (Exception e) {
			RequestDispatcher rd = request.getRequestDispatcher("error2.jsp");
			rd.forward(request, response);
		}
		
	}
  • error.jsp
    Tip)
    • isErrorPage=true: isErrorPage=true로 설정된 JSP는 예외 처리를 위한 특수한 목적으로 사용되므로, 일반적인 JSP와 달리 예외 발생 시 특별한 처리가 필요함, true는 기본 객체 사용 가능
    • isErrorPage=false: false는 기본 객체 사용 불가능
    • response.setstatus(): HTTP 응답의 상태 코드를 설정하는 역할을 함, 이 메서드를 사용하여 서버가 클라이언트로 반환하는 HTTP 응답의 상태를 명시적으로 지정할 수 있음
    • response.setstatus(200): 요청이 성공적으로 처리되었음을 나타냄, 이 정상코드를 세팅해놓고 시작해야 예외적인 오류가 생기지 않음
      +++)400: not found, 요청한 리소스를 찾을 수 없음 / 500: Internal Server Error, 서버에서 처리 중에 오류가 발생하였음을 나타냄
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
<% response.setStatus(200);%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>공지사항</h1>
	잘 하려고 준비중이여<p>
	배상해주~<p>
</body>
</html>


  • gugu.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>보고 싶은 구구단 번호 선택(JavaScript)</h2>
<form action="gugu.jsp" name="frm">
	숫자 : <input type="text" name="num"><p>
	<input type="submit" value="확인">
</form>

</body>
</html>

  • gugu.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>
<%
	try	{
		int num = Integer.parseInt(request.getParameter("num"));
		if	(num > 9 || num < 2)	{	//여기서부터
%>
	<script type="text/javascript">
		alert("여기가 인도냐!");
		history.go(-1);
	</script>
<%
		}	//여기까지 if문이 먹음
		out.println("<h2>구구단 " + num + "단</h2>");
		for	(int i = 1; i <= 9; i++)	{
			out.println(num + " * " + i + " = " + (num * i) + "<br>");
		}
	}catch(Exception e)	{
%>
	<script type="text/javascript">
		alert("숫자도 몰라 유딩!");
		history.go(-1);
	</script>
<% 
	}
%>
</body>
</html>


  • name.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>이름과 숫자를 입력하시오</h2>
	<form action="name.jsp">
		이름 : <input type="text"	name="name"><p>
		숫자 : <input type="text"	name="num"><p>
		<input type="submit" value="확인">
	</form>
</body>
</html>

  • name.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="error2.jsp"%>
    				<!-- errorPage로 이동 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2><%=request.getParameter("name").toUpperCase() %></h2>
	<%
		int num = Integer.parseInt(request.getParameter("num"));
	%>
</body>
</html>
  • error2.jsp
    Tip)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
<% response.setStatus(200); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>공지</h2>
나은 서비스를 위해서 준비중입니다<p>
메세지 : <%=exception.getMessage() %><br>	<!-- e.getMessage와 같은 기능 -->
클래스 : <%=exception.getClass() %>

</body>
</html>


  • num2.html
    Tip
    • onload: 페이지가 로드될 때 특정 함수를 호출시 사용함, 즉 미리 값을 매긴 화면을 보여줌
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function init()	{
	frm.num1.value = "3";
	frm.num2.value = "";
	frm.num1.focus();
}
</script>
</head>
<body onload="init()">		<!-- onload:미리 값을 매겨줌 -->
	<h2>연산할 숫자 입력</h2>
	<form action="cal1.jsp" name="frm">
		첫번째 숫자 : <input type="text" name="num1"><p>
		두번째 숫자 : <input type="text" name="num2"><p>
		<input type="submit" name="확인">
	</form>
</body>
</html>

 

  • cal2.jsp (현장HW)
<%@ 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>
<h2>연산결과</h2>
<%
	// 1. num1, num2 parameter 받기
	// 2. + , - , * , /, 출력하기
	// 3 .	NumberFormatException	-> 그게 숫자냐
	//		ArithmeticException		-> 헐 0으로 나누다니!
	//		Exception				-> e.getMessage()
	try	{
		// 1. num1, num2 parameter 받기
		int num1 = Integer.parseInt(request.getParameter("num1"));	
		int num2 = Integer.parseInt(request.getParameter("num2"));
		// 2. + , - , * , / ,출력하기
		out.println(num1 + " + " + num2 + " = " + (num1+num2)+"<p>");
		out.println(num1 + " - " + num2 + " = " + (num1-num2)+"<p>");
		out.println(num1 + " * " + num2 + " = " + (num1*num2)+"<p>");
		out.println(num1 + " / " + num2 + " = " + (num1/num2)+"<p>");
	// 3 .	NumberFormatException	-> 그게 숫자냐	//null값이어도 이게 나옴
	//		ArithmeticException		-> 헐 0으로 나누다니!
	//		Exception				-> e.getMessage()
	}catch(NumberFormatException e){
		out.println("그게 숫자냐");
	}catch(ArithmeticException e){
		out.println("헐 0으로 나누다니!");
	}catch(Exception e){
		out.println(e.getMessage());
	}
	
%>
</body>
</html>

  • cal2.jsp (현장HW)
<%@ 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>
<h2>연산결과 cal2</h2>
<%
	// 1. num1, num2 parameter 받기
	// 2. + , - , * , /, 출력하기
	// 3 .Exception				-> e.getMessage()
	try	{
		// 1. num1, num2 parameter 받기
		int num1 = Integer.parseInt(request.getParameter("num1"));	
		int num2 = Integer.parseInt(request.getParameter("num2"));
		// 2. + , - , * , / ,출력하기
		out.println(num1 + " + " + num2 + " = " + (num1+num2)+"<p>");
		out.println(num1 + " - " + num2 + " = " + (num1-num2)+"<p>");
		out.println(num1 + " * " + num2 + " = " + (num1*num2)+"<p>");
		out.println(num1 + " / " + num2 + " = " + (num1/num2)+"<p>");
	// 3. Exception				-> e.getMessage()
	}catch(Exception e){
		RequestDispatcher rd = request.getRequestDispatcher("error.jsp");
		rd.forward(request, response);
		//errorPage를 부르기만 할 뿐이므로, UTF-*8다음에 isErrorPage 객체를 쓸 필요는 없음
	}
	
%>
</body>
</html>

  • cal3.jsp (현장HW)
    Tip)
    • history.go(-1)와 history.back의 차이: 둘 다 이전 페이지로 이동하지만 go()와 달리, back()은 소괄호 안의 숫자만큼 뒤로 돌아가지 않음
<%@ 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>
		<h2>연산결과 cal3</h2>
		<%
			// 1. num1, num2 parameter 받기
			// 2. + , - , * , /, 출력하기
			// 3 .	NumberFormatException	-> 그게 숫자냐
			//		ArithmeticException		-> 헐 0으로 나누다니!
			//		Exception				-> e.getMessage()
			try	{
				// 1. num1, num2 parameter 받기
				int num1 = Integer.parseInt(request.getParameter("num1"));	
				int num2 = Integer.parseInt(request.getParameter("num2"));
				// 2. + , - , * , / ,출력하기
				out.println(num1 + " + " + num2 + " = " + (num1+num2)+"<p>");
				out.println(num1 + " - " + num2 + " = " + (num1-num2)+"<p>");
				out.println(num1 + " * " + num2 + " = " + (num1*num2)+"<p>");
				out.println(num1 + " / " + num2 + " = " + (num1/num2)+"<p>");
			// 같은 처리를 Java Script로 수행하기
			// 3 .	NumberFormatException	-> 그게 숫자냐
			//		ArithmeticException		-> 헐 0으로 나누다니!
			//		Exception				-> 하여튼 에러야
			//		모두 전 Page 이동
			}catch(NumberFormatException e)	{
		%>
			<script type="text/javascript">
				alert("그게 숫자냐");
				history.go(-1);
			</script>
		<% 	}catch(ArithmeticException e)	{	%>
			<script type="text/javascript">
				alert("0으로 못나눠");	
				history.back();
			</script>
		
		<% }catch(Exception e) { 
			out.println(e.getMessage());
		%> 
			<script type="text/javascript">
				alert("하여튼 에러야");	
				location.href="num2.html";
			</script>
		
		<% 	 }	%>
	
	</body>
</html>

 

  • cal4.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function init()	{
	frm.num1.value = "100";
	frm.num2.value = "5";
	frm.num1.focus();
}
</script>
</head>
<body onload="init()">		<!-- onload:미리 값을 매겨줌 -->
	<h2>연산할 숫자 입력</h2>
	<!-- <form action="cal1.jsp" name="frm"> -->
<!-- 	<form action="cal2.jsp" name="frm"> -->
	<!-- <form action="cal3.jsp" name="frm"> -->
	<form action="cal4.jsp" name="frm">
		첫번째 숫자 : <input type="text" name="num1"><p>
		두번째 숫자 : <input type="text" name="num2"><p>
		<input type="submit" name="확인">
	</form>
</body>
</html>

 


(폴더: error + 05폴더의 num2.html과 cal5.jsp를 이용하여 error 발생시키기)

  • num2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function init()	{
	frm.num1.value = "100";
	frm.num2.value = "5";
	frm.num1.focus();
}
</script>
</head>
<body onload="init()">		<!-- onload:미리 값을 매겨줌 -->
	<h2>연산할 숫자 입력</h2>
	<!-- <form action="cal1.jsp" name="frm"> -->
<!-- 	<form action="cal2.jsp" name="frm"> -->
	<!-- <form action="cal3.jsp" name="frm"> -->
	<!-- <form action="cal4.jsp" name="frm"> -->
	<form action="cal5.jsp" name="frm">
		첫번째 숫자 : <input type="text" name="num1"><p>
		두번째 숫자 : <input type="text" name="num2"><p>
		<input type="submit" name="확인">
	</form>
</body>
</html>
  • cal5.jsp => error페이지를 기술하지 않아도 web.xml파일에 기재하면 error페이지 이동 가능
<%@ 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>
<h2>연산결과 cal5</h2>
<%
	//1. num1, num2 parameter 받기
	int num1 = Integer.parseInt(request.getParameter("num1"));	
	int num2 = Integer.parseInt(request.getParameter("num2"));
	// 2. + , - , * , / ,출력하기
	out.println(num1 + " + " + num2 + " = " + (num1+num2)+"<p>");
	out.println(num1 + " - " + num2 + " = " + (num1-num2)+"<p>");
	out.println(num1 + " * " + num2 + " = " + (num1*num2)+"<p>");
	out.println(num1 + " / " + num2 + " = " + (num1/num2)+"<p>");

%>
</body>
</html>
  • web.xml
  <error-page>
  	<exception-type>java.lang.ArithmeticException</exception-type>
  	<location>/error/errorArithmetic.jsp</location>
  </error-page>
  
  <error-page>
  	<exception-type>java.lang.NumberFormatException</exception-type>
  	<location>/error/errorNumFormat.jsp</location>
  </error-page>

  • errorArithmetic.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
<% response.setStatus(200); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>0으로 나누면 되니 ?</h1>
</body>
</html>


  • errorNumFormat.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
<% response.setStatus(200); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>문자를 입력한거니?</h1>
</body>
</html>



수업교재

4. 내부객체(0710일지 참고)

1. 개요

  • JSP 페이지에서 사용할 수 있도록 JSP 컨테이너에 미리 정의된 객체, 개발자가 생성하지 않아도 됨
  • JSP 페이지가 서블릿 프로그램으로 번역될 때 JSP 컨테이너가 자동으로 내장 객체를 멤버 변수, 메소드 매개변수 등의 각종 참조 변수(객체)로 포함
  • JSP 페이지에 별도의 import문 없이 자유롭게 사용 가능
  • 스크립틀릿 태그나 표현문 태그에 선언을 하거나 객체를 생성하지 않고도 직접 호출하여 사용 가능
    이것이 가능한 이유는 JSP 페이지가 서블릿으로 변환이 될 때 JSP 컨테이너가 자동적으로 제공을 하기 때문
    다만 <%! 선언부 %>에서 즉시 사용하는 것은 불가능하며, 이때는 매게변수로 전달받아만 사용할 수 있음

2. 내부객체가 제공하는 메소드

메소드 리턴 타입 설명
setAttribute
(String key, Object value)
void 주어진 key 속성의 값을 value로 지정함
getAttributeNames() java.util.Enumeration 모든 속성의 이름을 구함
getAttribute
(String key)
object 주어진 key 속성의 값을 얻어냄
removeAttribute void 주어진 key 속성의 값을 제거함

 

3. request 내부객체

  • request 객체는 웹 브라우저로 응답할 응답 정보를 가지고 있으며, JSP 페이지로 전달되는 정보의 모임으로 HTTP 헤더와 HTTP 바디로 구성됨
  • 웹 컨테이너는 요청된 HTTP 메시지를 통해 HttpServletRequest 객체타입으로 사용되고 request 객체명으로 사용
  • 주요기능
    • 클라이언트와 서버에 대한 정보 읽기
    • 클라이언트(브라우저)가 서버로 전송한 데이터의 인코딩 처리
    • 클라이언트가 전송한 요청 매개변수에 대한 정보 읽기
    • 요청  헤더 및 쿠키 정보 읽기
    • 리다이렉트( 웹 서버가 웹 브라우저에게 다른 페이지로 이동하라고 응답하는 기능)하기
메소드 설명
String getParameter(name) 이름이 name인 파라미터에 할당된 값을 리턴하며, 지정된 파라미터 값이 없으면 null 값을 리턴함
String[] getParameterValues(name) 이름이 name인 파라미터의 모든 값을 String 배열로 리턴함
checkbox에서 주로 사용됨
Enumeration getParameterNames() 요청에 사용된 모든 파라미터 이름을 java.util.Enumeration 타입으로 리턴함

 

4. request 내부객체 클라이언트 정보 메서드

: request 객체는 또한 웹 브라우저와 웹 서버의 정보도 가져올 수 있음

메소드 설명
String getMethod() 요청에 사용된 요청 방식(GET, POST, PUT)을 리턴함
String getRequestURI() 요청에 사용된 URL로부터 URI를 리턴함
String getQueryString()
요청에 사용된 Query 문장을 리턴함
String getRemoteHost() 클라이언트 호스트 이름을 리턴함
String getRemoteAddr() 클라이언트의 주소를 리턴함
String getProtocol() 사용 중인 프로토콜을 리턴함
String getServerName()
서버의 도메인 이름을 리턴함
int getServerPort() 서버의 port번호를 리턴함
String getHeader(name) HTTP 요청 헤더에 지정된 name의 값을 리턴함
String getContextPath() 해당 JSP 페이지가 속한 웹 어플리케이션의 컨텍스트 경로를 리턴함

 

'JSP > Java Script' 카테고리의 다른 글

2024_07_15_월  (0) 2024.07.15
2024_07_12_금  (0) 2024.07.12
2024_07_10_수  (0) 2024.07.10
2024_07_09_화  (0) 2024.07.09
2024_07_08_월  (0) 2024.07.08