초급의 끄적거림

[JSP] request내부객체 / 성적 프로그램 만들기1 / 한글인코딩 본문

JSP

[JSP] request내부객체 / 성적 프로그램 만들기1 / 한글인코딩

codingD 2019. 8. 26. 17:59

[09_request내부객체.jsp]

<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>09_request내부객체.jsp</title>
</head>
<body>
	<h1>*request 내부객체의 다양한 메소드*</h1>
    <form aciton="09_requestok.jsp">
    아이디 : <input type="text" name="uid">
    <br>
    <input type="submit" value="request내부객체">
    </form>
</body>
</html>

 

<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>09_requestok.jsp</title>
</head>
<body>
	<h1>*request 내부객체의 다양한 메소드 결과*</h1>
<%
	
    //1) 한글인코딩
	//→ UTF-8 조합형, EUC-KR(=MS949) 완성형
	//→ 대소문자 구분 없음
    request.setCharacterEncoding("UFT-8");
    
    //2) 사용자가 입력한 정보 가져오기
    out.print(request.getParameter("uid"));
    out.print("<hr>");
    
    //3) 요청한 사용자의 다양한 정보
    out.print(request.getRemoteAddr());  //★가장 중요★ 요청PC의 IP확인
    out.print("<hr>");
%>

한글로 넣어도 한글이 안 깨지는 것을 볼 수 있음

 ⊙ IP버전 verison 4에 해당하는 것만 쓸 수 있도록 설정하는 것

 ⊙ IPv4와 IPv6의 주소 반환 문제는 톰캣 WAS 서버에서의 설정된 값으로 시스템의 특정 서버 환경에 따라 달라짐
 ⊙ 그렇기 때문에 만약 내 개발 서버의 환경에서 IPv6로 반환하고 있는데, IPv4로 반환받도록 하고 싶다면 톰캣 실행 시, 전달되는 JVM(Java Virtual Machine)의 환경 변수에 다음 설정 값을 추가함

 ⊙ '공백1칸 주고 -Djava.net.preferIPv4Stack=true' 넣기

Run Configurations... → Tomcat v8.0~ → Arguments

 

 ⊙ 이 설정을 마친 경우, 서버를 멈췄다가 재실행 ('서버 우클릭' - 'stop' - 후 'start')

 

 ⊙ IP주소가 바뀐 것을 확인할 수 있음

 ⊙ 내 컴퓨터에서 submit 했기 때문에 자기를 나타내는 IP 주소가 나오게 됨

[다양한 정보를 확인할 수 있는 다른 메소드들 확인]

<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>09_requestok.jsp</title>
</head>
<body>
	<h1>*request 내부객체의 다양한 메소드 결과*</h1>
<%
	
    //1) 한글인코딩
	//→ UTF-8 조합형, EUC-KR(=MS949) 완성형
	//→ 대소문자 구분 없음
    request.setCharacterEncoding("UFT-8");
    
    //2) 사용자가 입력한 정보 가져오기
    out.print(request.getParameter("uid"));
    out.print("<hr>");
    
    //3) 요청한 사용자의 다양한 정보
    out.print(request.getRemoteAddr()); //★ 가장 중요 ★ 요청PC의 IP확인
    out.print("<hr>");
    out.print(request.getRemoteHost());  
    out.print("<hr>");
    out.print(request.getRemotePort());  
    out.print("<hr>");
//-------------------------------------------------------------------------------------------------------------------------------
	//   /basicWeb (가상의 디렉토리를 불러 올때 씀 )    
    out.print(request.getContextPath()); 
	out.print("<hr>");
	
	//  /basicWeb/basic/09_requestok.jsp (사용자가 요청한 명령어만)
	out.print(request.getRequestURI());  
	out.print("<hr>");
	
	// http://localhost:8090/basicWeb/basic/09_requestok.jsp (사용자 요청한 명령어 전체)
	out.print(request.getRequestURL());  
	out.print("<hr>");
//-------------------------------------------------------------------------------------------------------------------------------
	// 내컴퓨터 입자에서 /basic폴더의 실제 물리적인 경로
	// D:\java0514\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\basicWeb\basic
	// 이클립스에서 톰캣서버를 실행했기 때문에 메타데이터가 있는것이고 다른 곳에서 만들면 생기지 않음
	out.print(request.getRealPath("/basic"));  
	out.print("<hr>");
	
	out.print(application.getRealPath("/basic"));  
	out.print("<hr>");
//--------------------------------------------------------------------------------------------------------------------------------
	//내부변수
	//request.setAttribute("변수명", 값);
	//request.getAttribute("변수명");
	
	request.setAttribute("user", "fullmoon");
	//내부변수의 리턴형은 Object이므로 형변환을 해서 사용한다
	Object obj=request.getAttribute("user");  
	String str=(String)obj;
	out.println(str);
%>  

</body>
</html>

 

 

[sungjuk.sql]

 ⊙ sungjuk.sql 파일 만들기 

 ⊙ 이미 존재하는 sungjuk 테이블을 drop 하고 다시 create 할 것

 

테이블을 삭제하고 아무것도 남지 않은 모습
blank를 복사하여 두 개의 jsp 파일 만들기

 

[sungjukForm.jsp]

 ⊙ 'sungjukForm.jsp' 는 성적을 입력하는 메인 화면에 해당.

 ⊙ form 이 실행되면 sungjukIns.jsp를 움직이게 됨

<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>sungjukForm.jsp</title>

</head>
<body>
	<h1>*성적 입력 폼*</h1>
    <p><a href="sungjukList.jsp>[성적목록]</a></p>
	<form method="post" action="sungjukIns.jsp">
    
    <table border="1">
		<tr>
		 <th>이름</th>
		  <td>
		   <input type="text" name="uname" maxlength="20" required autofocus>  <!-- autofocus 페이지 로드 시 자동으로 해당 입력창에 포커스가 가도록 한다. -->
		  </td>
		</tr>
		<tr>
		 <th>국어</th>
		  <td>
		   <input type="number" name="kor" size="5" min="0" max="100" placeholder="숫자입력">  <!-- autofocus 자동커서 -->
		  </td>
		</tr>
		<tr>
		 <th>영어</th>
		  <td>
		   <input type="number" name="eng" size="5" min="0" max="100" placeholder="숫자입력">  <!-- autofocus 자동커서 -->
		  </td>
		</tr>
		<tr>
		 <th>수학</th>
		  <td>
		   <input type="number" name="mat" size="5" min="0" max="100" placeholder="숫자입력">  <!-- autofocus 자동커서 -->
		  </td>
		</tr>
		<tr>
		 <th>주소</th>
          <td>
              <select name="addr">
              	<option value="Seoul">서울</option>
                <option value="Jeju">제주</option>
                <option value="Busan">부산</option>
                <option value="Suwon">수원</option>
              </select>
          </td>
    	</tr>
        <tr>
          <td colspan="2" align="center">
            <input type="submit" value="전송">
            <input type="reset"  value="취소">
          </td>
        </tr>
    </table>     
    </form>
</body>
</html>

 

 

[sungjukIns.jsp]

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

<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>

<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>sungjukIns.jsp</title>
</head>
<body>
	<h1>*성적 결과*</h1>
	<p><a href="sungjukForm.jsp">[성적쓰기]</a></p>
<%
	//한글 인코딩
    request.setCharacterEncoding("UTF-8");
    
    //입력정보 가져와서 변수에 담기
    String uname=request.getParameter("uname").trim();
    int kor=Integer.parseInt(request.getParameter("kor").trim());
    int eng=Integer.parseInt(request.getParameter("eng").trim());
    int mat=Integer.parseInt(request.getParameter("mat").trim());
    String addr=request.getParameter("addr").trim();
    
    //평균 구하기
    int aver=(kor+eng+mat)/3;
    
    //출력
    out.print("이름 : " + uname +"<hr>");
    out.print("국어 : " + kor +"<hr>");
    out.print("영어 : " + eng +"<hr>");
    out.print("수학 : " + mat +"<hr>");
    out.print("평균 : " + aver +"<hr>");
    out.print("주소 : " + addr +"<hr>");
    out.print("요청IP : " + request.getRemoteAddr() +"<hr>");
%>
</body>
</html>

 

[Oracle DB 저장]

 ⊙ DB 연결자체를 어떻게 해달라고 '2차평가문제'에 공개 되어 있음

⊙ 계속 에러가 발생하기 때문에 lib 폴더에 'ojdb6.jar'를 넣어줌

⊙ lib 폴더의 경로 : basicWeb/WebContent/WEB-INF/lib 

⊙ 정보처리산업기사 평가문제 공개용을 바탕으로 Oracle DataBase Connection의 경로를 찾아서 넣어줌

정보처리산업기사 평가문제 공개용에서 발췌

 

<%
//<위의 코드에 연결>
//Oracle DB 저장 ---------------------------------------------------------------------------
try{
	//1) oracle 드라이버 (ojdbc9.jar)
    Class.forName("oracle.jdbc.OracleDriver");
		 
    //2) Oracle DB 연결
    Connection con=DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/xe","java0514","1234");
	PreparedStatement pstmt=null;
    
    //3) SQL문 작성
    StringBuilder sql=new StringBuilder();
    sql.append(" INSERT INTO sno, uname, kor, eng, mat, aver, addr ");
    sql.append(" VALUES((SELECT NVL(MAX(sno), 0)+1 FROM sungjuk) ");
    sql.append("      , ?, ?, ?, ?, ?, ?, sysdate) ");
    
    //4) SQL문 변혼
    pstmt=con.prepareStatement(sql.toString());
    pstmt.setString(1, uname);
    pstmt.setInt(2, kor);
    pstmt.setInt(3, eng);
    pstmt.setInt(4, mat);
    pstmt.setInt(5, aver);
    pstmt.setString(6, addr);
    
    //5) SQL문 실행
    int cnt=pstmt.executeUpdate();
    if(cnt==0){
        out.println("<p>성적 입력을 실패했습니다</p>");
	    out.println("<p><a href='javascript:history.back()'>[다시시도]</a></p>");
    }else{
    	out.println("<script>");
		out.println("		alert('성적이 입력되었습니다');");
		out.println("		location.href='sungjukList.jsp';");
		out.println("</script>");		
    }//if end
}catch(Exception e){
	out.println("ㅠ실패ㅠ" +e);
}//try end

%>

 

⊙ sungjukIns.jsp에서 3) 번을 작성할 때 성적칼럼을 mat 까지 밖에 쓰지 않아서 뒤에 더 나와야하는 'aver, addr, wdate' 없어서 값이 많아져서 나는 에러

 

에러 발생
제대로 들어간 경우 입력되었다는 알람이 뜸

 

⊙ HTTP Status 404 에러는 1. 실제 파일이 없거나 2. 오타가 있을 경우 발생하는 에러

⊙ 아직은 5) SQL문 실행 때 연결한 'out.println(" location.href='sungjukList.jsp';"); ' 가 존재 하지 않기 때문에 sungjukList.jsp 가 만들어지면 됨

 

⊙ 에러가 나서 제대로 내용이 들어갔는지 확인할 수 없기 때문에 'sqlplus' 창을 이용하여 확인 가능

 

 

[sungjukList.jsp]

 1) 입력한 자료가 '성적 목록' 에 잘 들어갔는지 확인

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>

<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8> <!-- page의 utf-8과 meta의 utf-8 확인 해줄 것  -->
<title>sungjukList.jsp</title>
/head>
<body>
	<h1>*성적 목록*</h1>
	<p><a href="sungjukForm.jsp">[성적쓰기]</a></p>
	<table>
	<tr>
		<th>이름</th>
		<th>국어</th>
		<th>영어</th>
		<th>수학</th>
		<th>등록일</th>
	</tr>	
<%
	try{
    	Class.forName("oracle.jdbc.OracleDriver");
		Connection con=DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/xe","java0514","1234");
	
		StringBuilder sql=new StringBuilder();
        sql.append(" SELECT sno, uname, kor, eng, mat, wdate ");
        sql.append(" FROM sungjuk ");
        sql.append(" ORDER BY wdate DESC");
        
        PreparedStatement pstmt=con.prepareStatement(sql.toString());
		ResultSet rs=pstmt.executeQuery(); 
        if(rs.next()){
        	do{
%>
			<tr>
				   <!-- 1. 목록페이지에서 sno 를 넘기는 것, 아래의 sno도 변수에 해당 -->
				   <td><a href ='sungjukRead.jsp?sno=<%=rs.getInt("sno") %>'><%=rs.getString("uname") %></a></td>  <!-- ?를 넣으면서 url에 다 나타나는 get방식으로 다 나타남. '이름'에 링크를 걸어서 '상세보기' 페이지를 만들 것, 이렇게 되면 이름에 링크가 발생함 -->
				   <td><%=rs.getInt("kor") %></td>
				   <td><%=rs.getInt("eng") %></td>
				   <td><%=rs.getInt("mat") %></td>
				   <td><%=rs.getString("wdate")%></td>
			 </tr>
<%
		}while(rs.next());
      }else{
      	  out.println("<tr>");  //게시판의 목록에 글이 없다는걸 보여주기 위함 
		  out.println(" <td colspan='5'>글 없음T.T</td>");
		  out.println("</tr>"); 
      }//if end
    }catch(Exception e){
    	 out.println("실패 : "+e);
    }//try end
%>

	</table>
</body>
</html>

성적 목록 들어감

 

 2) 자료가 없을 경우, 실패 메세지 확인

   - 글이 없다는 알림을 확인하기 위해서 넣었던 행을 삭제

 

    - 메인 화면 왼쪽에 [성적목록] 에서 '글 없음T.T' 메세지를 확인 할 수 있음

 

[성적테이블 CRUD]

Create  - 행추가  insert
Read   - 조회   select
Update - 수정   update
Delete  -  삭제   delete

 

 ⊙ sungjukForm.jsp 성적쓰기 → sungjukIns.jsp
 ⊙ sno 를 넘기면서 서로 다른 페이지를 연결
                                                     sno                                                   sno
 ⊙ sungjukList.jsp 성적목록 -----→ sungjukRead.jsp 상세보기 -----→ 삭제 sungjukDel.jsp 콕 짚어서 누구를 지울지 알아야 하기 때문에 PK가 필요함)                                         -----→ 수정 (sungjukUpdate.jsp)


 ⊙ sungjukList.jsp 성적목록 → sungjukRead.jsp 상세보기  → 수정 / 삭제 (수정삭제 페이지의 부모페이지 : sungjukRead)

  +) 이름을 누르면 작성한 글목록이 뜨게 하기 위해서 '이름'에 링크를 걸어줌
 ⊙ sungjukForm.jsp 성적쓰기 → sungjukIns.jsp

 

sungjukList에서 이름에 링크를 걸었음
아직 sungjukRead.jsp를 만들지 않아서 이름을 클릭시, 에러가 발생함

 

 ⊙ sungjuk.sql로 가서 '상세보기' 적용해보기

유일성을 가진 sno가 2인 것을 찾음

 

 ⊙ <sungjukList>에서 url에 sno로 상세페이지 표시 ?가 들어가면서 get방식의 url이 나타남

 ⊙ sungjukList.jsp와 sungRead.jsp는 별개의 페이지로 서로 전달을 주고받는 식 (연결된 것으로 볼 수 있지만 서로 주고받고 전달하는 것)

 ⊙ sungRead.jsp (상세보기) 페이지는 sungjukList.jsp(목록) 페이지를 부모로 삼음

 

 ⊙ 목록페이지에서 sno 를 넘기는 것, 아래의 sno도 변수에 해당

 

 ⊙ url이 바뀐 것을 볼 수 있음→ '장만월' sno=1 이라는 표시가 나옴 / '구찬성'  sno=2 / '고청명' sno=3 이 나타남

Comments