numpy.ndarray.transpose
전치행렬을 구하는 메소드. 배열의 (i, j)번째 원소를 (j, i)번째 원소로 바꾼 뒤 리턴한다.
A = numpy.array([[1, 2, 3], [4, 5, 6]]) print(A.transpose())
dirt enthusiast

JBB: An Artblog!

❣ Chile in a Photography ❣

tannertan36
todays bird
cherry valley forever
sheepfilms
noise dept.

izzy's playlists!

ellievsbear
🪼

⁂
No title available
Stranger Things
i don't do bad sauce passes
we're not kids anymore.

roma★
2025 on Tumblr: Trends That Defined the Year
No title available
PUT YOUR BEARD IN MY MOUTH
seen from United States
seen from Iraq

seen from United States

seen from United Kingdom

seen from Australia

seen from United States

seen from Germany
seen from Australia
seen from United States

seen from United States
seen from Italy
seen from South Africa

seen from United States
seen from United States
seen from Italy
seen from United States

seen from United States
seen from Netherlands
seen from United States

seen from United States
@jhgyun
numpy.ndarray.transpose
전치행렬을 구하는 메소드. 배열의 (i, j)번째 원소를 (j, i)번째 원소로 바꾼 뒤 리턴한다.
A = numpy.array([[1, 2, 3], [4, 5, 6]]) print(A.transpose())
JSP, Oracle을 이용한 쇼핑몰 예제3
4. 그 외 게시판들
관리자를 클릭하여 관리자 페이지로 이동하였을 때에도 메인화면과 유사한 방법으로 테이블을 생성하여 purchase_list의 정보를 불러와 매출에 관한 정보를 출력합니다. purchase_list의 경우 사용자가 구매할 때마다 데이터가 저장되므로 같은 사용자가 구입한 물품 수량을 합쳐 출력할 수 있게 SQL문을 만듭니다.
String sql = "select itemname, id, sum(price)/sum(totalnum), sum(totalnum),sum(price) from purchase_list group by itemname,id order by id";
관리자는 회원현황도 관리 할 수 있습니다. 회원현황을 클릭하게 되면 member_info에 있는 정보를 불러와 출력합니다. del의 O버튼을 이용하여 사용자의 정보를 삭제 할 수 있습니다.
<% //parameter를 통해 받은 id로 member_info에 해당하는 id의 정보를 삭제하여 줍니다. //삭제 후 member.jsp로 이동합니다 String id = request.getParameter("id"); String sql = "delete from member_info where id = '"+id+"'"; ora or = new ora(); or.dbconnection(); or.db_Update(sql); or.db_close(); response.sendRedirect("member.jsp"); %>
판매자인 경우 물품을 등록할 수 있습니다. 이전 예제에서 배운 upload file을 이용해 보았습니다. input type의 file을 이용하여 선택한 파일을 multipart/form-data로 업로드하고, 가격과 수량 정보도 함께 입력 받습니다.
<form action="insertitem.jsp" method = "post" enctype = "multipart/form-data"> Id:<input type = "text" name = "id" value = <%=session.getAttribute("userId") %> readonly><br/> Item:<input type = "file" name = "file"><br/> Price:<input type = "text" name = "price" ><br/> Totalnum:<input type = "text" name = "totalnum" ><br/> <input type = "submit" value = "저장"> <input type = "reset" value ="초기화"><br/> <a href="main.jsp">돌아가기</a>
메인 화면에서 상품 이미지를 클릭하여 상품에 대한 게시글을 보는 페이지로 이동할 수 있습니다. 상품 게시글의 경우 이전 게시판 예제를 이용하였습니다. itemname을 파라미터로 받아 게시판 페이지에서 해당 상품에 대한 글 정보만을 DB를 이용해 불러옵니다.
<a href = 'list.jsp?itemname=<%=itemname%>'><img src="../shoppingmall/<%=itemname%>.jpg" width="200" border="0" /></a><br/><% if(request.getParameter("itemname")!= null){ session.setAttribute("itemname", request.getParameter("itemname")); } String itemname = (String)session.getAttribute("itemname"); String userid = (String) session.getAttribute("userId"); %>String sql = "select * from board_info where itemname = '" + itemname + "' order by seq desc";
메인 화면 하단에 있는 구매하기나 장바구니 버튼을 클릭할 경우, checkbox와 select를 parameter로 각각의 페이지에 submit합니다. 장바구니와 구매하기창은 우선 페이지로 이동하게 되면, parameter를 통해 입력받은 정보들을 basket_info나 purchase_info에 id, itemname별로 저장합니다.
<%//장바구니 클릭시 String id = (String) session.getAttribute("userId"); ora or = new ora(); or.dbconnection(); Enumeration enums = request.getParameterNames(); while (enums.hasMoreElements()) { String name = (String) enums.nextElement(); if (name.startsWith("chk")) { String value = request.getParameter(name); int selectNum = Integer.parseInt(request.getParameter("num_" + value)); String sql = "select count(*) from basket_info where id = '" + id + "'and itemname = '" + value + "'"; or.dbconnection(); ResultSet rs = or.db_select(sql); rs.next(); if (rs.getInt("count(*)") > 0) { sql = "update basket_info set selectnum = " + selectNum + " where id = '" + id + "'and itemname = '" + value + "'"; } else { sql = "insert into basket_info values ('" + id + "','" + value + "','" + selectNum + "')"; } or.db_select(sql); } } or.db_close(); %>
장바구니 창의 경우, basket_info와 item_info의 정보들을 통해 상품명, 선택한 갯수, 가격, 재고량을 DB에서 불러와 출력합니다.
String sql = "select a.itemname, a.selectnum, b.price, b.totalnum from basket_info a, item_info b where a.id ='" + id + "' and a.itemname = b.itemname";
마지막 Column에는 삭제버튼을 두어 해당 상품을 삭제할 수 있습니다.
구매하기 창의 경우, 우선
장바구니 화면에서 구매하기를 클릭한 경우와 메인화면에서 구매하기를 클락한 경우를 나눠 알맞은 sql을 입력하고 DB에서 정보를 불러와 테이블에 출력합니다. 화면 하단에는 구매하는 상품의 총 가격을 계산하여 출력합니다.
if(sql !=null){//sql이 null인 경우는 basket.jsp에서 이동하여 parameter로 받은 정보가 없는 경우 sql = "select a.itemname, a.selectnum, b.price, b.totalnum from purchase_info a, item_info b where a.id ='" + id + "' and a.itemname = b.itemname"; }else{ sql = "select a.itemname, a.selectnum, b.price, b.totalnum from basket_info a, item_info b where a.id ='" + id + "' and a.itemname = b.itemname"; } ResultSet rs = or.db_select(sql); while (rs.next()) { num += 1; String itemname = rs.getString("itemname"); int selectNum = rs.getInt("selectNum"); int totalNum = rs.getInt("totalnum"); int price = rs.getInt("price"); totalprice += price * selectNum; %> <tr> <td align="center"><%=num %></td> <td align="center"><%=itemname%></td> <td align="center"><a href='list.jsp?itemname=<%=itemname%>'><img src="../shoppingmall/<%=itemname%>.jpg" border="0" width="30%" heigth="30%" /></a></td> <td align="center"><%=selectNum%></td> <td align="center"><%=totalNum%></td> <td align="center"><%=price * selectNum%></td> </tr> <% } or.db_close(); %> </table> <hr width='600' size='2' noshade> <!-- 현재 테이블에 출력된 물품들의 합계를 계산하여 출력합니다. --> <h2> 합계 :<%=totalprice%></h2> <input type="submit" value="구매완료하기" onclick="form.action='purchasego.jsp';"> <input type="submit" value="뒤로가기"> <hr width='600' size='2' noshade>
구매완료하기 버튼을 클릭할 경우 사용자 id, itemname, price, date, totalnum을 purchase_list에 저장합니다. 장바구니와 바로 구매하기의 경우의 두 가지로 나누어 insert를 수행합니다.
String id = (String)session.getAttribute("userId"); Date da = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String p_date = sdf.format(da); String sql = "select count(*) from purchase_info"; ora or = new ora(); or.dbconnection(); ResultSet rs = or.db_select(sql); rs.next(); if (rs.getInt("count(*)") > 0) { sql = "insert into purchase_list b (seq, id, price, p_date, itemname, totalnum) "+ "select purchase_seq.nextval, a.id, c.price*a.selectnum, '"+p_date+"', a.itemname, a.selectnum "+ "from purchase_info a, item_info c where a.id = '"+id+"' and a.itemname = c.itemname"; or.db_Update(sql); }else{ sql = "insert into purchase_list b (seq, id, price, p_date, itemname, totalnum) "+ "select purchase_seq.nextval, a.id, c.price*a.selectnum, '"+p_date+"', a.itemname, a.selectnum "+ "from basket_info a, item_info c where a.id = '"+id+"' and a.itemname = c.itemname"; or.db_Update(sql); sql = "delete from basket_info where id = '"+id+"'"; or.db_Update(sql); }
구매가 완료된 경우 purchase_info에 저장된 정보들을 지워주고 사용자의 총 구입액을 계산하여 해당 가격에 맞는 class로 update합니다.
sql = "delete from purchase_info"; or.db_Update(sql); sql = "update member_info set class = (select class from class_info where condition = (select max(condition) from class_info where condition < (select sum(price) from purchase_list where id = '"+id+"')))"; or.db_Update(sql); or.db_close(); // response.sendRedirect("main.jsp");
IT기술을 정치에 적용한 예
TensorFlow is an Open Source Software Library for Machine Intelligence
Brigade is a new way to find allies on the issues you care about most.
브리게이드. IT기술을 정치에 적용한 사례.
HTML5 추가 요소
section element : 문서나 어플리케이션의 섹션을 나타낸다. 과거 div, span, id, class만으로 전체 문서 구조를 만들던 것에 비해서 보다 명시적으로 구조를 제작할 수 있다.
nav element : 네비게이션을 위해 구성된 섹션, 책갈피 기능
article element : 문서 내의 독립적인 글, 블로그의 글, 뉴스 사이트의 뉴스
aside element : 주 내용과 관련이 적은 내용
header, footer element
hgroup, h1~h6 elements
time element : 기계가 인식할 수 있는 시간을 이용하여 날짜나 시간을 나타낸다.
b element : 문서상에서 중요한 의미는 없지만 문체적으로 다르게 나타내어져야 하는 텍스트를 위해서 사용된다. 상품 설명안의 상품의 이름, 문서의 특정 키워드
i element
input element : HTML5 Demo
progress element : 상태바
meter : 분량이나 수량을 나타낼 때 사용된다.
datalist : 미리 정의된 option 묶음을 나타낸다.
details, summary element: 사용자가 확인할 수 있는 추가 정보를 나타낸다.
video, audio element : 멀티미디어 요소를 웹페이지에 넣는 기능. API 제공
canvas element : 비트맵 이미지 콘텐츠를 제공하기 위한 요소. 제공되는 컨텐츠의 자유로운 재가공이 가능한 API 제공. 컨텐츠에 적합한 다른 요소가 있을 경우에는 canvas 요소를 사용해서는 안된다.
Canvas 예제
Javascript를 사용하여 페이지에서 사각형 영역에 직접 그래픽을 그린다.
경로, 사각형, 원, 문자를 그리기 위한 method가 있음.
좌표는 왼쪽 상단이 x = 0, y = 0
Canvas를 사용하기 위해서 HTML 파일에서 Canvas를 정의해야 합니다.
<body> <canvas id = "myCanvas" width="400" height="200"></canvas> </body>
JavaScript에는 Canvas 태그에 엑세스하고 HTML5 Canvas API와 통신하여 그래픽을 그리는 코드를 작성해야 합니다. JavaScript는 Canvas id를 사용하여 Canvas를 식별합니다.
var canvas = document.getElementById("myCanvas"); //myCanvas에 해당하는 모든 element를 저장합니다. var context = canvas.getContext("2d"); //canvas에서 사용할 Context를 지정합니다.
선을 그리기 위해 Canvas는 beginPath(), moveTo(), lineTo()를 이용합니다. 현재 경로를 재설정하고, 선의 시작점과 끝점을 정해줍니다.
//blue line with round ends context.beginPath();//현재 경로를 재설정 context.moveTo(50, 50);//새 하위 경로가 시작하는 지점을 표시 context.lineTo(300,50);//선의 끝점을 표시 context.lineWidth = 10;//선의 굵기 변경 context.strokeStyle = "#0000FF";//선의 색상 변경 context.lineCap = "round";//선의 끝부분을 설정. 둥글거나 네모진 경우 선의 너비만큼 길이가 증가. butt가 디폴트. context.stroke();//실제로 캔버스의 선을 칠한다.
사각형을 그리기 위해 아래의 세가지 method를 이용합니다.
context.fillRect(25,25,50,50);//채워진 사각형을 그린다. context.clearRect(35,35,30,30);//주어진 영역을 지운다. context.strokeRect(100,100,50,50);// 사각형의 윤곽선을 그린다.
원을 그리기 위해 arc(centerX, centerY, radius, startAngle, endAngle, anticockwise)를 이용합니다. 여기서 centerX, Y는 원의 중심 좌표, radius는 반지름을 뜻합니다. startAngle과 endAngle은 라디안 단위로 호의 시작점과 끝점을 똣하고, anticlockwise는 boolean값으로, 해당 값이 true면 시계 반대 방향, false면 시계 방향을 뜻합니다.
function drawCircle(){ var canvas = document.getElementById("myCanvas"); var context = canvas.getContext("2d"); context.moveTo(350,350); var centerX = 450; var centerY = 375; var radius = 70; context.beginPath(); context.arc(centerX,centerY,radius,0,2*Math.PI,false); context.fillStyle = "#800000"; context.fill();//원 안을 칠한다. context.lineWidth = 5; context.strokeStyle = "black"; context.stroke(); };
원 외에도 2차 곡선, 베지어 곡선도 method를 통해 그릴 수 있습니다. 2차 곡선은 시작점과 제어 지점(controlX,Y), 끝점(endX,Y)으로 정의합니다. 베지어 곡선의 경우에는 두 개의 제어 지점이 있습니다.
context.moveTo(X,Y); context.quadraticCurveTo(controlX,controlY,endX,endY);
context.moveTo(X,Y); context.bezierCurveTo(controlX1, controlY1, controlX2, controlY2, endX, endY);
이동, 크기 조정 및 회전은 각각 translate(), scale(), rotate() method를 이용합니다. translate(x,y)에서 x,y는 이미지가 움직여야할 픽셀의 수를 뜻합니다. scale(x,y)에서 x,y는 원본 크기 배율입니다. rotate(angle)은 angle의 크기에 맞춰 이미지를 돌립니다.
Canvas에서 그라데이션은 createLinearGradient()와 ceateradialGradient() 두가지 유형을 사용할 수 있습니다.
createLinearGradient(startX,startY,endX,endY)은 시작점과 끝점의 좌표를 가집니다.
ceateradialGradient(x0,y0,r0,x1,y1,r1)은 첫 원의 중심 좌표와 반경, 두 번째 원의 중심 좌표와 반경을 가집니다.
addcolorStop(offset, color)를 이용하여 0과 1 사이의 오프셋을 지정할 수 있으며, 이를 통해 해당 color의 표시 중지를 지정해 다양한 색상으로 전환이 가능합니다.
//Gradient on a diagonal var fillColordiagonal = context.createLinearGradient(50, 200, 100, 450); //Gradient colors fillColordiagonal.addColorStop(0.2,"red"); fillColordiagonal.addColorStop(0.4,"black"); fillColordiagonal.addColorStop(0.6,"green"); fillColordiagonal.addColorStop(0.75,"yellow"); //Assign gradient object to fillstyle context.fillStyle = fillColordiagonal; //Draw rectangle context.fillRect(50,225,100,250); //Draw radial gradient fillColorRadial = context.createRadialGradient(450, 300, 0, 450, 300, 200); fillColorRadial.addColorStop(0,"red"); fillColorRadial.addColorStop(0.2,"black"); fillColorRadial.addColorStop(0.4,"green"); fillColorRadial.addColorStop(0.7,"yellow"); context.fillStyle = fillColorRadial; context.rect(300,200,500,400); context.fill();
drawImage() method를 이용하면, 이미지를 잘라서 원하는 크기로 배치할 수 있습니다.
drawImage(image, dx, dy)는 해당 좌표에 이미지를 그립니다.
drawImage(image, dx, dy, dw, dh)는 해당 좌표에 이미지를 주어진 너비와 높이에 맞게 그립니다.
drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh)는 원본 이미지의 해당 좌표부터 시작하는 사각형 영역을 오려내어 주어진 좌표에 너비와 높이에 맞게 이미지를 그립니다.
var imageObj = new Image(); imageObj.onload = function(){ //draw image to cover the entire canvas context.drawImage(imageObj,0,0,600,400); //draw small image in bottom right corner context.drawImage(imageObj, 300, 200, 300, 200);
}
HTML5
마크업 기본 규칙
짝이 있는 태그는 열었으면 반드시 닫아 준다.
독타입을 반드시 선언합니다. 현재 사용하는 html버전에서 어떤 태그를 사용할 수있는지 알려준다.
strict - 웹표준을 엄격히 사용하고 싶을 때(font, center, frame등 14가지의 엘리먼트 사용하지 않음) transitional - 웹표준과 초기방식의 절충(frame, frameset 엘리먼트를 사용하지 않음) frameset - 초기방식 그대로 사용
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
캐릭터셋을 반드시 선언한다. Page Encoding
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
대소문자 구분 X
특수 기호 엔티티 코드 사용 www.entitycode.com
태그
element : html을 구성하는 요소, 영역을 나눔 ex) HTML, head, title, body...
attribute : 각각의 element의 속성 ex) align, bgcolor, height...
value/keyword : attribute의 Value, Keyword ex)red, left...
Content : 실질적인 내용
색상
RGB code : 8bit씩을 이용하여 256 red, 256 green, 256 blue를 이용해 색상을 표현.
web safe color : 각각의 rgb에서 3의 배수만 추려 조합하는 방법. 사용자 환경에 따라 변색되어 보일 수 있는 가능성이 적음.
named color : 명사 형태로 부르는 색상의 이름을 그대로 사용.(띄어쓰기를 하면 전혀 알 수 없는 색이 나옴)
길이 단위
px : pixel 단위.
% : Percentage. 자기가 속해 있는 상위 Tag의 큭기 또는 상속받은 값에 대한 백분율 상대 단위.
<a>
href : 연결되는 url 또는 문서의 책갈피(Bookmark). 절대경로 또는 상대경로로 표시한다. 전체 경로를 다입력해야 절대경로로 이동한다.
target : 문서를 띄울 창 또는 프레임 이름. _self, _blank, _top, _parent
emailLink
<img>
src : source. 이미지 경로를 가져오는 속성
alt : alternate Text. 이미지의 내용을 판단하기 위해 사용. 이미지 설명(웹표준 필수)
align : 그림이 container 속에 들어 갔을 때의 정렬 위치. 기본값은 middle-left
width : 가로크기 설정
height : 세로크기 설정
border : 이미지 테두리 두께 설정(웹표준에서 사용하면 안됨)
<table>
align : 테이블의 정렬 상태를 설정
backgroungd : 배경이 될 이미지 파일의 경로를 지정
bgcolor : 배경 색상을 지정
bordercolor : 테이블의 외곽선의 색상을 지정
border : 테이블의 외곽선의 두께를 설정
bordercolordark : 표의 외곽선을 3차원으로 만들때 사용되는 어두운 색을 지정
bordercolorlight : 표의 외곽선을 3차원으로 만들 때 사용되는 밝은 색을 지정
cellpadding : 셀 경계와 셀 안의 내용과의 간격을 지정
cellspacing : 셀과 셀 사이의 간격을 지정
cols : 테이블에 들어갈 열의 개수를 지정
class : 스타일 시트의 서식을 적용
frame : 외곽선의 형태를 지정 border="1" 이상일 때 사용가능
height : 테이블 높이를 설정
width : 테이블 넓이를 설정
hspace : 테이블 위아래로 표 외곽 내용들과의 간격을 설정
id : class와 동일한 기능. 다만 홈페이지 내에서 한번만 명시 할 수 있습니다.
rules : 테이블에서 셀 사이에 경계선을 설정합니다.
style : 적용될 스타일 시트를 지정
Division Marker
w3c의 설명에 의하면 <div>, <span>를 'Generic language & Style container'라고 설명하고 있다. 일반적인 언어나 스타일을 담는 용기라는 뜻이다. div는 content와 관계 없이 영역의 크기가 있고, span은 content의 크기만큼의 영역을 가진다.
JSP, Oracle을 이용한 쇼핑몰 예제 2
3. 메인 화면
메인 페이지에서는 우선 사용자의 id와 job을 session Attribute에서 불러와 저장합니다.
<% String id = (String)session.getAttribute("userId"); String job = (String)session.getAttribute("userJob"); //session Attribute에 저장된 현재 사용자의 id와 job을 불러와 저장합니다 %>
우측 상단에 사용자의 id와 job, 그리고 로그아웃 href를 출력하고, id를 클릭할 경우, 현재 사용자의 정보를 보여주는 페이지로 이동하고 관리자 또는 판매자, 로그아웃을 클릭하는 경우에도 이와 유사한 동작을 수행합니다.
<div style="text-align: right"> <a href=member_info.jsp><%=id%></a>님 안녕하세요! <%if(job.equals("manager")) {%> <a href=manager.jsp>관리자</a> <% } else if(job.equals("seller")){%> <a href=seller.jsp>판매자</a> <%}%> <a href=login.jsp>로그아웃</a> </div>
상품 목록은 DB에 접속하여 item_info에 있는 모든 데이터를 불러와 테이블에 상품 이미지, 가격, 총 수량을 출력합니다. 상품 이미지는 img src를 통해 불러옵니다. 이미지에 href를 걸어 클릭시 해당 item에 대한 게시글을 볼 수 있습니다.
<form action = "basket.jsp" method = "post"> <center> <hr width='600' size='2' noshade> <h2>물품 목록</h2> <hr width='600' size='2' noshade> <br /> <br /> <!-- 물품 목록 테이블 생성 --> <table width='700' border='1'> <tr> <% ora or = new ora(); String sql = "select * from item_info"; or.dbconnection(); ResultSet rs = or.db_select(sql); int count = 0; while (rs.next()) { count += 1; String itemname = rs.getString("itemname"); int price = rs.getInt("price"); int totalnum = rs.getInt("totalnum"); %> <td align="center" width="20%"> <!-- 이미지에 href를 걸어 클릭시 해당 item에 대한 게시글을 볼 수 있습니다 --> <a href = 'list.jsp?itemname=<%=itemname%>'><img src="../shoppingmall/<%=itemname%>.jpg" width="200" border="0" /></a><br/> 가격 : <%= price %><br/> <!-- checkbox와 select의 경우 name을 itemname이 포함된 양식으로 저장합니다--> 선택 : <input type = "checkbox" name = <%="chk_"+itemname %> value = <%= itemname%>></input> 수량 : <select name = <%="num_"+itemname %>> <%for(int i = 1;i<=totalnum;i++){ %> <option><%=i %></option> <%} %> </select> </td> <% if (count % 4 == 0) { %> </tr><tr> <%//4개의 cell이 생성된 경우 한 줄을 내려줍니다. } } or.db_close(); </tr> </table> </center>
구매하기 버튼과 장바구니 버튼을 submit을 이용해 구현하여 checkbox와 select의 value를 받도록 합니다. 구매하기의 경우 purchase.jsp, 장바구니의 경우 basket.jsp로 이동합니다.
<center> <hr width='600' size='2' noshade> <input type="submit" value="구매하기" onclick="form.action='purchase.jsp';"> <input type="submit" value="장바구니" > <hr width='600' size='2' noshade> <br /> </center>
id를 클릭하게 되면 현재 사용자의 정보를 출력하는 페이지로 이동합니다. 페이지를 불러오면 우선 session의 Attribute에 저장된 사용자의 정보를 불러와 저장합니다.
String id = (String)session.getAttribute("userId"); String pw = (String)session.getAttribute("userPw"); String name = (String)session.getAttribute("userName"); String phonenum = (String)session.getAttribute("userPhonenum"); String address = (String)session.getAttribute("userAddress"); String m_class = (String)session.getAttribute("userClass");
테이블을 이용하여 저장된 사용자의 정보를 출력합니다. id나 name, class의 경우 사용자가 임의로 수정할 수 없게 readonly option을 적용합니다. 사용자가 수정을 원할 경우, 해당 내용을 수정 후에 수정 버튼을 누르면 수정된 내용이 DB에 저장이 됩니다.
<form action = updatejoin.jsp method = post> <table width='200' border='1'> <tr> <td>id</td> <td><input type = "text" value =<%=id %> name = "id" readonly></td> </tr> <tr> <td>pw</td> <td><input type = "password" value =<%=pw %> name = "pw"></td> </tr> <tr> <td>name</td> <td><input type = "text" value =<%=name %> name = "name" readonly></td> </tr> <tr> <td>phonenum</td> <td><input type = "text" value =<%=phonenum %> name = "phonenum"></td> </tr> <tr> <td>address</td> <td><input type = "text" value =<%=address %> name = "address"></td> </tr> <tr> <td>class</td> <td><input type = "text" value =<%=m_class %> name = "m_class" readonly></td> </tr> </table> <!-- 수정을 클릭하게 되면 updatejoin.jsp를 호출합니다 --> <input type = "submit" value = "수정"> <a href='main.jsp'>돌아가기</a>
수정은 우선 SQL문을 통해 DB에 정보를 update한 후에 바뀐 사용자 정보에 맞게 session의 Attribute를 수정합니다.
<% String id = request.getParameter("id"); String pw = request.getParameter("pw"); String name = request.getParameter("name"); String phonenum = request.getParameter("phonenum"); String address = request.getParameter("address"); String m_class = request.getParameter("m_class"); String sql = "update member_info set id = '"+id+"', pw = '"+pw+"',phonenum = '"+phonenum+"',address = '"+address+"',class = '"+m_class+"', name = '"+name+"' where id = " +id+""; ora or = new ora(); or.dbconnection(); or.db_Update(sql); or.db_close(); session.setAttribute("userPw", pw); session.setAttribute("userPhonenum", phonenum); session.setAttribute("userAddress", address); response.sendRedirect("main.jsp"); %>
JSP, Orcle을 이용한 쇼핑몰 예제
DB Table 생성
member_info : 사용자 정보 Table
id, pw, name, phonenum, address, class, job
purchase_list : 구매 목록 Table
seq, id, itemname, price, totalnum, p_date
basket_info : 장바구니 정보 Table
id, itemname, price, totalnum
purchase_info : 구매하기 정보 Table
id, itemname, price, totalnum
board_info : 게시판 정보 Table
seq, id, title, content, w_date
item_info : 물품 정보 Table
itemname, price, totalnum
class_info : 회원 등급 정보 Table
class, condition
- Oracle Database에 각각의 테이블을 생성한 후, class_info에 해당 등급에 대한 기준 금액 정보를 insert를 통해 저장합니다.
insert into class_info values('VVIP',2000000); insert into class_info values('VIP',1000000); insert into class_info values('TOP',300000); insert into class_info values('BEST',100000); insert into class_info values('NEW',0);
같은 방법으로 item_info에도 물품 목록 정보를 저장합니다.
insert into item_info values('pants2',990000, 50); insert into item_info values('pants1',345000, 9);
2. 로그인
두 개의 input을 이용해 id, password를 입력받아 로그인을 수행합니다. 로그 아웃을 하게 될 경우 session.invalidate()를 이용해 기존의 사용자 정보를 삭제합니다.
<%session.invalidate(); //로그아웃시 기존의 사용자 정보를 지워준다. %> <body><center> <h1>환영합니다</h1><br/> <form action="login_chk.jsp" method = "post"> ID : <input type = "text" name = "id"><br/> Password : <input type = "password" name = "pw"><br/> <input type = "submit" value = "로그인" name = "login"> <input type = "button" value = "회원가입" name = "join" onclick="openPage('join.jsp')"/> </form> </center> <!--버튼의 onclick을 이용해 함수 openPage를 호출.--> <script type="text/javascript"> function openPage(pageURL) { window.location.href = pageURL; } </script> </body>
로그인 버튼을 클릭하면 login_chk.jsp로 id와 password parameter를 submit하게 됩니다. login_chk에서는 id와 password가 일치하는 데이터를 member_info에서 불러와 확인합니다.
<% //--로그인 구현 부분-- String id = request.getParameter("id"); String pw = request.getParameter("pw"); ora or = new ora(); String sql = "select * from member_info"; or.dbconnection(); ResultSet rs = or.db_select(sql); //select로 member_info table의 모든 정보를 불러온다. while (rs.next()) { String DBid = rs.getString("id"); String DBpw = rs.getString("pw"); String DBname = rs.getString("name"); String DBphonenum = rs.getString("phonenum"); String DBaddress = rs.getString("address"); String DBclass = rs.getString("class"); String DBjob = rs.getString("job");
if(id.equals(DBid)&&pw.equals(DBpw)){
일치하는 데이터가 존재하면 해당 사용자의 정보를 session의 Attribute에 저장합니다.
session.setAttribute("userId", DBid); session.setAttribute("userPw", DBpw); session.setAttribute("userPhonenum", DBphonenum); session.setAttribute("userName", DBname); session.setAttribute("userAddress", DBaddress); session.setAttribute("userClass", DBclass); session.setAttribute("userJob", DBjob);
id나 password가 불일치 할 경우에 메세지를 출력하고 로그인 창으로 복귀합니다. 로그인에 성공할 경우 main.jsp로 페이지가 이동합니다.
}else if(id.equals(DBid)&&!pw.equals(DBpw)){ out.println("<script>alert(\"비밀번호불일치\");history.back();</script>"); }else if(id.equals(DBid)&&pw.equals(DBpw)){ out.println("<script>alert(\"아이디불일치\");history.back();</script>"); } } or.db_close(); if(session.getAttribute("userId")==null){ out.println("<script>alert(\"회원정보가 없습니다\");history.back();</script>"); }else{ response.sendRedirect("main.jsp"); //로그인에 성공시 main.jsp를 호출한다. }
회원가입 버튼을 클릭하면, 사용자의 정보를 입력받고, 저장 버튼을 클릭하여 회원가입을 완료할 수 있습니다. 회원가입 페이지 join.jsp에서 input을 통해 각종 회원 정보를 입력받고 get방식으로 joingo.jsp에 넘깁니다.
<form action="joingo.jsp" type = "get"> id : <input type = "text" name = "id"><br/> password:<input type = "password" name = "pw"><br/> name : <input type = "text" name = "name"><br/> phone number : <input type = "text" name = "phonenum"><br/> address : <input type = "text" name = "address"><br/> <br/> <input type = "submit" value = "저장"> <input type = "reset" value ="초기화"><br/>
joingo.jsp에서는 join.jsp에서 입력받은 정보를 getParameter를 통해 값을 받아오고, sql문을 통해 DB에 저장합니다. sql문을 통해 insert를 수행하고 나면 login화면으로 돌아갑니다.
String id = request.getParameter("id"); String pw = request.getParameter("pw"); String name = request.getParameter("name"); String phonenum = request.getParameter("phonenum"); String address = request.getParameter("address"); String sql = "insert into member_info values('"+id+"','"+pw+"','"+name+"','"+phonenum+"','"+address+"','NEW', 'CUSTOMER')"; ora or = new ora(); or.dbconnection(); or.db_Update(sql); or.db_close(); response.sendRedirect("login.jsp"); %>
기초 ML : Python Numpy
Numpy
Python 언어에서 기본으로 지원하지 않는 array (배열) 혹은 matrix (행렬) 의 계산을 쉽게 할 수 있다
기계학습에서 많이 사용되는 해석학 및 선형대수학에 관련된 수식들을 Python 위에서 쉽게 프로그래밍 할 수 있다
Scipy
Python의 라이브러리임과 동시에 계산과학을 위한 시스템을 총칭.
Numpy, Matplotlib (그래프를 그리는 데에 주로 사용됨) 외에도 IPython (Web에서 작동하는 Python의 인터랙티브 쉘) 및 Pandas (데이터 저장 및 분석을 위한 라이브러리) 패키지들로 이루어져 있음
numpy.ndarray
n차원 배열 설계 : [ , ] 로 구분
numpy.array([[1, 2], [3, 4]])
numpy.ndarray.shape
배열의 모양을 리턴 : (2,2), (3,3)
A = numpy.array([[1, 2, 3], [4, 5, 6]]) print(A.shape)
numpy.ndarray.reshape
배열의 모양을 바꿈 : 파라미터는 튜플
A = numpy.array([[1, 2, 3], [4, 5, 6]]) print(A) B = A.reshape((3, 2)) print(B)
numpy.concatenate
여러 개의 배열을 한 개로 합침 : X축과 Y축 방향으로 합치는 두가지 방법이 있음 이것은 numpy.concatenate에 들어가는 axis 라는 파라미터를 통해 제어함
axis = 0: Y축 (세로 방향) 으로 설정
axis = 1: X축 (가로 방향) 으로 설정
A = numpy.array([[1, 2], [3, 4]]) B = numpy.array([[5, 6], [7, 8]]) C_Y = numpy.concatenate((A, B), axis = 0) print(C_Y) C_X = numpy.concatenate((A, B), axis = 1) print(C_X)
numpy.split
배열을 여러 개의 크기로 나눔 : X축, Y축을 기준으로 나누는 두 가지의 방법이 있음(numpy.concatenate의 axis와 동일)
두 번째 파라미터에 숫자 N을 넣으면 배열을 N개 동일한 크기의 배열들로 나누고 리스트를 넣으면 리스트 안의 숫자들 번째 인덱스에서 배열을 나눔
A = numpy.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13 ,14 ,15, 16]]) print(A) slice_Y_equal_size = numpy.split(A, 2, axis = 0) print(slice_Y_equal_size[0]) print(slice_Y_equal_size[1]) slice_X_different_sizes = numpy.split(A, [2, 3], axis = 1) print(slice_X_different_sizes[0]) print(slice_X_different_sizes[1]) print(slice_X_different_sizes[2])
numpy.sum
배열에 있는 모든 원소의 합을 계산해서 리턴
A = numpy.array([1, 2, 3, 4]) print(numpy.sum(A))
사칙연산
배열 A와 스칼라 (scalar) 숫자 n에 대해
A + n: 배열의 모든 원소에 n만큼을 더합니다.
A - n: 배열의 모든 원소에 n만큼을 뺍니다.
A * n: 배열의 모든 원소에 n만큼을 곱합니다.
A / n: 배열의 모든 원소에 n만큼을 나눕니다.
A = numpy.array([[1, 2], [3, 4]]) print(A + 2) print(A - 3) print(A * 2) print(A / 5)
numpy.mean, median, std, var
평균값, 중간값, 표준편차, 분산
A = numpy.array([1, 2, 4, 5, 5, 7, 10, 13, 18, 21]) print(numpy.mean(A)) print(numpy.median(A)) print(numpy.std(A)) print(numpy.var(A))
과제
A의 shape을 (3,4) 에서 (6,2)로 변환하여, 이것을 B로 저장합니다.
B의 밑에 ([2 2],[5 3])을 붙입니다. numpy.concatenate 를 사용하세요.
길이가 늘어난 B를 세로로 두 개로 쪼개고, 이것을 위-아래 순서대로 C, D로 저장합니다. B=(C, D)
C와 D를 가로로 붙여 E를 만듭니다.E=(C D)
E를 normalize (표준화) 하여 E 안의 모든 원소의 합이 1이 되도록 합니다.
함수 matrix_tutorial 에서 표준화한 배열 E의 분산 (variance) 를 리턴합니다.
※통계처리시에 표준화작업은 매우 중요합니다. 확률을 구하는 가장 쉬운 방법은 횟수를 표준화하는 것입니다. 이를테면, 동전의 앞/뒷면에 대한 개수 [42,58]를 표준화하면 [0.42,0.58] 되므로 실험을 통해 앞면이 나올 확률이 0.42, 뒷면이 나올 확률이 0.58이라고 설명할 수 있습니다. 위에서 설명한 sum과 사칙연산만을 이용해 표준화를 할 수 있습니다.
Python code
import numpydef main(): print(matrix_tutorial())def matrix_tutorial(): A = numpy.array([[1,4,5,8], [2,1,7,3], [5,4,5,9]]) # 1 B = A.reshape((6,2)) # 2 B = numpy.concatenate((B,[[2, 2], [5, 3]]), axis = 0) # 3 slice_Y_equal_size = numpy.split(B, 2, axis = 0) C = slice_Y_equal_size[0] D = slice_Y_equal_size[1] # 4 E = numpy.concatenate((C, D), axis = 1) # 5 E = E / numpy.sum(E) # 6 return numpy.var(E) return Eif __name__ == "__main__": main()
기초 ML
Machine Learning
인공지능:사람이 하는 지능적인 행동을 컴퓨터가 하게 하는것
기계학습은 인공지능의 한 방법론
데이터에서 의미있는 패턴을 스스로 추출하고 예측하는 방법
예) 숫자, 음성, 글자 인식, image(얼굴, 사물) 인식
Supervised Learning(지도 학습)
데이터와 데이터에 대한 답이 주어진 학습방법
Unsupervised Learning(비지도 학습)
데이터에 대한 답이 주어지지 않은 학습방법, 비슷한 것끼리 묶음
Important Terminology
Input : data
Hypothesis space : data mapping에 대한 고려 사항, function의 제한 등
Cadidate hypothesis
Training data : modeling에 사용하는 데이터, 학습데이터
Testing data : 학습한 모델에 대해 테스트하는 데이터, unseen,new data
Accuracy / Error
Classification vs Regression
Discrete vs continuous output
Classification : 자동차, 사람, 꽃, Category
Regression : 신장, 키, 집값, real-value
orcle, jsp 이용한 게시판
ora.java
package project;
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Date;
public class ora { Connection conn =null; Statement stm = null; ResultSet rs = null;
public void dbconnection() { try{ //1.드라이버 연결 String str = "jdbc:oracle:thin:@localhost:1521/xe"; Class.forName("oracle.jdbc.OracleDriver"); //2.db 연결과 드라이버 연결할때 쓰는 함수 conn = DriverManager.getConnection(str, "scott", "tiger"); stm = conn.createStatement(); //stm.executeUpdate(str); } catch(ClassNotFoundException e){ System.out.print("드라이버 연결 실패 : " +e); } catch(SQLException e1){ System.out.print("DB연결 실패 : " + e1); } } public ResultSet db_select(String sql) { try { rs = stm.executeQuery(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return rs; } public void db_Update(String sql){ try { stm.executeUpdate(sql);
} catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void db_close() { if(conn!=null) { try{ conn.close(); }catch (SQLException e){ e.printStackTrace(); } } } }
main.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <body> <center> 게시판<br/> <a href = "list.jsp">글목록보기</a><%--hyperlink reference--> </center> </body> </html>
list.jsp
<%@page import="project.ora"%> <%@page import="java.util.Date"%> <%@page import="java.sql.ResultSet"%> <%@page import="java.sql.SQLException"%> <%@page import="java.sql.DriverManager"%> <%@page import="java.sql.Statement"%> <%@page import="java.sql.Connection"%> <%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <body> <center> <hr width='600' size='2' noshade> <h2>게시판</h2> <a href='insert.jsp'>글쓰기</a> <a href='main.jsp'>처음으로</a> <hr width='600' size='2' noshade> <br /> <br /> <table width='700' border='1'> <tr> <th width - '10%'>번호</th> <th width - '20%'>이름</th> <th width - '30%'>글 제목</th> <th width - '10%'>날짜</th> </tr>
<% ora or = new ora(); String sql = "select * from bbs order by seq desc"; or.dbconnection(); ResultSet rs = or.db_select(sql); while (rs.next()) { int num = rs.getInt("seq"); String name = rs.getString("name"); String title = rs.getString("title"); Date date = rs.getDate("r_date"); %>
<tr> <td align="center"><%=num%></td> <td align="center"><%=name%></td> <td align="center"><a href='content.jsp?seq=<%=num%>'><%=title%></a></td> <td align="center"><%=date%></td> </tr> <% } or.db_close(); %>
</table> </center> </body> </html>
content.jsp
<% int seq = Integer.parseInt((request.getParameter("seq"))); String sql = "select * from bbs where seq = " + seq; ora or = new ora(); or.dbconnection(); ResultSet rs = or.db_select(sql); rs.next();//select로 데이터를 불러왔을시에 next로 넘겨야지 값을 받을수 있다. int num = rs.getInt("seq"); String name = rs.getString("name"); String title = rs.getString("title"); String content = rs.getString("content"); Date date = rs.getDate("r_date"); or.db_close(); %> <center> <table width='600' border='1'> <tr> <th width - '10%'>번호:<%=num%></th> <th width - '20%'>이름:<%=name%></th> <th width - '30%'>글 제목:<%=title%></th> <th width - '10%'>날짜:<%=date%></th> </tr> <tr> <td colspan ='4' height = '200' valign = 'top' ><%=content %></td> </tr> </table> <a href ='update.jsp?seq=<%=seq %>'>수정</a> <a href ='deletego.jsp?seq=<%=seq %>'>삭제</a> <a href='list.jsp'>글목록보기</a> </center> </form>
insert.jsp
<form action="insertgo.jsp" type = "get"> 이롬:<input type = "text" name = "name"><br/> 제목:<input type = "text" name = "title"><br/> 내용:<input type = "text" name = "content"><br/> <br/> <input type = "submit" value = "저장"> <input type = "reset" value ="초기화"><br/> </form>
insertgo.jsp
<% String name = request.getParameter("name"); String title = request.getParameter("title"); String content = request.getParameter("content"); Date da = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String date= sdf.format(da); String sql = "insert into bbs values(my_seq.nextval,'"+date+"','"+title+"','"+name+"','"+content+"')"; ora or = new ora(); or.dbconnection(); or.db_Update(sql); or.db_close(); response.sendRedirect("list.jsp"); %>
deletego.jsp
<% int seq = Integer.parseInt(request.getParameter("seq")); String sql = "delete from bbs where seq = "+seq+""; ora or = new ora(); or.dbconnection(); or.db_Update(sql); or.db_close(); response.sendRedirect("list.jsp"); %>
update.jsp
<% int seq = Integer.parseInt((request.getParameter("seq"))); String sql = "select * from bbs where seq = " + seq; ora or = new ora(); or.dbconnection(); ResultSet rs = or.db_select(sql); rs.next();//select로 데이터를 불러왔을시에 next로 넘겨야지 값을 받을수 있다. int num = rs.getInt("seq"); String name = rs.getString("name"); String title = rs.getString("title"); String content = rs.getString("content"); Date date = rs.getDate("r_date"); or.db_close(); %> <center> <form action="updatego.jsp" type="post"> <table width='600' border='1'> <tr> <th width - '10%'>번호:<input type="text" name="seq" value=<%=num%> readonly></th> <th width - '20%'>이름:<input type="text" name="name" value=<%=name%>></th> <th width - '30%'>글 제목:<input type="text" name="title" value=<%=title%>></th> <th width - '10%'>날짜:<input type="text" name="date" value=<%=date%> read only></th> </tr> <tr> <td colspan='4' height='200' valign='top'> <input type="text" name="content" value=<%=content%>></td> </tr> </table>
<input type="submit" value="수정"> <input type="reset" value="초기화"> <a href='list.jsp'>글목록으로</a> </form>
updatego.jsp
<% String name = request.getParameter("name"); int seq = Integer.parseInt(request.getParameter("seq")); String title = request.getParameter("title"); String content = request.getParameter("content"); String sql = "update bbs set name = '"+name+"', title = '"+title+"', content = '"+content+"' where seq = " +seq+""; ora or = new ora(); or.dbconnection(); or.db_Update(sql); or.db_close(); response.sendRedirect("list.jsp"); %>
deletego.jsp
<% int seq = Integer.parseInt(request.getParameter("seq")); String sql = "delete from bbs where seq = "+seq+""; ora or = new ora(); or.dbconnection(); or.db_Update(sql); or.db_close(); response.sendRedirect("list.jsp"); %>
JSP setProperty, getProperty 예제
fileoutputstream을 이용한 setProperty, getProperty 예제
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <body> <form action="param1.jsp" method="get"> <%-- --%> ID : <input type="text" name="id"><br /> 이름 : <input type="text" name="name"><br /> 비밀번호 : <input type="password" name="pw"><br /> 이메일 : <input type="text" name="email"><br /> <input type="submit" value="전송"> </center> </form> </body> </html><%--param1.jsp--><%@page import="java.io.ObjectOutputStream"%> <%@page import="java.io.FileOutputStream"%> <%@page import="java.util.Date"%> <%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <% request.setCharacterEncoding("utf-8"); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <jsp:useBean id="user" class ="project.User"/> <%-- <jsp:setProperty property="id" name="user" param = "id"/> <jsp:setProperty property="name" name="user" param = "name"/> <jsp:setProperty property="pw" name="user" param = "pw"/> <jsp:setProperty property="email" name="user" param = "email"/> --%> <jsp:setProperty property="*" name="user" /> <jsp:setProperty property="regDate" name="user" value ="<%=new Date() %>"/> <% String path = "D:\\test.txt";//application.getRealPath("/day4/user_"+user.getId()); FileOutputStream fos = new FileOutputStream(path); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(user); oos.close(); %> <body> 회원가입 처리 완료<br/> 아이디:<jsp:getProperty property="id" name="user"/><br/> 이름:<jsp:getProperty property="name" name="user"/><br/> 가입일:<jsp:getProperty property="regDate" name="user"/><br/> 이메일:<jsp:getProperty property="email" name="user"/><br/></body> </html><!--login_form.jsp--><%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <body> 관리자 로그인<br/> <form action="login.jsp" method = "post"> ID : <input type = "text" name = "id"><br/> Password : <input type = "password" name = "pw"><br/> <input type = "submit" value = "전송"> </form></body> </html><!--login.jsp--><%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <%@ page import = "project.User" %> <%@ page import = "java.io.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <body> <% String beanId = null; String beanPw = null; String id = request.getParameter("id"); String pw = request.getParameter("pw"); try{ String path = "D:\\test.txt";//application.getRealPath("/day4/user_"+id); FileInputStream fis = new FileInputStream(path); if(fis !=null){ ObjectInputStream ois = new ObjectInputStream(fis); User user = (User)ois.readObject(); beanId = user.getId(); System.out.println(beanId); beanPw = user.getPw(); ois.close(); } }catch(IOException e){ out.println("<script>alert(\"회원 DB 오류 발생\");history.back();</script>"); } if(beanId ==null|beanPw==null){ out.println("<script>alert(\"회원 정보가 없습니다\");history.back();</script>"); } if(id.equals(beanId)&&pw.equals(beanPw)){ session.setAttribute("userId", id); out.println("로그인에 성공했습니다"); }else if(id.equals(beanId)){ out.println("<script>alert(\"비밀번호불일치\");history.back();</script>"); }else{ out.println("<script>alert(\"아이디불일치\");history.back();</script>"); } %> </body> </html>
데이터를 객체 단위로 묶어서 처리
jsp 소스가 깔끔해짐
생성자, property, get, set으로 구성
useBean으로 사용되는 객체는 반드시 변수명과 똑같이 set/get메서드를 가지고 있어야 한다
자바빈 관련 액션 태그
<jsp:useBean id="..." class="..." scope="..."/>
자바빈 객체를 생성
id는 생성될 자바빈 객체의 이름
class 속성은 객체가 생성될 자바빈 클래스를 기술 (패키지명을 포함한 자바 클래스)
scope 속성은 자바빈 객체의 유효 범위로 자바빈 객체가 공유되는 범위를 지정한다. 생략시 default는 "page" ( page, request, session, application )
<jsp:setProperty name="..." property="..." value="..." />
생성된 자바빈 객체에 프로퍼티 값을 저장
property ="*" 를 주면 모든 프로퍼티 값이 세팅된다 form으로부터 넘어오는 파라미터의 이름과 개수가 프로퍼티의 이름과 개수와 일치해야 한다
<jsp:setProperty name="testBean" property="name" /> 액션 태그는 자바빈 클래스의 setName() 메소드와 자동 연동된다
폼으로부터 넘어온 파라미터 명과 자바빈의 프로퍼티가 일치하지 않는 경우 param 속성을 기술해야 한다
<jsp:getproperty name="..." property="..." />
생성된 자바빈 객체에서 저장된 프로퍼티 값을 가져옴.
자바빈 예제
User클래스 java code
package project; import java.util.Date; import java.io.Serializable; public class User implements Serializable { private String id; private String name; private String pw; private String email; private Date regDate; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPw() { return pw; } public void setPw(String pw) { this.pw = pw; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Date getRegDate() { return regDate; } public void setRegDate(Date regDate) { this.regDate = regDate; } }
useBean.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <jsp:useBean id = "user" class = "project.User" scope = "request"/> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <body> <%= user.getName() %>(<%= user.getId() %>)회원님 등장.<br/> 이메일은 <%= user.getEmail() %>입니다.<br/> 가입 날짜는 <%= user.getRegDate() %>입니다. </body> </html>
setBean.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <%@ page import = "java.util.Date" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <body> <jsp:useBean id = "user" class ="project.User" scope = "request"/><%--객체 생성 --%> <% user.setId("jwkim"); user.setName("시비르"); user.setPw("1234"); user.setEmail("[email protected]"); user.setRegDate(new Date()); %> <jsp:forward page="useBean.jsp"></jsp:forward> </body> </html>
JSP Cookie
클라이언트 측에 저장되는 파일
서버로 전달되어 사용자에 맞춘 서비스 가능
하나의 사이트당 20개의 쿠기 저장 가능
1개의 쿠키당 4kb
HTTP 프로토콜은 요청을 한 해당 클라이언트와의 지속적인 연결이 없는데 cookie를 통해 해결
Method
String getName() 쿠키의 이름을 가져온다
String getValue() 쿠키에 설정된 값을 가져온다
void setValue(String) 쿠키의 값을 설정한다
String getDomain() 쿠키의 유효한 도메인 정보를 가져온다
int getMaxAge() 쿠키의 유효기간에 대한 정보를 가져온다
String getPath() 쿠키의 유효한 디렉토리 정보를 가져온다
boolean getSecure() 쿠키의 보안이 어떻게 설정되어 있는지 가져온다
void setComment(String) 쿠키에 대한 설명을 설정한다
void setDomain(String) 쿠키에 유효한 도메인을 설정한다
void setMaxAge(int) 쿠키의 유효한 기간을 설정한다
void setPath(Striong) 쿠키의 유효한 디렉토리를 설정한다
void setSecure(boolean) 쿠키의 보안을 설정한다
Cookie 아이디 기억하기 예제
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <% String id = ""; Cookie[] cookies = request.getCookies(); if(cookies != null&&cookies.length >0){ for(int i = 0;i<cookies.length;i++){ if(cookies[i].getName().equals("id")){ id = cookies[i].getValue(); } } } %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <body> 관리자 로그인<br/> <form action="login2.jsp" method = "post"> ID : <input type = "text" name = "id" value = <%=id %>> <input type = "checkbox" name = "idstore" value = "store" checked>ID 기억<br/> Password : <input type = "password" name = "pw"><br/> <input type = "submit" value = "전송"> </form> </body> </html><%--login2.jsp--> <% String adminId = application.getInitParameter("AdminId"); String adminPw = application.getInitParameter("AdminPw"); String id = request.getParameter("id"); String pw = request.getParameter("pw"); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <body> <% if(id.equals(adminId)&&pw.equals(adminPw)){ session.setAttribute("AdminId", id); out.println("로그인에 성공했습니다. <a href=\"loginformcookie.jsp\">로그인 폼으로</a>"); String idsave = request.getParameter("id"); if(idsave !=null){ Cookie ck = new Cookie("id",id); response.addCookie(ck);//쿠키를 추가한다. } }else if(id.equals(adminId)){ out.println("<script>alert(\"비밀번호불일치\");history.back();</script>"); }else{ out.println("<script>alert(\"아이디불일치\");history.back();</script>"); } %> </body> </html>
JSP session
request.getSession(true) request에 대한 새로운 세션을 생성후 리턴
request.getSession(false) 현재 세션이 존재하면 기존 세션 리턴, 없으면 null값 리턴
request.getSession() 현재 세션이 존재하면 기존 세션 리턴, 없으면 새로생성한 세션 리턴
session을 이용한 로그인 예제
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <body> 관리자 로그인<br/> <form action="login.jsp" method = "post"> ID : <input type = "text" name = "id"><br/> Password : <input type = "password" name = "pw"><br/> <input type = "submit" value = "전송"> </form></body> </html><%--login.jsp--><% String adminId = application.getInitParameter("AdminId"); String adminPw = application.getInitParameter("AdminPw"); String id = request.getParameter("id"); String pw = request.getParameter("pw"); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <body> <% if(id.equals(adminId)&&pw.equals(adminPw)){ session.setAttribute("AdminId", id); out.println("로그인에 성공했습니다. <a href=\"login_chk.jsp\"> 로그인 체크</a>"); }else if(id.equals(adminId)){ out.println("<script>alert(\"비밀번호불일치\");history.back();</script>");//alert:메세지창 띄움 history.back():바로 이전 페이지로 돌아감 }else{ out.println("<script>alert(\"아이디불일치\");history.back();</script>"); } %> </body> </html><%--login_chk.jsp--> <% String adminId = (String)session.getAttribute("AdminId"); boolean isLogin = false; if(adminId != null){ isLogin = true; } %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <body> <% if(isLogin){ out.println("아이디" + adminId + "로 로그인 한 상태<br/>"); out.println("<a href=\"logout.jsp\">로그아웃</a>"); }else{ out.println("로그인하지 않은 상태"); } %> </body> </html><%--logout--> <% session.invalidate(); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <body> 로그아웃하였습니다.<br/><a href = "login_form.jsp">처음부터</a> </body> </html>
JSP Error Exception
예외 발생 처리 예제
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <body> <form action ="ex.jsp" method = "post"> 나이를 입력하세요 : <input type="text" name ="age" /> <input type = "submit" value = "Submit" /> </form> </body> </html><!--ex--> <%@ page errorPage = "ex_handler.jsp" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <body> <% int age = Integer.parseInt(request.getParameter("age")); %> <p>Your age is : <%=age%> years.</p> <p><a href="ex_form.jsp">Back</a>.</p> </body> </html><!--ex_handler--><%@page isErrorPage="true" import="java.io.*"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Insert title here</title> </head> <body> <%= exception.toString()%><br> <% //out.println("<!--");//java 코드 내에서 html tag를 사용 StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); exception.printStackTrace(pw); out.print(sw.toString()); sw.close(); pw.close(); //out.println("-->"); %> <p><a href="ex_form.jsp">Back</a>.</p> </body> </html>