2020.08.24(월) 7주차 1일
자바안에 html에 집어넣고 이걸 또 숨기고 결국엔 쇼핑몰까지 쏙
파이썬-텐서플로우 : 이미지 분류 자연어 처리
text : 자연어, GPT-3,
이미지 : gen
내일부터 Model 2 JSP에 대해 배운다.
1. 서블릿
web_pro3servlet> main.html
web_pro3servlet> ...>> ServletGo.java
서블릿 = 웹용 자바, 만드는 위치는 Resource
</form>
<form action="ServletGo" method="post">
<input type="submit" value="서블릿 file3 - post">
</form>
web_pro3servlet> main.html
@WebServlet("/ServletGo")
public class ServletGo extends HttpServlet {
private BadaClass badaClass;
//Servlet Life cycle(init[서비스 시작] > doGet, doPost > destroy[서비스 끝])
public void init(ServletConfig config) throws ServletException {
// 서블릿 파일 최초 호출 시 1회 수행 : 초기화 담당
System.out.println("init 수행");
badaClass = new BadaClass("홍길동"); //최초 1회만 수행하기 때문에 효율적 (가장 먼저 접속된 client로부터 수행되어짐)
//그 다음 client들은 init 메소드 수행 할 수 없음
}
public void destroy() {
// 서블릿 파일 서비스 해제 시 1회 수행 : 마무리 담당 (cf.C언어의 소멸자) - 거의 쓸 일은 없다;
System.out.println("destroy 수행");
badaClass = null; //굳이 쓰지 않아도 garbage collector로 인해 사라짐
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//
System.out.println("service method");
doGet(req, resp); //post method에서 doget을 요청함
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Client가 Get으로 호출 시 매 client마다 Thread가 생성되면서 매번 호출 (socket 통신)
System.out.println("doGet 수행~~~/**");
// java를 신나게 하다가... 웹으로 출력하고 싶다면?
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h2>서블릿 연습(Get)</h2>");
//불현 듯 java를 수행
int a = 10, b = 20;
out.println("a=" + a + ",b=" + b);
int hap = myCalc(a, b);
out.println("<br>합은 " + hap);
/*BadaClass badaClass = new BadaClass("홍길동");*/ //Client 요청 시 마다 새로운 인스턴스 생성 (스레드 실행)하므로 매우 비효율적 (서버 과부하)
String irum = badaClass.getIrum(); //같은 정보는 하나의 인스턴스를 공유도록 해야함
out.println("<br>이름은 " + irum);
out.println("<br>작성자: YONG");
out.println("</html></body>");
out.close(); //다쓴 자원 반납
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Client가 Post로 호출 시 매 client마다 Thread가 생성되면서 매번 호출 (socket 통신)
System.out.println("doPost 수행@@@");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h2>서블릿 Practice(Post)</h2>");
out.println("</html></body>");
out.close(); //다쓴 자원 반납
}
private int myCalc(int m, int n) {
int tot = m + n;
return tot;
}
}
web_pro3servlet> ...>> ServletGo.java
(1) service method
클라이언트의 요청을 겟과 포스트으로 받을 수 있다.
(2) 서비스가 겟, 포스트보다 우선순위가 높다
1) JSP가 서비스 매스드를 오버라이딩 했기때문에
2) req, resq 를 argument로 가지고 있다! ==> JSP개념에서 이해가능
※ 겟과 포스트를 구분해서 사용하기 싫다면 서비스 메소드를 부르면 된다.
2. Model 1 방식 : get,post으로 자료전달
web_pro3servlet> main.html
web_pro3servlet> getdata.html, web_pro3servlet> ...>> getdata.java
web_pro3servlet> postdata.html, web_pro3servlet> ...>> postdata.java
<hr>
<a href="getdata.html">get으로 자료 전달 </a><br>
<a href="postdata.html">post으로 자료 전달 </a>
<br><br>
web_pro3servlet> main.html
(1) JSP - MVC 패턴
MVC 패턴의 컨트롤러 서블릿(클라이언트의 요청을 받는 서블릿)
MVC 패턴의 프레임웍(라이브러리) = 스프링
(2) Model 1(하나도 안 이쁜) => Model 2 : JSP
Session, DB, ==> 쇼핑몰
@WebServlet("/GetData")
public class getdata extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String age = request.getParameter("age");
// System.out.println(name + " " + age);
// JAva의 결과를 클라이언트로 보내고 싶다.
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("** 결과 출력 **<br>");
out.println("이름 : " + name + " 님의 나이는 " + age);
out.println("<br>" + calcAge(age));
out.println("<br><a href = 'getdata.html'>다시 자료 입력</a>");
out.println("</body></html>");
out.close();
}
private String calcAge(String age) {
int nai = Integer.parseInt(age) / 10 * 10;
// System.out.println(nai);
String imsi = "";
switch (nai) {
case 20: imsi = "20대"; break;
case 30: imsi = "30대"; break;
default:imsi="기타";
}
return imsi;
}
}
(3) getdata.java
<input tpye="number" = 클라이언트에서 웹으로 string으로 넘어감
GetData.java ==> 콘솔창, name=가죽&age=22 서블릿으로 잘 넘어옴
HTML에서 getdata 어노테이션 잘 됨 @WebServlet("/GetData")
out.println("<br><a href = 'getdata.html'>다시 자료 입력</a>"); 설명 어케하누
@WebServlet("/PostData")
public class postdata extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
System.out.println(name);
String[] addr = request.getParameterValues("addr");
System.out.println(addr[0] + " " + addr[1]);
//check box
try {
String lan[] = request.getParameterValues("lan");
System.out.println("선택한 언어는 ");
for(int i =0 ; i < lan.length; i++) {
System.out.println(lan[i]);
}
} catch (Exception e) {
System.out.println("선택한 언어가 없습니다.");
}
// radio box
String os = request.getParameter("os");
System.out.println("os는" + os);
// select
String tr = request.getParameter("tr");
System.out.println("교통수단은" + tr);
}
}
(4) postdata.java
PostData.java ==>Main.html 에서 post로 자료전송 누를 시 한글이 깨짐
request.setCharacterEncoding("utf-8"); 을 꼭 써줘야함
카페 JSP&Servlet 39 간단한 한글깨짐 조정
3.쿠키와 세션 (책p,188 상태정보유지기술-> 205)
shopping>ShopMain.html
shopping>product1.html
shopping>product2.html
pack2> Cart.java
pack2> Gdoods.java
pack2>Buy.java
(1) 클라이언트Client와 WAS, stateless
(2) 쿠키 (get방식) : 서버가 클라이언트에 정보를 기억
쿠키로 장바구니, 로그인, 방문회수 등을 수행하거나 알 수있다.
신뢰도가 떨어진다.
FIFO에 의해 쌓이기때문에,
브라우저마다 쿠키의 저장 위치가 다르다.
유효 1년
아이디와 비밀번호를 쿠키로 저장
(3) 세션 (doGet, Service) : 클라이언트 정보를 서버에 기억
클라이언트의 정보를 서버에 저장, 안정적
서버의 메모리 관리를 위해 개인마다 유효시간 30분(변경가능)
장바구니에 물건 담기
16진수의 ID가 만들어지기때문에 사실상 중복이 불가능
그래서 개인별로 들어오는 고유의 처리를 위해서 세션을 많이 사용
간단한 쇼핑몰을 구현해보자.
<script type="text/javascript">
window.onload = function(){
document.getElementById("btnOk").onclick = function(){
frm.submit();
}
}
</script>
</head>
<body>
<table>
<tr>
<td> <img title="눌러" src = "../images/pro1.jpg" width="150">
<td>
<pre>
품명 : 배송당일 수확한 싱싱한 강원도 정선 찰옥수수 25개
가격 : 20,000원
배송 : 본 상품은 국내배송만 가능합니다.
보관주의 : 수령 즉시 삶아서 급냉보관 요망
</pre>
</td>
</tr>
<tr>
<td colspan = "2" style="text-align:center">
<form action="../Cart" name="frm" method ="post">
<input type="hidden" name = "name" value="1등급 옥수수">
<input type="hidden" name = "price" value="20000">
<input type="button" id = "btnOk" value="장바구니에 담기">
<input type="button" name = "btnCancel" value="홈페이지로" onclick="history.back()">
</form>
</td>
</tr>
</table>
</body>
</html>
@WebServlet("/Cart")
public class Cart extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
int price = Integer.parseInt(request.getParameter("price"));
//System.out.println(name + " " + price);
//클라이언트를 위한 세션을 만들기
HttpSession session = request.getSession(true);
ArrayList<Goods> glist = (ArrayList<Goods>)session.getAttribute("list");
if(glist == null) glist = new ArrayList<Goods>();
glist.add(new Goods(name, price));
session.setAttribute("list", glist); //session에 값을 부과
// 장바구니 자료 출력
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><body><br>→ ※ " + name + "을(를) 구입하셨어요.");
out.println("<br>[<a href='shopping/ShopMain.html'>계속 쇼핑하기</a>]<br>");
//결제하기
out.println("[<a href='Buy'>결제하기</a>]<hr>장바구니 목록<br>");
out.println("<table border = '1'>");
out.println("<tr><th>상품명</th><th>가격</th></tr>");
for (int i = 0; i < glist.size(); i++) {
Goods goods = glist.get(i);
out.println("<tr><td>" + goods.getName() + "</td>");
out.println("<td>" + goods.getPrice() + "</td></tr>");
}
out.println("</tr>");
out.println("</table>");
out.println("</body></html>");
out.close();
}
}
pack2> Cart.java
//클라이언트를 위한 세션을 만들기
pack2> Gdoods.java
name과 price가 들어온다. dto 와 비슷
POJO
collection 을 준비한다 = ArrayList
KeyValue(1,2,3,...같은 타입의 종류이기때문에)가 Collection으로서 Goods ArrayList를 통해 session으로 들어간다.
*새로고침은 똑같은 요청을 한 번 더 하는 것이라서 카운팅이 된다. 그래서 이를 막아야 한다.
*똑같은 품목을 장바구니에 담을 경우 자동으로 카운트가 늘어나는 방법
*결제는 카드사 프로그램이랑 연결한다.
4.미니 방명록 (서블릿 끝, JSP 시작
MyBang>Bang.html
BangServlet
webcontent>web-inf>lib >마리아 db 삽입
(1) SQL
create table miniguest( code int primary key auto_increment, name varchar(10) not null, subject varchar(30), contents text)charset=utf8; insert into miniguest(name, subject, contents) values('홍길동','방문', '문안인사'); |
(2) Bang.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>방명록에 글쓰기</title>
<script type="text/javascript">
window.onload = function(){
document.getElementById("btnOk").onclick= function(){
if(frm.name.value === ""){
alert("작성자 이름을 입력하시오.");
return false;
}
frm.method="post";
frm.action="../BangServlet";
frm.submit();
}
}
</script>
</head>
<body>
<h2> * 방명록에 글쓰기 * </h2>
<form name ="frm">
<table>
<tr>
<td>작성자</td><td><input type="text" name="name"></td>
</tr>
<tr>
<td>글 제목</td><td><input type="text" name="subject"></td>
</tr>
<tr>
<td>글 내용</td><td><textarea rows="5" cols="40" name="contents"></textarea></td>
</tr>
<tr>
<td colspan="2">
<input type="button" value="등록" id="btnOk">
</td>
</tr>
</table>
</form>
</body>
</html>
(3) BangServlet.java
@WebServlet("/BangServlet")
public class BangServlet extends HttpServlet {
private Connection conn;
private PreparedStatement pstmt;
public void init(ServletConfig config) throws ServletException {
try {
Class.forName("org.mariadb.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/mydb", "root", "123");
pstmt = conn.prepareStatement("insert into miniguest(name, subject, contents) values(?,?,?)");
} catch (Exception e) {
System.out.println("Init Error : " + e);
}
}
public void destroy() {
try {
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
} catch (Exception e) {
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//System.out.println("good");
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String subject = request.getParameter("subject");
String contents = request.getParameter("contents");
try {
pstmt.setString(1, name);
pstmt.setString(2, subject);
pstmt.setString(3, contents);
pstmt.executeUpdate();
response.sendRedirect("MyBang/Bang.html");
} catch (Exception e) {
System.out.println("doPost err : " + e);
}
}
}
'[2020]KIC 캠퍼스 복습 > JAVA SCRIPT(5,6,7)' 카테고리의 다른 글
[코드리뷰] Servlet) Form Beans 예제 1 (0) | 2020.08.26 |
---|---|
[수업 D-31 ] JSP) 지시어, 내장객체 (0) | 2020.08.25 |
[코드리뷰] SERVLET) SERVLET (0) | 2020.08.19 |
[수업 D-27 ] JS)AJAX, SERVLET (0) | 2020.08.19 |
[수업 D-26 ] JS) AJAX, JSON //JQUERY (0) | 2020.08.18 |