레이블이 JSP&Servlet인 게시물을 표시합니다. 모든 게시물 표시
레이블이 JSP&Servlet인 게시물을 표시합니다. 모든 게시물 표시

홈페이지 만들기 프로젝트 part2 - 회원가입을 구현해보자

안녕하세요

이번 시간에는 홈페이지 만들기에서 정말 필수적인 부분이죠

회원가입과 로그인 예제를 올려봅니다.


저번 포스팅에 올린 top.jsp에 보면,

참조하는 부분이 세개입니다.


첫번째가 css 파일입니다.

소스코드는 아래와 같이 있습니다.

<link rel="stylesheet" type="text/css" href="<%=myctx%>/css/layout.css">
<link rel="stylesheet" type="text/css" href="<%=myctx%>/css/calendar.css">

즉 css 폴더 아래에 layout.css, calendar.css가 있어야 색상이나 크기 같은 것을

지정 할 수 있습니다.


두 번째 파일은 자바스크립트 파일로..

<script src="./js/calendar.js"></script> 파일로

js 폴더 아래에 calendar 자바스크립트 파일이 있어야 하며

이 파일은 달력을 만드는 파일입니다.

이것은 직접 구현하시길 바라며 따로 공개는 안하겠습니다.

(전에도 블로그에 올렸기 때문에)


그리고 세번째 파일은 jsp 파일로 4개로 구성되어 있습니다.

<li><a href="<%=myctx%>/index.jsp">HOME</a></li>
<li><a href="<%=myctx%>/member/memberJoin.jsp">JOIN</a></li>
<li><a href="<%=myctx%>/login/login.jsp">LOGIN</a></li>
<li><a href="<%=myctx%>/board/board.jsp">BOARD</a></li>

첫번째 index.jsp는 저번 시간에 올렸고,

이번 시간에는 memberJoin.jsp와 login.jsp 두 개를 구현하겠습니다
(board.jsp는 시간이 되면 추후에 올리도록 하겠습니다 - 아직 미구현 ㅜ)


원래는 회원가입과 로그인 두 개 모두 다 올리려고 했는데

회원가입만 해도 관련된 클래스, jsp 파일이 많아 일단 이번 시간에는

memberJoin.jsp 부분만 올리겠습니다.

중요한 소스 부분은 빨간줄로 표시를 하겠습니다.

========================================================

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
<jsp:include page="/top.jsp"/>

<style>
td,th{
padding:5px;
}
input{
height:20px;
}
</style>

<script type="text/javascript">

/*아이디 중복체크 팝업 띄우기*/
var idCheck=function(){
var url="idCheck.jsp";
win=window.open(url,"idCheck","width=400, height=400, left=100, top=100");
}

/*입력 값 유효성 체크*/
  var check=function(){
//이름, 아이디, 비번, 연락처1,2,3

if(!f.name.value){
alert('이름을 입력하세요');
f.name.focus();
return;
}

if(!f.userid.value){
alert('아이디를 입력하세요');
f.userid.focus();
return;
}

if(!f.pwd.value){
alert('비밀번호를 입력하세요');
f.pwd.focus();
return;
}

if(f.pwd.value != f.pwd2.value){
alert('비밀번호와 비밀번호 확인이 달라요');
f.pwd2.select();
return;
}

if(!f.hp1.value || !f.hp2.value || !f.hp3.value){
alert('연락처를 모두 입력하세요');
f.hp2.focus();
return;
}

// 연락처, 우편번호 숫자 여부.. <- 내가 해야 할 몫..

// 이용약관 동의 체크 여부
if(!f.agree.checked){
alert('이용약관에 동의해야 해요');
f.agree.focus();
return;
}

f.submit();
}

</script>

<!-- 다음 api를 활용하여 우변펀호 등록하는 스크립트 사용  -->
<script src="http://dmaps.daum.net/map_js_init/postcode.js"></script>
    <script>
        function openDaumPostcode() {
            new daum.Postcode({
                oncomplete: function(data) {
                    // 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분. 우편번호와 주소 정보를 해당 필드에 넣고, 커서를 상세주소 필드로 이동한다.
                    document.getElementById("addr1").value = data.postcode1;
                    document.getElementById("addr2").value = data.postcode2;
                    document.getElementById("addr1").value = data.address;
                    document.getElementById("addr2").focus();
                }
            }).open();
        }
    </script>

<div align="center">
    <h1>:::Member Join:::</h1>
    <form name="f" id="f" action="memberJoinEnd.jsp" method="post">
    <table style="width:90%">
    <tr>
    <th width="20%">이름</th>
    <td width="80%" style="text-align: left;">
    <input type="text" name="name">
    </td>
    </tr>
    <tr>
    <th width="20%">아이디</th>
    <td width="80%" style="text-align: left;">
    <input type="text" name="userid" readonly style="background-color:#efefef;">
    <button type="button" onclick="idCheck()">아이디 중복체크</button>
    </td>
    </tr>
    <tr>
    <th width="20%">비밀번호</th>
    <td width="80%" style="text-align: left;">
    <input type="password" name="pwd">
    </td>
    </tr>
    <tr>
    <th width="20%">비밀번호 확인</th>
    <td width="80%" style="text-align: left;">
    <input type="password" name="pwd2">
    </td>
    </tr>
    <tr>
    <th width="20%">이메일</th>
    <td width="80%" style="text-align: left;">
    <input type="text" name="email" style="width:50%">
    </td>
    </tr>
    <tr>
    <th width="20%">연락처</th>
    <td width="80%" style="text-align: left;">
    <select name="hp1">
    <optgroup label="연락처">
    <option value="010">010</option>
    <option value="011">011</option>
    <option value="019">019</option>
    </optgroup>
    </select>
    <input type="text" name="hp2" size="4" maxlength="4">-
    <input type="text" name="hp3" size="4" maxlength="4">
    </td>
    </tr>
    <tr>
    <th width="20%">우편번호</th>
    <td width="80%" style="text-align: left;">
    <input type="text" name="post" maxlength="5" size="15">
    <button type="button" class="btngray btn" onclick="openDaumPostcode()">우편번호 찾기</button>
    </td>
    </tr>
    <tr>
    <th width="20%">주소</th>
    <td width="80%" style="text-align: left;">
    <input type="text" name="addr1" id="addr1" style="width:70%"><br>
    <input type="text" name="addr2" id="addr2" style="width:70%">
    </td>
    </tr>
    <tr>
    <td colspan="2" style="text-align:right; padding-right:30px">이용 약관에 동의하십니까?
    <input type="checkbox" name="agree"></td>
    </tr>
    <tr>
    <td colspan="2">
    <iframe src="agree.html" style="width:90%; heigth:120px"></iframe>
    </td>
    </tr>
    <tr>
    <td colspan="2">
    <button type="button" onclick="check()">회원가입</button>
    <button types="reset">다시쓰기</button>
    </td>
    </tr>
    </table>
    </form>
</div>

<jsp:include page="/foot.jsp"/>



일단 보면 아시겠지만 제가 밑줄로 그은 빨간색 .jsp 파일이 있습니다.

idCheck.jsp, memberJoinEnd.jsp

이 두개를 또 추가적으로 구현해야 합니다.

참고로 idCheck.jsp에서는



user.member 패키지에 MemberDAO.java가 있어야 소스코드가 오류없이 작동합니다.

MemberDAO.java는 db에 쿼리문을 수행하는 소스 코드입니다.

앞으로 많이 나올 예정입니다 ㅜ


========================================================

idCheck.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<link rel="stylesheet" type="text/css" href="../css/layout.css">
<script type="text/javascript">
function setUid(uid){
//uid 값을 팝업창을 띄워준 부모창의 userid 텍스트박스에 넣어주자.
//window(최상위 객체)-->document-->form(최하위)
//부모창=> opener (window 객체)
opener.document.f.userid.value=uid;
//팝업창 닫기
self.close();
//자기창=> self로 참조

}

function checkId(){
if(!frm.userid.value){
alert('아이디를 입력하세요');
frm.userid.focus();
return;
}
frm.submit();
}

</script>

    <%
    String method=request.getMethod();
    //out.println("<b>method="+method);
    //[1] 메소드 방식이 GET 방식이면 => 아이디 입력 폼을 보여준다
    if(method.equalsIgnoreCase("get")){ // 대소문자 상관안하고 get 문자이면..
    %>
    <div align="center" style="padding:10px;">
    <form name="frm" action="idCheck.jsp" method="POST">
    <label for="userid">아이디</label>
    <input type="text" name="userid" id="userid" style="border:1px solid silver">
    <button type="button" onclick="checkId()">확인</button>
    </form>
    </div>
    <%
    }else{
    //[2] POST 방식이면 => 아이디 중복 체크 결과를 보여준다
    // (1) 사용자가 입력한 아이디 값 받아오기
    String userid=request.getParameter("userid");
    if(userid==null||userid.trim().isEmpty()){
    %>
    <script type="text/javascript">
    alert('아이디를 입력해야 해요');
    history.back();
    </script>
    <%
    return;
    }
    %>

<!-- DAO는 웹브라우저 한번 당 세션으로 이어짐 / VO,DTO는 스코프를 페이지로 준다 -->
<jsp:useBean id="userDAO" class="user.member.MemberDAO" scope="session" />
    <%
    // (2) DB member 테이블에 해당 아이디가 있는지 체크
    boolean isUse=userDAO.idCheck(userid.trim());
    if(isUse){ // 사용 가능한 경우 = true
    %>
    <div align="center">
    <p>
    ID로 [<SPAN style="color:red"><b><%=userid%></b></SPAN>]를 사용할 수 있습니다.
    </p>
    <button type="button" onclick="setUid('<%=userid%>')">닫기</button>
    </div>
    <%
    }else{ // 사용 불가능한 경우 = false
    %>
    <div align="center">
    <p>
    ID로 [<SPAN style="color:red"><b><%=userid%></b></SPAN>]는 이미 사용중입니다.
    </p>
   
<form name="frm" action="idCheck.jsp" method="POST">
    <label for="userid">아이디</label>
    <input type="text" name="userid" id="userid" style="border:1px solid silver">
    <button type="button" onclick="checkId()">확인</button>
    </form>
   
    </div>
    <%
    }
    }
    %>


idCheck.jsp에서는 가장 중요한 부분은 역시

userDAO.idCheck(userid.trim());

부분입니다.

즉 user.member 패키지 아래에 있는 MemberDAO 소스에

idCheck() 메소드가 있어야 이 소스는 이상없이 작동됩니다.


그럼 바로 MemberDAO 소스 코드를 공개하겠습니다.

전체 골격 소스는 이번 한번만 공개하고, 다음에 쓰일 때는

메소드만 올리겠습니다.


package user.member;

import db.util.*;
import java.sql.*;
import java.util.*;

// DAO : Data Access Object
public class MemberDAO {

private Connection con;
private PreparedStatement ps;
private ResultSet rs;

public MemberDAO(){
System.out.println("MemberDAO() 생성자");
}

/** 아이디의 사용 가능 여부를 체크하는 메소드*/

public boolean idCheck(String userid) throws SQLException{
try{
con=DBUtil.getCon();
String sql="SELECT idx FROM member WHERE userid=?";
ps=con.prepareStatement(sql);
ps.setString(1, userid);
rs=ps.executeQuery();
//rs의 커서 이동
boolean isRs=rs.next();
return !isRs; // 밑에 4줄 짜리를 한줄로 줄임
/*if(isRs){
//해당 아이디가 member에 있는 경우
return false;
}else{
//없는 경우
return true;
}*/

}finally{
DBUtil.close(rs, ps, con);
}
}


참고로 여기서 db.util 패키지에 DBUtil 이라는 클래스가 또 있어야 합니다 ㅜ

package db.util;

import java.sql.*;
/*드라이버 로딩하고 커넥션을 하는 클래스*/

public class DBUtil {

private static String host="localhost";
private static String url="jdbc:oracle:thin:@"+host+":1521:ORCL";
private static String user="king", pwd="tiger";
private static String driver="oracle.jdbc.driver.OracleDriver";

static{
try{
Class.forName(driver);
System.out.println("Driver Loading Success...");
}catch(Exception e){
e.printStackTrace();
}

}//static initializer - 메모리에 가장 먼저 올라가는 블록으로 main() 보다도 먼저 실행됨

public static synchronized Connection getCon() throws SQLException{
System.out.println("url="+url);
Connection con = DriverManager.getConnection(url,user,pwd);
return con;
}

//setter, getter--

public static String getHost() {
return host;
}

public static void setHost(String host) {
DBUtil.host = host;
}

public static String getUrl() {
return url;
}

public static void setUrl(String url) {
DBUtil.url = url;
}

public static String getUser() {
return user;
}

public static void setUser(String user) {
DBUtil.user = user;
}

public static String getPwd() {
return pwd;
}

public static void setPwd(String pwd) {
DBUtil.pwd = pwd;
}

public static String getDriver() {
return driver;
}

public static void setDriver(String driver) {
DBUtil.driver = driver;
}

public static void close(ResultSet rs, Statement st, Connection con) {
try{
if(rs!=null) rs.close();
if(st!=null) st.close();
if(con!=null) con.close();
System.out.println("DB연결 종료");
}catch(SQLException e){
e.printStackTrace();
}

}
}

========================================================

자 이제 마지막 부분입니다.

memberJoinEnd.jsp 소스 부분인데요.

바로 공개하도록 하겠습니다.


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="../example/error.jsp" %>

    <!-- memberJoinEnd.jsp : 회원가입 처리 페이지
      사용자가 입력한 값을 받아 DB member 테이블에 insert 처리한다.
    -->
   
    <%
    //1. post 방식일 경우 한글 처리
    request.setCharacterEncoding("UTF-8");
   
    //2. 사용자가 입력한 값을 받아온다
    //String name=request.getParameter("name");
    //String userid=request.getParameter("userid");
    //String pwd=request.getParameter("pwd");
    //String email=request.getParameter("email");
    //out.println(name+"/"+userid);
    //out.println("패스워드 : "+pwd);
   
    %>
   
    <jsp:useBean id="userVO" class="user.member.MemberVO" scope="page"/>
    <%--
    MemberVO userVO=new MemberVO()와 동일 -> 다만 MemberVO 클래스에 기본 생성자가 없으면 오류남
    --%>
   
    <jsp:setProperty name="userVO" property="*"/>
    <%--
    userVO.setName(request.getParameter("name"));와 동일
    즉 memberJoin.jsp에서 입력한 값을 각각 얻어오는 것이다.
    userVO.setUserid(...)
    ...
    와 동일
    --%>


    <B><%=userVO%></B>
   
    <%
    //3. 유효성 체크 (이름, 아이디)
    if(userVO.getName()==null||userVO.getUserid()==null){
response.sendRedirect("memberJoin.jsp"); // 이 코드를 작성하면 memberJoinEnd 클래스에서 실행해도 memberJoin으로 되돌아감
    return;
    }
    %>
   
    <jsp:useBean id="userDAO" class="user.member.MemberDAO" scope="session"/>
   
    <%
    int n=userDAO.insertMember(userVO);
    String msg=(n>0)?"회원가입 성공":"회원가입 실패";
    String loc=(n>0)?"memberList.jsp":"javascript:history.back()";
    %>
   
    <script type="text/javascript">
    alert('<%=msg%>');
    location.href='<%=loc%>';
    </script>
   


하아.. 여기서도 참고하고 있는 부분이 세 부분입니다.

첫번째가 에러 화면을 보여주는 error.jsp

두번째가 사용자가 입력한 회원정보 값을 불러들이는 MemberVO 클래스

세번째는 아까 위에서 활용했던 DB를 처리하는 MemberDAO 클래스의 insertMember 메소드


이 세 부분도 바로 소스 코드를 올리겠습니다.

1. error.jsp

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

<jsp:include page="/top.jsp"/>

<%@ page isErrorPage="true" %>
<%
response.setStatus(response.SC_OK);
//ie에서는 위 코드를 지정해야 에러 처리 페이지가 동작한다
%>

<%-- error.jsp 페이지에서는 page 지시어에 반드시 isErrorPage 라는 속성값으로 true를 주어야 한다.
그래야 exception 이라는 내장 객체를 사용할 수 있다. --%>

<!DOCTYPE html>
<html>
<head><title>error 처리 페이지</title></head>
<body>
<div align="center">
<table style="width:600px;height:400px;background-color:#efefef">
<tr>
<td style="color:red;text-align:center">
<%
if(exception instanceof java.sql.SQLException){
out.println("서버오류: "+exception.getMessage());
}else{
out.println("오류발생: "+exception.getMessage());
}
exception.printStackTrace(); // 스택 기록 찍기(서버 콘솔에)
%>
</td>
</tr>
<tr>
<td>[<a href="javascript:history.back()">이전 페이지</a>]</td>
</tr>
</table>
</div>
<jsp:include page="/foot.jsp"/>



2. MemberVO

package user.member;

import java.io.*;
import java.sql.Date;

//dto, dao 직렬화 하는 것이 좋다
public class MemberVO implements Serializable {
// 멤버변수(인스턴스 변수) => jsp에서는 프로퍼티(property) 라고 부른다.
// 프로퍼티들은 가능하면 html form의 input name과 일치시켜 주는 것이 좋다

private Integer idx; // 회원번호
private String name;
private String userid;
private String pwd;
private String email;
private String hp1, hp2, hp3;
private String post;
private String addr1, addr2;
private java.sql.Date indate;
private int mileage;
private int mstate; // 회원 상태 정보

public MemberVO(){
System.out.println("MemberVO() 생성자");
//기본 생성자 반드시 필요
//기본 생성자가 없으면 jsp에서 useBean으로 객체 생성을 할 수 없다.
}

// 생성자 오버로드

public MemberVO(Integer idx, String name, String userid, String pwd, String email, String hp1, String hp2,
String hp3, String post, String addr1, String addr2, Date indate, int mileage, int mstate) {
super();
this.idx = idx;
this.name = name;
this.userid = userid;
this.pwd = pwd;
this.email = email;
this.hp1 = hp1;
this.hp2 = hp2;
this.hp3 = hp3;
this.post = post;
this.addr1 = addr1;
this.addr2 = addr2;
this.indate = indate;
this.mileage = mileage;
this.mstate = mstate;
}

//setter, getter

public Integer getIdx() {
return idx;
}

public void setIdx(Integer idx) {
this.idx = idx;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getUserid() {
return userid;
}

public void setUserid(String userid) {
this.userid = userid;
}

public String getPwd() {
return pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getHp1() {
return hp1;
}

public void setHp1(String hp1) {
this.hp1 = hp1;
}

public String getHp2() {
return hp2;
}

public void setHp2(String hp2) {
this.hp2 = hp2;
}

public String getHp3() {
return hp3;
}

public void setHp3(String hp3) {
this.hp3 = hp3;
}

public String getPost() {
return post;
}

public void setPost(String post) {
this.post = post;
}

public String getAddr1() {
return addr1;
}

public void setAddr1(String addr1) {
this.addr1 = addr1;
}

public String getAddr2() {
return addr2;
}

public void setAddr2(String addr2) {
this.addr2 = addr2;
}

public java.sql.Date getIndate() {
return indate;
}

public void setIndate(java.sql.Date indate) {
this.indate = indate;
}

public int getMileage() {
return mileage;
}

public void setMileage(int mileage) {
this.mileage = mileage;
}

public int getMstate() {
return mstate;
}

public void setMstate(int mstate) {
this.mstate = mstate;
}

// 연락처를 하나로 합침
public String getAllHp(){
return hp1+"-"+hp2+"-"+hp3;
}

// 주소도 하나로 합침
public String getAllAddr(){
return addr1+" "+addr2;
}


//toString() 오버라이드

@Override
public String toString() {
return "MemberVO [idx=" + idx + ", name=" + name + ", userid=" + userid + ", pwd=" + pwd + ", email=" + email
+ ", hp1=" + hp1 + ", hp2=" + hp2 + ", hp3=" + hp3 + ", post=" + post + ", addr1=" + addr1 + ", addr2="
+ addr2 + ", indate=" + indate + ", mileage=" + mileage + ", mstate=" + mstate + "]";
}

}


3. MemberDAO 클래스의 insertMember 메소드

public int insertMember(MemberVO user) throws SQLException{
try {
con=DBUtil.getCon();
String sql="INSERT INTO MEMBER(idx,name,userid,email,pwd,hp1,hp2,hp3,post,addr1,addr2,indate,mileage,mstate)"
+ " values (member_idx_seq.nextval,?,?,?,?,?,?,?,?,?,?,sysdate,?,?)";
ps=con.prepareStatement(sql);

// ? 값 셋팅
ps.setString(1, user.getName());
ps.setString(2, user.getUserid());
ps.setString(3, user.getEmail());
ps.setString(4, user.getPwd());
ps.setString(5, user.getHp1());
ps.setString(6, user.getHp2());
ps.setString(7, user.getHp3());
ps.setString(8, user.getPost());
ps.setString(9, user.getAddr1());
ps.setString(10, user.getAddr2());
ps.setInt(11, user.getMileage());
ps.setInt(12, user.getMstate());

// 실행 excuteXXX()
int n = ps.executeUpdate();
return n;
} finally {
DBUtil.close(rs, ps, con);
}
}


========================================================




자 그럼 직접 한번 회원가입을 해보겠습니다.









홈페이지 만들기 프로젝트 part1 - 기본 골격 만들기

안녕하세요

이번 시간에는 jsp와 java, html ,javascript를 활용하여 홈페이지를 만드는 시간을

가져보겠습니다.

한번에 전체 소스를 올리는 것은 당사자인 저도 정리가 안될뿐더러

파트 별로 나눠서 올리는 것이 이해가 될 것 같아

부분 부분 모듈 별로 올려봅니다.


이번 시간에는 홈페이지 메인 화면의 구조에 관한 소스 코드와

설명을 올리겠습니다.


결과 화면은 아래와 같습니다. UI는 솔직히 아직 다듬은 상태가 아니라 별로입니다




막상 봤을 때는 단순해 보이지만

총 세개의 파일로 구성되어 있습니다.

1. 화면의 상단을 보여주는 top.jsp

2. 화면의 하단을 보여주는 foot.jsp

3. 화면의 중간을 보여주는 index.jsp


자 그럼 먼저 top.jsp 부터 소스 코드를 공개하겠습니다


=========================================================

//top.jsp - 화면 상단

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- top.jsp : top 페이지는 모든 페이지에서 include 하므로 절대경로로 링크 거는 것이 좋다.-->
<%
//컨텍스트명을 얻어온다.
String myctx=request.getContextPath();
//=> "MyWeb"
%>

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>::HomePage::</title>
  <link rel="stylesheet" type="text/css" href="<%=myctx%>/css/layout.css">
  <link rel="stylesheet" type="text/css" href="<%=myctx%>/css/calendar.css">

  <script src="./js/calendar.js"></script>

 </head>
 <body onload="showToday()">
 <div id="wrap">
<!-- 헤더영역--------------------------- -->
<header>
<!--헤더: 문서의 로고 이미지,검색폼,목차
등이 들어감-->
<a href="http://www.facebook.com"><img src="<%=myctx%>/images/logo2.PNG"></a>
</header>
<div class="clear"></div>
<!-- nav:네비게이션바-------------- -->
<nav>
<ul>
<li><a href="<%=myctx%>/index.jsp">HOME</a></li>
<li><a href="<%=myctx%>/member/memberJoin.jsp">JOIN</a></li>
<li><a href="<%=myctx%>/login/login.jsp">LOGIN</a></li>
<li><a href="<%=myctx%>/board/board.jsp">BOARD</a></li>
</ul>
</nav>
</div>

<div class="clear"></div>
<!--article:주로 컨텐츠가 들어감  -->
<article>


=========================================================

//foot.jsp - 화면 하단


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- foot.jsp -->
</article>
<!-- aside: 사이드 메뉴가 들어감 -->
<% String myctx=request.getContextPath(); %>
<aside>
<nav>
<!-- 로그인 페이지 포함(실행결과가 아닌 소스를 포함시킨다)------ -->
<%@ include file="/login/login.jsp" %>
<!-- ------------------------------------------ -->
<ul>
<li><a href="<%=myctx%>/member/memberList.jsp">MemberList</a></li>
<li><a href="<%=myctx%>/beans/input.jsp">Beans Scope1</a></li>
<li><a href="<%=myctx%>/beans/input2.jsp">Beans Scope2</a></li>
<li><a href="<%=myctx%>/login/sessionTest.jsp">세션 테스트</a></li>
<li><a href="<%=myctx%>/login/memberTest.jsp">회원 인증 페이지</a></li>
<li><a href="<%=myctx%>/cookie/cookieTest.jsp"></a>쿠키 테스트</li>

</ul>
</nav>
<div id="cal"></div>
</aside>
<div class="clear"></div>
<!-- footer:하단 목록,Copyright -->
<footer>
푸터:Copyright
</footer>

=========================================================

//index.jsp - 화면 중간


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<jsp:include page="/top.jsp" />

    <H1>Index Page</H1>
 
    <jsp:include page="/foot.jsp"/>

=========================================================


일단 기본 포맷은 갖췄으나 아직 구성해야 할게 많이 남아있습니다.

그것은 다음 포스팅에서 계속해서 올리겠습니다.

http 400,403 에러를 발생시키게 하는 소스

안녕하세요

이번 시간에는 <form> 태그 안에 있는 아이디, 비밀번호 값을

서버에 전송을 하면 서버가 특정한 아이디가 오면 response 하는 소스 코드를

올려봅니다.

때에 따라 유용한 소스가 될 수 있으니 한번 봐주세요~!

자 그럼 렛츠고!!



==========================================================


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
    <style>
    <!--
    div{
    margin:10px;
    }
    -->
    </style>

    <h1>response에 대해 알아보자.</h1>
    <h2>테스트 방법 : 아이디 입력 박스에 killer, forward, redirect 값을 입력하여 테스트 해보세요.</h2>
    <form action="ex11Response.jsp" method="POST">
    <div>
    <label for="uid">아 이 디</label>
    <input type="text" name="userId" id="uid">
    </div>
<div>
<label for="upwd">비밀번호</label>
<input type="password" name="pwd" id="upwd">
</div>
<div>
<button>로그인</button>


</div>
   
    </form>


==========================================================

위 소스는 그냥 단순한 폼 소스입니다.

저기서 중요한건 <form action="ex11Response.jsp" method="POST"> 으로

로그인 버튼을 누르면 데이터가 ex11Response.jsp로 POST 방식으로 넘겨줍니다.

진짜 중요한건 데이터를 처리하는 서버 소스입니다.



==========================================================

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
    <%
    //1. 아이디, 비번값 받아 출력하기 (서블릿,jsp에 쓰는 것은 name, id는 자바스크립트)
    String userId=request.getParameter("userId");
    String pwd=request.getParameter("pwd");
    out.println(userId+"/"+pwd);
   
    //2. 아이디, 비번이 null이면 ex11Form.jsp 페이지로 redirect 시키기
    //폼을 통해서 바로 들어가는 경우..
   
    if(userId==null||pwd==null){
    //페이지 이동 - ex11Form.jsp에 대한 요청을 새롭게 보낸다
    //페이지가 이동된 이후에도 로직을 수행하므로 return문을 기술하자
    response.sendRedirect("ex11Form.jsp");
    return;
    }
    System.out.println("여기도 들어오나요???");
   
    //3. 빈 문자열 체크
    if(userId.trim().isEmpty() || "".equals(pwd.trim())){
    //잘못된 요청이라는 에러 응답 처리 -- 400 Error
    response.sendError(HttpServletResponse.SC_BAD_REQUEST);
    return;
    }
   
    //4. 아이디가 killer라면 들어오면 안됨
    if(userId.equalsIgnoreCase("killer")){
    //접근 금지 에러 - 403 Error
    response.sendError(HttpServletResponse.SC_FORBIDDEN);
    return;
    }
   
    //5. 아이디가 redirect
    if(userId.trim().equals("redirect")){
    //request에 저장 => setAttribute(key,val)
    request.setAttribute("msg", userId+"님 환영합니다.");
    response.sendRedirect("Welcome.jsp");
    return;
    }
   
    //6. 아이디가 forward 일 경우
    if(userId.trim().equals("forward")){
    request.setAttribute("msg", userId+"님 환영합니다.");
    %>
    <jsp:forward page="Welcome.jsp"/>
   
    <%
    return;
    }
   
    %>

    <h1 style="color:blue"><%=userId%>님 환영합니다</h1>
   
    <h1>페이지 이동 방식</h1>
    <h2>1) redirect 이동 방식</h2>
    <ol>
    <li>새롭게 요청(request)을 보내 페이지를 보여준다.</li>
    <li>새로운 요청을 보내기 때문에 url이 새로운 url로 바뀐다.</li>
    <li>이동시킨 페이지와 이동된 페이지를 서로 다른 request에 지정한 값을 기억하지 못한다.</li>
    </ol>
    <h2>2) forward 이동 방식</h2>
    <ol>
    <li>서버 내부에서 페이지 이동이 일어난다</li>
    <li>서버 내부에서 이동하므로 요청 url은 이전 url을 유지한다.</li>
    <li>이동시킨 페이지와 이동된 페이지가 같은 request를 공유한다.</li>
    </ol>
   


==========================================================

자 그럼 위의 소스를 실행하면 어떤 결과가 나올까요?

잘 봐주세요~!!



일단 아이디, 패스워드에 빈 공백이 있는 문자열을 넣고 전송하면

HTTP 400 에러가 발생합니다.





이번에는 아이디를 killer로 주고 데이터를 전송하면 Http 403 에러가 발생합니다.



이번에는 아이디를 redirect 로 하면 'Welcome.jsp' 라는 곳으로 url이 바뀝니다

하지만 아이디를 forward로 하면..




ex11Response.jsp 로 그대로 됩니다.


REQUEST 내장 객체 : HttpServletRequest의 주요 메소드 을 알아보자

안녕하세요

이번 시간에는 HttpServletRequest의 핵심 메소드들을 알아보는 시간을 가지겠습니다.

이번 예제 같은 경우는 메소드들을 그냥 활용한 거라서

이런 메소드들이 있고 그 메소드들을 쓰면 어떤 결과를 얻을 수 있겠다 정도로만

이해하시면 되겠습니다

자 그럼 바로 소스코드와 결과 화면을 공개 하겠습니다


==========================================================

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<div style="padding-left:50px">
<h1>request 내장객체 : HttpServletRequest의 주요 메소드</h1>
<%
String server=request.getServerName();
out.println("서버 도메인 명 : "+server+"<p>");
int port=request.getServerPort();
out.println("서버 포트 번호 : "+port+"<p>");

String url=request.getRequestURL().toString();
out.println("요청 URL :"+url+"<p>");

String uri=request.getRequestURI();
out.println("요청 URI : "+uri+"<p>");

String qStr=request.getQueryString();
out.println("요청 쿼리 스트링 : "+qStr+"<p>"); // http://localhost:9090/MyWeb/example/ex10Request.jsp /?..
// ? 이하를 쿼리 스트링

String cip=request.getRemoteAddr();
out.println("클라이언트 IP 주소 : "+cip+"<p>");

String protocol=request.getProtocol();
out.println("프로토콜 : "+protocol+"<p>");

// 컨텍스트명을 알아보자
String ctx=request.getContextPath();
out.println("<h3>컨텍스트명: "+ctx+"</h3>"); // "/MyWeb"

int len=ctx.length();
out.println("len : "+len+"<p>");

String str=uri.substring(len);
out.println("<h3>"+str+"</h3>");

int index=uri.indexOf(".jsp");

//.jsp가 없는 경우 -1을 반환
if(index<0){ // 확장자가 없는 경우
str=uri.substring(len);
}else{ // 확장자가 있는 경우
str=uri.substring(len, index);
}

out.println("<h2>"+str+"</h2>");


/*[문제1] 요청 URI 중에서  /MyWeb/example/ex10Request.jsp

/example/ex10Request.jsp 문자열만 추출해보세요

/example/ex10Request 문자열만 추출해보세요
*/
%>

<hr color="red">
<h1> request의 헤더 정보 </h1>

<%
// 헤더 이름들을 Enumeration 형태로 반환
java.util.Enumeration<String> en=request.getHeaderNames();
while(en.hasMoreElements()){
String key=en.nextElement();
//헤더 이름을 key 값으로 반환
String val=request.getHeader(key);
out.println("<h2>"+key+": "+val+"</h2>");
}
%>

</div>

==========================================================





회원가입 form 태그에 있는 데이터를 처리하는 예제

안녕하세요

이번 시간에는 회원가입 할 때 쓰는 폼을 만들어, 그 안에 데이터를 넣고

그 결과를 처리하는 예제를 올려봅니다.




지금 이름, 아이디, 건의사항, 취미 등등 이런한 각종 필드는 <form> 태그로 감싸져 있습니다.

즉 이 <form> 안에 있는 데이터들을 처리하면 회원가입과 같은 처리가 되는 것 입니다.

큰 틀로 보면 단순합니다만, 그 구성을 만드는게 쉽지는 않죠

뭐 다른 프로그래밍에 비하면 쉬운편에 속하지만요;;


일단 저 위의 폼을 갖추는 소스는 아래와 같습니다


=========================================================


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

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>09form양식1.html</title>
 </head>
 <body>

 <!-- form태그 : 서버에 데이터를 전송하고자 할 때 입력양식을 form태그로 감싼다.
  - method 속성 : 데이터 전송방식을 기술한다.
값으로는 GET 아니면 POST 값을 기술
GET방식은 데이터가 URL에 노출되는 반면 POST 방식은 데이터를 감춰서 전송한다.
  - action : 폼 양식을 처리하는 서버 페이지를 기술
  - enctype : 인코딩 방식을 기술한다. 파일 업로드시는 multipart/form-data를 지정해야 함
 -->

<!-- p는 문단 태그 -->
<form action="ex09Result.jsp" method="POST">
이름: <input type="text" name="userName"><p>
아이디: <input type="text" name="userId"><p>
비밀번호:<input type="password" name="pwd"><p>
성별(라디오 버튼-단일 선택):
<input type="radio" name="gender" value="M" checked>남자
<input type="radio" name="gender" value="F">여자<p>
취미(체크박스-다중 선택):
<input type="checkbox" name="hobby" value="reading" checked>
독서
<input type="checkbox" name="hobby" value="movie">영화감상
<input type="checkbox" name="hobby" value="music">음악감상
<input type="checkbox" name="hobby" value="sports">스포츠<p>
드롭다운 리스트:
<select name="job">
<option value="sales">SALES</option>
<option value="manager">MANAGER</option>
<option value="clerk" selected>CLERK</option>
</select><p>
리스트 박스:
<select name="lang" size="4" multiple>
<!-- size속성을 주면 펼친 형태가 된다.
multiple속성을 주면 다중 선택이 가능하다.
-->
<option value="JAVA">JAVA</option>
<option value="HTML">HTML</option>
<option value="CSS">CSS</option>
<option value="JSP">JSP</option>
</select><p>
건의사항:
<textarea name="comment" rows="5" cols="40"></textarea>
<p>
<!--hidden data-->
히든필드(데이터를 숨겨 보내고자 할 때):
<input type="hidden" name="mydata" value="Top Secret"><p>
파일업로드:
<input type="file" name="photo"><p>

<input type="submit" value="회원가입">
<!--submit: 전송버튼 -->
<input type="reset" value="다시쓰기">
<!-- reset: 초기화 버튼 -->
<input type="button" value="일반버튼"
onclick="alert('안녕??')">
<!-- button: 특별한 기능은 없음. 기능을 수행하려면
자바스크립트로 이벤트 핸들러를 지정해야 함 -->
<a href="javascript:alert('반가워요')"><img src="./images/딸기 쉐이크.PNG"></a>
<input type="image" src="./images/맥윙 2조각.PNG">
<!-- image버튼은 submit버튼과 동일한 기능을
갖는다. 서버에 데이터를 전송한다.-->
 </form>
 
 </body>
</html>


사실 저 위에서 중요한 소스는 이 한줄입니다

<form action="ex09Result.jsp" method="POST">

전송 버튼을 누르면 폼 액션을 ex09Result.jsp로 보내어 처리하는것이고

방식은 post 방식으로 비밀번호 같은 중요한 데이터가 url에 노출되지 않게 처리하는

뜻입니다.


=========================================================


이제 진짜 중요한 소스는 ex09Result.jsp 입니다.

ex09.jsp에서 보낸 폼 데이터를 처리하는 소스입니다.

잘 봐주세요~!


=========================================================

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

<!-- ex09Result.jsp -->

<%
//POST 방식의 한글처리
request.setCharacterEncoding("UTF-8");

// 이름, 아이디, 비밀번호, 성별, 취미 값을 받아 출력해보세요
String name=request.getParameter("userName");
String id=request.getParameter("userId");
String pwd=request.getParameter("pwd");
String gender=request.getParameter("gender");
//String hobby=request.getParameter("hobby"); [x]
//다중 선택값을 갖는 파라미터는 String[] 배열로 받는다.
String[] hobbyArr=request.getParameterValues("hobby"); // 여러개의 값들은 Values를 추가한다

//job, lang, comment, mydata 값 받아 출력하세요
String job=request.getParameter("job");
String[] langArr=request.getParameterValues("lang");
String comment=request.getParameter("comment");
String mydata=request.getParameter("mydata");
%>

<h2><b>이름 : <%=name%></b></h2>
<h2><b>아이디 : <%=id%></b></h2>
<h2><b>비밀번호 : <%=pwd%></b></h2>
<h2><b>성별 : <%=gender%></b></h2>
<h2><b>취미 :
<!-- hobbyArr을 반복문 돌려서 출력해보기 -->

<%if(hobbyArr!=null){ // NullPointerException을 방지하기 위해 기술
for(String h:hobbyArr){
out.println(h+", ");
}
}//if-------------
%>
</b></h2>
<h2><b>직업: <%=job%></b></h2>
<h2><b>언어:

<%if(langArr!=null){
for(String l:langArr){
out.println(l+", ");
}
}
%>
</b></h2>

<H2><b>건의사항 : <%=comment%></b></H2>
<h2><b>비밀데이터 : <%=mydata%></b></h2>


=========================================================

자 이렇게 해서 위의 소스 코드를 실행하면..




하타케 카카시가 제 회원가입 페이지에 가입을 했네요

비번을 1로 하고 ㅋㅋ

보안이 허술하네요~