회원가입 폼을 구축할 예정이다
필요한 도메인 LIST
-회원 가입 폼
-회원 가입
-회원 목록
-회원 상세 보기
-회원 정보 수정
-회원 정보 삭제
server 작업
1. 서버 준비 및 각 도메인에 맞는 함수 호출
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
var http=require("http"); //내장모듈 가져오기
var fs=require("fs"); //파일 시스템 모듈
//(쪼개져서)직렬화된 전송된 데이터에 대한 해석을 담당(문자열로 해석가능)
var qs=require("querystring");
var url=require("url"); //url 분석과 관련된 내부모듈
var mysql=require("mysql"); //mysql 모듈 가져오기(외부모듈이므로 별도 설치 필요)
var ejs=require("ejs"); //ejs 모듈을 가져오기(외부모듈)
//우리가 사용할 DB 접속 정보
var conStr={
url:"localhost:3306",
database:"nodejs",
user:"root",
password:"1234"
}
var server=http.createServer(function(request, response){
//결국 서버는 클라이언트의 다양한 요청을 처리하기 위해, 요청을 구분할 수 있어야 한다.
//결국 클라이언트가 서버에게 무엇을 원하는지에 대한 정보는 요청 url로 구분할 수 있다.
// 따라서 요청과 관련된 정보를 가진 객체인 request 객체를 이용하자
// console.log("클라이언트가 지금 요청한 주소는 ", request.url);
//도메인 : 포트번호까지를 루트로 부르자
/*
회원가입 폼 요청 : /member/form
회원가입 요청 : /member/join
회원목록(검색은 목록에 조건을 부여한 것임...) 요청 : /member/list
회원 상세 보기 요청 : /member/detail
회원 정보 수정 요청 : /member/edit
회원 정보 삭제 요청 : /member/del
*/
//혹여나, 파라미터가 get방식으로 전송되어 올 경우엔 request.url의 파라미터까지도 주소로
//간주될 수 있기 때문에 파라미터를 제거하자
// console.log("url파싱 결과는", url.parse(request.url));
var requestUrl=url.parse(request.url).pathname; //파라미터를 제외한 주소
switch(requestUrl){
case "/member/form" : registForm(request, response);break;
case "/member/join" : regist(request, response);break;
case "/member/list" : getList2(request, response);break;//getList2()로 변경됨
case "/member/detail" : getDetail(request, response);break;
case "/member/edit" : edit(request, response);break;
case "/member/del" : del(request, response);break;
}
});//실행시점
server.listen(7979, function(){
console.log("Server is running at 7979 port...")
});
|
cs |
* 사용할 모듈을 변수에 담아주기
* 클라이언트가 서버에게 무엇을 원하는지에 대한 정보는 요청 url로 구분 (request.url)
* url.parse로 파싱하여 파라미터 제거
* 요청 도메인 별 수행할 함수 구분
* ejs, 와 mysql은 외부모듈이기 때문에 npm(Node Pakage Manager) install로 설치
2. registForm()
1
2
3
4
5
6
7
8
|
function registForm(request, response){
fs.readFile("./regist_form.html","utf8",function(err, data){
//파일을 다 읽어들이면 응답정보 구성하여 클라이언트에게 전송
response.writeHead(200, {"Content-Type":"text/html;charset=utf-8"});
response.end(data);
});
}
|
cs |
* fs 모듈을 이용하여 regist_form.html 파일 읽어오기
* response.end로 data를 클라이언트에 전송
<결과물>
3. regist(request, response)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
function regist(request, response){
//클라이언트가 post방식으로 전송했기 때문에 http 데이터 구성 중 body를 통해 전송되어온다
//post 방식의 파라미터를 끄집어 내보자
// on이란 request 객체가 보유한 데이터 감시 메서드(즉, 데이터가 들어왔을때를 감지)
var content="";
request.on("data", function(param){
//param에는 body 안에 들어있는 데이터가 서버의 메모리에 버퍼로 들어오고,
// 그 데이터를 param이 담고있다.
content+=param; //버퍼의 데이터를 모으자
}); //post 방식의 데이터 감지
//데이터가 모두 전송되어, 받아지면 end 이벤트 발생
request.on("end",function(){
console.log("전송받은 데이터는", content);
console.log("파싱한 결과는",qs.parse(content));
//파싱한 결과는, 객체지향 개발자들이 쉽게 해성이 가능한 json으로 반환된다.
var obj=qs.parse(content);
//이 시점이 쿼리문을 수행할 시점임
//데이터베이스에 쿼리문을 전송하기 위해서는, 먼저 접속이 선행되어야한다
//접속을 시도하는 메서드의 반환값으로, 접속객체가 반환되는데, 이 객체를이용하여
//쿼리를 실행할 수 있다. 우리의 경우 con
var con=mysql.createConnection(conStr);
//쿼리문을 실행하는 메서드명은 query() 이다
var sql="insert into member(user_id, user_pass, user_name)";
sql+=" values('"+obj.user_id+"','"+obj.user_pass+"','"+obj.user_name+"')";
con.query(sql, function(err, fields){
if(err){
response.writeHead(500, {"Content-Type":"text/html;charset=utf-8"});
response.end("서버측 오류발생")
}else{
response.writeHead(200, {"Content-Type":"text/html;charset=utf-8"});
response.end("회원가입 성공<br><a href='/member/list'>회원 목록 바로가기</a>")
}
//db작업 성공여부와 상관없이 연결된 접속은 끊어야한다.
con.end(); //접속 끊기
});
});
}
|
cs |
* regist_form 에서 서버에 post방식으로 전송했기 때문에 post방식으로 받기
* request.on으로 "data"를 param에 받아서 content로 모으기 (이때 모아진 데이터는 쪼개진 데이터도 들어옴)
* request.on의 "end"로 받아 클라이언트에게 전송
* end 안에는 querystirng 모듈로 쪼개진 데이터를 json 으로 변경
* mysql에 접속하고 sql문 구성
* con 객체를 이용하여 query 실행
* 전부 수행되면 con 접속 끊기
※ 여기서 database안의 table은 미리 mysql에서 만들어 놓을것
3. getList2(request, response), getList1(request, response)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
//아래의 getList()보다 더 개선된 방법으로 요청을 처리하기 위해, 함수를 별도로 정의
function getList2(requset, response){
//클라이언트에 결과를 보여주기전에, 이미 DB연동을 하여 레코드를 가져와야한다.
var con=mysql.createConnection(conStr);
var sql="select * from member";
con.query(sql, function(err, record, fields){
//record 변수에는 json 들이 일차원 배열에 탑재되어 있다.
// console.log("record is", record);
//파일을 모두 읽으면 익명함수가 호출이되고, 이 익명함수 안에 매개변수에 읽혀진 데이터가
//매개변수로 전달된다
fs.readFile("./list.ejs", "utf8", function(err, data){
if(err){
console.log("list.html을 읽는데 실패")
}else{
response.writeHead(200, {"Content-Type":"text/html;charset=utf-8"});
//클라이언트에게 list.ejs를 그냥 그대로 보내지 말고, 서버에서 실행을 시킨 후, 그결과를
//클라이언트에게 전송한다.
// 즉, ejs를 서버에서 렌더링시켜야한다
var result=ejs.render(data, {
members:record
});//퍼센트 안에 들어있는 코드가 실행되어버린다
response.end(result);
}
});
}); //형식: sql문, 결과레코드, 필드정보
}
|
cs |
* mysql에 접속
* con 접속 객체에 쿼리실행 (이때 select문은 반환값이 필요하기 때문에 매개변수를 3개로 지정)
* 이때 record에는 form에서 넘어온 목록이 json으로 일차원 배열 형태로 생성
* 이때 record 값과 list.ejs의 값을 일치시키기 위해 렌더링
* record를 members에 담아줌
* 최종으로 result 값을 클라이언트에게 반환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
//이 방법은 디자인 마저도 프로그램 코드에서 감당하고 있기 떄문에,
// 유지보수성이 너무 낮다. 따라서 프로그램 코드와 디자인은 분리되어야 좋다.
// 따라서 아래의 방법은 두번다시는 사용하지 XX (개발규모가 좀 커질때)
function getList1(request, response){
//회원목록 가져오기
//연결된 DB 커넥션이 없으므로, mysql에 재접속하자
var con=mysql.createConnection(conStr);
var sql="select * from member";
//2번째 인수 : select 문 수행결과 배열
//3번째 인수 : 컬럼에 대한 메타 정보(메타 데이터란? 정보 자체에 대한 정보다)
// 여기서 컬럼의 자료형, 크기 등에 대한 정보
con.query(sql, function(err, result, fields){
// console.log("쿼리문 수행후 mysql로부터 받아온 데이터는", result);
// console.log("컬럼정보", fields);
//배열을 서버의 화면에 표 형태로 출력 연습해보자
var tag="<table width='100%' border='1px'>"
for(var i=0;i<result.length;i++){
var member=result[i];//한 사람에 대한 정보
var member_id=member.member_id;//pk
var user_id=member.user_id;//아이디
var user_name=member.user_name;//이름
var user_pass=member.user_pass;//등록일
var regdate=member.regdate
tag+="<tr>";
tag+="<td>"+member_id+"</td>";
tag+="<td>"+user_id+"</td>";
tag+="<td>"+user_name+"</td>";
tag+="<td>"+user_pass+"</td>";
tag+="<td>"+regdate+"</td>";
tag+="</tr>";
}
tag+="<tr>";
tag+="<td colspan='5'><a href='/member/form'>회원등록 폼</a></td>";
tag+="</tr>"
tag+="</table>"
response.writeHead(200, {"Content-Type":"text/html;charset=utf-8"});
response.end(tag);
con.end();
});
}
|
cs |
3. getDetail(request, response)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
function getDetail(request, response){
//한사람에 대한 정보 가져오기
//mysql에 접속을 먼저해야한다.
var con=mysql.createConnection(conStr);//접속 후 접속객체 반환
//아래의 쿼리문에서 사용되는 pk값은, 클라이언트가 전송한 값으로 대체해 버리자
/*get 방식은 , body를 통해 넘겨지는 post방식에 비해, header를 타고 전송되어 오므로,
추출하기 용이하다(마치 봉투의 겉면에 씌여진 글씨와 같다)*/
//개발자가 직접 url을 문자열 분석을 시도하기 보다는 보다 url을 전문적으로 해석 및 분석할 수 있는
//모듈에게 맡기면 된다. 그 역할을 수행하는 모듈이 바로 url 내부 모듈이다!
//querystring : pst 방식의 파라미터 추출
//url : get방식의 파라미터 추출
var param=url.parse(request.url, true).query; //true를 매개변수로 넘기면 json 형태로 파라미터를 반환
console.log("상세보기에 필요한 추출 파라미터는", url.parse(request.url, true).query);
var member_id=param.member_id; //json으로
console.log("클라이언트가 전송한 member_id의 파라미터 값은", member_id);
var sql="select * from member where member_id="+member_id;
//쿼리문 수행
con.query(sql, function(err, result, fields){
//쿼리문이 수행 완료된 시점이므로, 이때 사용자에게 상세페이지를 보여준다
console.log(result);
fs.readFile("./detail.ejs","utf8", function(err, data){
if(err){
console.log(err)
}else{
//클라이언트에게 html 을 읽어들인 내용을 보내주자
response.writeHead(200, {"Content-Type":"text/html;charset=utf-8"});
/*end 뒤에 data를 넣을경우 detail.html 에서 읽어온 내용을 넣어준다.
하지만 우리는 쿼리문의 result 값을 가져와야 하기떄문에 ejs파일로 변경하여
detail.ejs에서 %%로 렌더링해준다.*/
/*render의 대상은 ejs파일내의 %%퍼센트 영역만이다.
따라서 모든 render 작업이 끝나면 html 로 재구성하여 응답정보에 실어서
클라이언트에 응답을 실행한다*/
response.end(ejs.render(data, {
//result 값을 record에 넣어준다.
record: result[0] //한건이라 할지라도 , select 문의 결과는 배열이다. 따라서 0번째를 추출
}));
}
con.end(); //mysql과 연결 끊기
});
});
// var x=1;// 비동기방식이므로 readFile이 다 되기 전에도 실행이된다
}
|
cs |
* console.log(url.parse(request.url, true).query) == param
* console.log(param.member_id)
* console.log(result)
* 여기서 result 값으로 나온 결과는 배열이므로 result[0]을 record에 넣어주어야함
3. edit(request, response)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
function edit(request, response){
//쿼리문에 사용될 4개의 파라미터 값을 받아서 변수에 담아보자
//글 수정은 클라이언트로부터 post 방식으로 서버에 전송되기 때문에, 그 데이터가 body 에 들어있다.
//body에 들어있는 파라미터를 추출하기 위한 모듈이 querystring 이다
//post 방식의 데이터는 버퍼에 담겨오기 때문에, 이 따로따로 직렬화되어 분산된 데이터를
//일단 문자열로 모아서 처리해야한다.
var content="";
request.on("data", function(data){
// console.log(data)
content+=data;
});
request.on("end", function(){
//이 시점이 파라미터가 하나의 문자열로 복원된 시점이다.
var obj=qs.parse(content);
console.log("파싱한 결과는", obj);
var sql="update member set user_id='"+obj.user_id+"', user_pass='";
sql+=obj.user_pass+"', user_name='"+obj.user_name+"'";
sql+=" where member_id="+obj.member_id;
//쿼리문 실행하여 수정완료 하세요
//수정 완료 메세지 alert()으로 띄우고 상세보기 페이지를 다시 보여주기
//단 상세보기로 이동시 에러xxxx, 수정된 내용 반영되어 있어야함 var con=mysql.createConnection(conStr);
/*
DML(insert, update, delete):매개변수 2개
select:매개변수 3개
*/
con.query(sql, function(err, fields){
if(err){
console.log(err)
}else{
response.writeHead(200, {"Content-Type":"text/html;charset=utf-8"});
response.end( "<script>alert('수정완료');location.href='/member/detail?member_id="+obj.member_id+"'</script>");
}
con.end();
});
});
}
|
cs |
* 클라이언트가 post 방식으로 보냈기 때문에 문자열을 파싱하여 json으로 변경이 필요
* update sql문을 사용하여 sql을 구성
* con 접속객체에 query를 실행함
* 수정 완료시 alert가 뜨고 detail 창에서 member_id는 sql문에서 데려온 obj.member_id가 들어 있어야함
3. del(request, response)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
function del(request, response){
var param=url.parse(request.url, true).query;
console.log("클라이언트가 전송한 파라미터", param)
var sql="delete from member where member_id="+param.member_id;
//쿼리문 구성이 끝났으므로, mysql에 접속하여 해당 쿼리를 실행하자
var con=mysql.createConnection(conStr);//접속, 및 커넥션 객체 반환
//커텍션 객체는 접속 정보를 가진 객체이며, 이 객체를 통해 쿼리를 수행할 수 있다.
//또한 mysql 접속을 해제도 가능하다
//select문의 경우엔 결과를 가져와야 하기 때문에 가운데 인수, result가 필요하지만,
//delete, update, insert DML은 가져올 레코드가 없기 때문에 인수가 2개이면 충분하다.
con.query(sql, function(err, fields){
if(err){
console.log(err)
}else{
response.writeHead(200, {"Content-Type":"text/html;charset=utf-8"});
response.end("<script>alert('삭제완료');location.href='/member/list'</script>");
}
con.end();
});
}
|
cs |
* 파라미터의 member_id를 이용하여 sql문을 구성
* con 객체를 이용하여 쿼리문실행
* 삭제 완료시 alert가 뜨고 member/list창이 나타남
client 작업
1. regist_form.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 파비콘.. 윈도우 상 아이콘이다. -->
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
<style>
body {font-family: Arial, Helvetica, sans-serif;}
* {box-sizing: border-box;}
input[type=text],input[type=password] {
width: 100%;
padding: 12px;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
margin-top: 6px;
margin-bottom: 16px;
resize: vertical;
}
input[type=button] {
background-color: #4CAF50;
color: white;
padding: 12px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
}
input[type=submit]:hover {
background-color: #45a049;
}
.container {
border-radius: 5px;
background-color: #f2f2f2;
padding: 20px;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
/*JQuery 의 문법 형시 (누구를).어떻게, 누구자리에 올수있는 요소?
CSS의 selector가 올수 있다.*/
$(function(){ //onLoad되면
$($("input[type=button")[0]).click(function(){
//유효성 체크
if($("#user_id").val()==""){
alert("아이디를 입력하세요");
return; //이 함수를 호출한 곳으로 되돌아감
}
//if 조건을 만나지 않은 사람은 올바르게 입력한 사람이므로 서버에 데이터를 전송
$("form").attr("action", "/member/join"); //이 요청을 받을 서버의 주소
$("form").attr("method", "post"); //전송방식을 post로 지정
$("form").submit(); //폼 양식에 입력한 데이터를 서버로 전송
});
//두번째 버튼을 누르면, 목록 요청
$($("input[type=button")[1]).click(function(){
location.href="/member/list"; //get방식의 요청
});
});
</script>
</head>
<body>
<h3>Contact Form</h3>
<div class="container">
<!-- 폼 태그의 속성중 action은 이 폼양식을 전송할 대상 서버의 url을 명시할 수 있다. -->
<!--
id와 name 공통점과 차이점
공통점)문서내의 요소를 식별하기 위함
차이점)id-유일해야함, name-중복허용(배열로 인식)
name은 폼 전송시 전송 파라미터 역할을 한다, 즉 변수 역할을 한다
이때 전송 파라미터로서의 name의 이름은 주로 db의 테이블의 컬럼명과 일치시키는 규칙
-->
<form>
<label for="user_id">ID</label>
<input type="text" id="user_id" name="user_id" placeholder="Your ID..">
<label for="user_pass">Password</label>
<input type="password" id="user_pass" name="user_pass" placeholder="Your Password..">
<label for="user_name">Name</label>
<input type="text" id="user_name" name="user_name" placeholder="Your Name..">
<!-- input 태그의 type 중 submit은 디폴트로 전송기능이 포함되어 있기 때문에
클릭만으로도, 전송이 발생함. 따라서 일반 버튼화 시켜놓자 -->
<input type="button" value="Submit">
<input type="button" value="목록으로">
</form>
</div>
</body>
</html>
|
cs |
* input타입 button은 배열로 간주( [0], [1] 으로 사용가능)
* 그외 주석내용 참고
2. list.ejs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
table {
border-collapse: collapse;
border-spacing: 0;
width: 100%;
border: 1px solid #ddd;
}
th, td {
text-align: left;
padding: 16px;
}
tr:nth-child(even) {
background-color: #f2f2f2;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
//버튼 을 클릭하면, /member/list 페이지 요청
$(function(){
$("button").on("click",function(){
location.href="/member/form"; //get 방식
})
})
</script>
</head>
<body>
<h2><%="총회원수는 "+members.length%></h2>
<table>
<tr>
<th>PK</th>
<th>아이디</th>
<th>비밀번호</th>
<th>회원명</th>
<th>회원 가입일</th>
</tr>
<!-- 서버는 파일의 확장자가 ejs인 경우, html처럼 단순히 읽은 후 전송만 하는게 아니다.
즉, 확장자가 ejs인 경우엔, 퍼센트로 감싼 영역에 대해서는, 해석 및 실행하지 해버린다.
따라서 %영역은 서버측의 스크립트 언어로 볼 수있다. 참고로 우리가 지금까지 사용해왔던
script 태그안의 자바스크립트듣
-->
<%for(var i=0;i<members.length;i++){%>
<%var obj=members[i]; //배열에서 i번째 요소를 끄집어내서 회원 1명을 반환하자%>
<tr>
<td><%=obj.member_id%></td>
<td>
<a href="/member/detail?member_id=<%=obj.member_id%>"><%=obj.user_id%></a>
</td>
<td><%=obj.user_pass%></td>
<td><%=obj.user_name%></td>
<td><%=obj.regdate%></td>
</tr>
<%}%>
<tr>
<td colspan="5">
<button>가입</button>
</td>
</tr>
</table>
</body>
</html>
|
cs |
* ejs 렌더링으로 record값을 members에 담아줌
* members 배열을 for문을 이용하여 각 요소들을 끄집어내줌
* members의 member_id에는 링크를 걸어 detail 창으로 이동할수 있도록 함
3. detail.ejs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 파비콘.. 윈도우 상 아이콘이다. -->
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
<style>
body {font-family: Arial, Helvetica, sans-serif;}
* {box-sizing: border-box;}
input[type=text],input[type=password] {
width: 100%;
padding: 12px;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
margin-top: 6px;
margin-bottom: 16px;
resize: vertical;
}
input[type=button] {
background-color: #4CAF50;
color: white;
padding: 12px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
}
input[type=submit]:hover {
background-color: #45a049;
}
.container {
border-radius: 5px;
background-color: #f2f2f2;
padding: 20px;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
/*JQuery 의 문법 형시 (누구를).어떻게, 누구자리에 올수있는 요소?
CSS의 selector가 올수 있다.*/
$(function(){ //onLoad되면
//수정요청
$($("input[type=button")[0]).click(function(){
if(confirm("작성하신 내용을 수정할까요?")){
$("form").attr("action", "/member/edit"); //이 요청을 받을 서버의 주소
$("form").attr("method", "post"); //전송방식을 post로 지정
$("form").submit(); //폼 양식에 입력한 데이터를 서버로 전송
}
});
//삭제요청
$($("input[type=button")[1]).click(function(){
if(confirm("삭제하시겠습니까?")){
location.href="/member/del?member_id=<%=record.member_id%>";
}
});
//목록요청
$($("input[type=button")[2]).click(function(){
location.href="/member/list"; //get방식의 요청
});
});
</script>
</head>
<body>
<h3>회원정보 상세보기</h3>
<div class="container">
<!-- 폼 태그의 속성중 action은 이 폼양식을 전송할 대상 서버의 url을 명시할 수 있다. -->
<!--
id와 name 공통점과 차이점
공통점)문서내의 요소를 식별하기 위함
차이점)id-유일해야함, name-중복허용(배열로 인식)
name은 폼 전송시 전송 파라미터 역할을 한다, 즉 변수 역할을 한다
이때 전송 파라미터로서의 name의 이름은 주로 db의 테이블의 컬럼명과 일치시키는 규칙
-->
<%="ejs 파일로 넘겨받은 레코드는"+record %>
<form>
<label for="user_id">ID</label>
<input type="text" id="user_id" name="user_id" value="<%=record.user_id%>">
<label for="user_pass">Password</label>
<input type="password" id="user_pass" name="user_pass" value="<%=record.user_pass%>">
<label for="user_name">Name</label>
<input type="text" id="user_name" name="user_name" value="<%=record.user_name%>">
<!-- 이 텍스트 필드는, member_id 값을 넘기기 위한 용도이다 -->
<input type="hidden" name="member_id" value="<%=record.member_id%>">
<!-- input 태그의 type 중 submit은 디폴트로 전송기능이 포함되어 있기 때문에
클릭만으로도, 전송이 발생함. 따라서 일반 버튼화 시켜놓자 -->
<input type="button" value="수정">
<input type="button" value="삭제">
<input type="button" value="목록">
</form>
</div>
</body>
</html>
|
cs |
* 수정은 post방식, 삭제, 목록은 get 방식
* 각 input에 <%%>를 사용하여 record의 요소들을 넣어줌
'개발 > Node.js' 카테고리의 다른 글
Node.js 갤러리 게시판 (0) | 2021.04.27 |
---|---|
Node.js 댓글 게시판(ajax사용/Oracle 사용) (0) | 2021.04.13 |
Node.js 게시판(express 사용/Mysql 사용) (0) | 2021.04.08 |
Node.js 기초 (0) | 2021.04.01 |
댓글