오늘의 코딩순서
(폴더: 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: 서블릿 클래스가 위치하는 디렉터리임
- /WEB-INF/: 이 디렉터리에는 웹 애플리케이션의 구성 파일과 클래스 파일이 위치함
- 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/: 이 디렉터리에는 웹 애플리케이션의 구성 파일과 클래스 파일이 위치함
- ("/WEB-INF/file/" + 파일명 하고픈거 +".txt")
<%@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");
}
}
- Cal3.java ==> error 페이지로 이동하게 만들어줌
Tip)- requestDispatcher
- 서블릿에서 값을 넘겨주고 해당 페이지에서 처리할 수 있도록 하는 방법
- 서블릿에서 처리한 데이터를 jsp에서 가져다가 사용해야 할 때 쓰는 객체
- 생성된 객체를 가지고 forward 메소드를 통해 해당 경로 페이지로 이동할 수 있음
- 호출된 페이지에서는 request.getAttribute() 메소드를 통해 넘겨받은 데이터를 처리할 수 있음,
이때 sendRedirect와는 다르게 request와 response 객체를 가지고 이동할 수 있음 - RequestDispatcher는 이동할 경로를 설정하고 생성
- forward 메소드: 현재 요청을 다른 서블릿이나 JSP로 전달함
이 메서드를 호출하면, 현재 서블릿이 생성한 요청과 응답 객체를 전달받은 서블릿이나 JSP로 제어를 넘김
- requestDispatcher
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 |