'전체 글'에 해당되는 글 384건

  1. 2019.08.05 4일차
  2. 2019.08.02 3일차
  3. 2019.08.02 7일차
  4. 2019.08.02 JSP(Java Server Page)
  5. 2019.08.01 좌석 예약 시스템
  6. 2019.08.01 INNER JOIN
  7. 2019.08.01 OUTER JOIN
  8. 2019.08.01 2일차 - 서블릿
  9. 2019.08.01 2일차 - HTML
  10. 2019.07.31 1일차

4일차

|

주요내용 : 고객정보주문정보출력실습, DataSource연동

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<script type="text/javascript">
		function fn_validate(){
			var frmLogin = document.frmLogin;
			var cust_id = frmLogin.cust_id.value;
			
			if(cust_id.length == 0 || cust_id == ""){
				alert("고객번호는 필수입니다.");
			} else {
				frmLogin.method = "get";
				frmLogin.action = "customer";
				frmLogin.submit();
			}
		}
	</script>
<title>고객 주문 정보 조회</title>
</head>
<body>
	<form name = "frmLogin" method = "get" action="customer" encType="UTF-8">
		고객 주문번호 조회 : <input type = "text" name = "cust_id"><br>
		<input type = "button" onClick="fn_validate()" value = "로그인">
		<input type = "reset" value = "다시 입력">
		<input type = "hidden" name="user_address" value = "서울시 성북구"/>
	</form>
</body>
</html>

------------
package Week05.day0805;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class CustomerServlet
 */
@WebServlet("/customer")
public class CustomerServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		CustomerDAO dao = new CustomerDAO();
		
		String input_id = request.getParameter("cust_id");
		List list = dao.listMembers(input_id); // listMembers메소드로 회원정보를 조회
		
		out.print("<html><body>");
		out.print("<table border=1><tr align='center' bgcolor='lightgreen'>");
		out.print("<td>고객번호</td><td>고객성명</td><td>주문번호</td><td>주문상품번호</td><td>주문상품명</td><td>");
		
		for(int i = 0; i<list.size(); i++)
		{
			CustomerVO customerVO = (CustomerVO) list.get(i);
			String cust_id = customerVO.getCust_id();
			String cust_name = customerVO.getCust_name();
			String order_num = customerVO.getOrder_num();
			String order_item = customerVO.getOrder_item();
			String prod_name = customerVO.getProd_name();
			out.print("<tr><td>" + cust_id + "</td><td>" + cust_name +"</td><td>" + order_num + "</td><td>" + order_item + "</td><td>" + prod_name + "</td></tr>");
		}
		out.print("</table></body></html>");
	}

}
-------
package Week05.day0805;

public class CustomerVO {
	//고객번호, 고객명, 주문번호,주문상품번호, 주문상품명
	private String cust_id;
	private String cust_name;
	private String order_num;
	private String order_item;
	private String prod_name;

	public CustomerVO() {System.out.println("CustomerVO 생성자 호출");}
	public void setCust_id(String cust_id) {this.cust_id = cust_id;}
	public void setCust_name(String cust_name) {this.cust_name = cust_name;}
	public void setOrder_num(String order_num) {this.order_num = order_num;}
	public void setOrder_item(String order_item) {this.order_item = order_item;}
	public void setProd_name(String prod_name) {this.prod_name = prod_name;}
	
	public String getCust_id() {return cust_id;}
	public String getCust_name() {return cust_name;}
	public String getOrder_num() {return order_num;}
	public String getOrder_item() {return order_item;}
	public String getProd_name() {return prod_name;}
	
}

-----
package Week05.day0805;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class CustomerDAO {
	private static final String driver= "oracle.jdbc.driver.OracleDriver";
	private static final String url = "jdbc:oracle:thin:@localhost:1521:XE";
	private static final String user ="scott";
	private static final String pwd = "tiger";
	private Connection con;
	private PreparedStatement pstmt; // 실무에선 PreparedStatement를 더 많이씀.
	
	public List listMembers(String input_id)
	{
		List list = new ArrayList();
		try
		{
			connDB(); // 네가지 정보로 데이터베이스를 연결
			String query = "SELECT c.cust_id , c.cust_name, o.order_num, oi.order_item, p.prod_name "
					+ "FROM customers c, orders o, orderitems oi, products p "
					+ "WHERE c.cust_id  = o.cust_id " 
					+ "AND o.order_num = oi.order_num " 
					+ "AND oi.prod_id  = p.prod_id "
					+ "AND c.cust_id = " + "'"+input_id+"'";
			System.out.println("preparedStatement : " + query);
			pstmt = con.prepareStatement(query); // 파생된 SQL 재사용. preparedStatement 메소드에 sql문을 전달해 prepareStatement객체를 생성. 
			ResultSet rs = pstmt.executeQuery(); // sql문으로 회원 정보를 조회
			while(rs.next())
			{
				// 조회한 레코드의 각 컬럼 값을 받아옴.
				String cust_id = rs.getString("cust_id"); // " " 안에는 컬럼명이 와야함.!!!!!!!!!!!!!!
				String cust_name =rs.getString("cust_name");
				String order_num = rs.getString("order_num");
				String order_item = rs.getString("order_item");
				String prod_name = rs.getString("prod_name");
				// 각 컬럼 값을 다시 MemberVO 객체의 속성에 설정.
				CustomerVO vo = new CustomerVO();
				vo.setCust_id(cust_id);
				vo.setCust_name(cust_name);
				vo.setOrder_num(order_num);
				vo.setOrder_item(order_item);
				vo.setProd_name(prod_name);
				list.add(vo); // 설정된 MemberVO 객체를 다시 ArrayList에 저장.
			}
			rs.close();
			pstmt.close();
			con.close();
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return list; // 조회한 레코드의 개수만큼 MemberVO객체를 저장한 ArrayList를 반환.
	}

	private void connDB()
	{
		try
		{
			Class.forName(driver);
			System.out.println("Oracle 드라이버 로딩 성공");
			con = DriverManager.getConnection(url, user, pwd);
			System.out.println("Connection 생성 성공");
		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}

}
--------------
// <Resources> 태그를 이용해 톰캣 실행 시 연결할 데이터베이스를 설정

<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
--><!-- The contents of this file will be loaded for each web application --><Context>

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
    // Connection Pool을 생성하고 JNDI로 호출위한 정보설정
    // 이 정보를 읽어서 Container 기동시 Connection Pool을 생성하고 Directory Server에 등록
    <Resource 
      name="jdbc/oracle" // name의 jdbc/oravle로 DataSource에 접근. JNDI로 호출위한 정보설정
      auth = "Container" // DBCP를 관리할 관리자. Container or Application
      type = "javax.sql.DataSource" // 데이터베이스를 연결하는 데 필요한 네 가지 값을 설정.
      								// 해당 리소스의 리턴타입. DB종류별 DataSource
      driverClassName = "oracle.jdbc.OracleDriver" // DB종류에 따른 JDBC Driver 클래스 이름
      url = "jdbc:oracle:thin:@localhost:1521:XE" // DB 주소/포트/ SID(DB Instance)
      username = "scott"
      password = "tiger"
      maxActive = "50" // 동시에 DB에 접속할 수 있는 수
      maxWait = "-1" // 접속을 기다릴 수 있는 최대시간, -1은 무한대기
    />
</Context>

----------------
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>회원 가입창</title>
		<script type="text/javascript">
			function fn_sendMember(){
            	// 자바스크립트에서 form태그의 name으로 접근해 입력한 값들을 얻음.
				var frmMember = document.frmMember;
				var id = frmMember.id.value;
				var pwd = frmMember.pwd.value;
				var name = frmMember.name.value;
				var email = frmMember.email.value;
				if(id.length == 0 || id == ""){
					alert("아이디는 필수입니다.");
				} else if (pwd.length == 0 || pwd == ""){
					alert("비밀번호는 필수입니다.");
				} else if (name.length == 0 || name == ""){
					alert("이름은 필수입니다.");
				} else if (email.length == 0 || email == ""){
					alert("이메일은 필수입니다.");
				} else { 
					frmMember.method = "post";
					frmMember.action = "member3";
					frmMember.submit();
				}
			}
		</script>
</head>
<body>
	<form name="frmMember">
		<table>
			<th>회원 가입창</th>
			<tr>
				<td>아이디</td>
				<td><input type="text" name="id"></td>
			</tr>
			<tr>
				<td>비밀번호</td>
				<td><input type="password" name="pwd"></td>
			</tr>
			<tr>
				<td>이름</td>
				<td><input type="text" name="name"></td>
			</tr>
			<tr>
				<td>이메일</td>
				<td><input type="text" name="email"></td>
			</tr>
		</table>
		<input type="button" value="가입하기" onClick="fn_sendMember()">
		<input type="reset" value="다시입력">
		<input type="hidden" name="command" value="addMember"/>
        // hidden 태그를 이용해 서블릿에게 회원 등록임을 알림.
	</form>
</body>
</html>
-------------------
package sec02.ex02;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class MemberServlet
 */
@WebServlet("/member3")
public class MemberServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}
	
	protected void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		MemberDAO dao = new MemberDAO();
		PrintWriter out = response.getWriter();
		String command = request.getParameter("command"); // command 에 addMember가 오느냐 delMember가 오느냐에 따라 분기됨.
		
		if(command != null && command.equals("addMember")) // 회원가입창에서 전송된 command가 addMember이면 전송된 값들을 받아옴.
		{
        // insert 처리로직
        // 회원가입창에서 전송된 값들을 얻어 와 MemberVO 객체에 저장한 후 SQL문을 이용해 전달.
			String _id = request.getParameter("id");
			String _pwd = request.getParameter("pwd");
			String _name = request.getParameter("name");
			String _email = request.getParameter("email");
			MemberVO vo = new MemberVO();
			vo.setId(_id);
			vo.setPwd(_pwd);
			vo.setName(_name);
			vo.setEmail(_email);
			dao.addMember(vo);
        // delete 처리
        // command 값이 delMember인 경우 ID를 가져와 SQL문으로 전달해서 삭제함.
		} else if (command !=null && command.equals("delMember"))
		{
			String id = request.getParameter("id"); // id만 받아서 삭제
			dao.delMember(id);
		}
		// add나 del 다음 조회를 다시하는 것이 일반적인 패턴.
        // 추가삭제 후 재조회
		List list = dao.listMembers(); // listMembers메소드로 회원정보를 조회
		
		out.print("<html><body>");
		out.print("<table border=1><tr align='center' bgcolor='lightgreen'>");
		out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>가입일</td><td>삭제</td></tr>");
		
		for(int i = 0; i<list.size(); i++)
		{
			MemberVO memberVO = (MemberVO) list.get(i);
			String id = memberVO.getId();
			String pwd = memberVO.getPwd();
			String name = memberVO.getName();
			String email = memberVO.getEmail();
			Date joinDate = memberVO.getJoinDate();
            // 삭제를 클릭하면 command 값과 회원 id를 서블릿으로 전송.
			out.print("<tr><td>" + id + "</td><td>" + pwd + "</td><td>" + name + "</td><td>" + email + "</td><td>" + joinDate + "</td><td>" + "<a href='/pro07/member3?command=delMember&id=" + id + "'> 삭제 </a></td></tr>");
		}
		out.print("</table></body></html>");
		out.print("<a href='/pro07/memberForm.html'>새 회원 가입하기</a");
	}

}

-------------------

package sec02.ex02;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class MemberDAO {
	private Connection con;
	private PreparedStatement pstmt; // 실무에선 PreparedStatement를 더 많이씀.
	private DataSource dataFactory;
	
	public MemberDAO()
	{
		try
		{
        	// Context : JNDI를 수행하는 객체로 DataSource를 제공한다.
        	// JDNI에 접근하기 위해 기본 경로(java:/comp/env)를 지정.
			Context ctx = new InitialContext();
			Context envContext = (Context)ctx.lookup("java:/comp/env");
            // 톰캣 context.xml에 설정한 name 값인 jdbc/oracle을 이용해 톰캣이 미리 연결한
            // DataSource를 받아 옴.
			dataFactory = (DataSource)envContext.lookup("jdbc/oracle");
            // JNDI로 context.xml으로 설정된 객체에 접근
		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}
	
	public List listMembers()
	{
		List list = new ArrayList();
		try
		{
        	// DataSource를 이용해 데이터 베이스에 연결.
			con = dataFactory.getConnection();
			String query = "select * from t_member ";
			System.out.println("preparedStatement : " + query);
			pstmt = con.prepareStatement(query); // preparedStatement 메소드에 sql문을 전달해 prepareStatement객체를 생성. 
			ResultSet rs = pstmt.executeQuery(); // sql문으로 회원 정보를 조회
			while(rs.next())
			{
				// 조회한 레코드의 각 컬럼 값을 받아옴.
				String id = rs.getString("id");
				String pwd = rs.getString("pwd");
				String name = rs.getString("name");
				String email = rs.getString("email");
				Date joinDate = rs.getDate("joinDate");
				// 각 컬럼 값을 다시 MemberVO 객체의 속성에 설정.
				MemberVO vo = new MemberVO();
				vo.setId(id);
				vo.setPwd(pwd);
				vo.setName(name);
				vo.setEmail(email);
				vo.setJoinDate(joinDate);
				list.add(vo); // 설정된 MemberVO 객체를 다시 ArrayList에 저장.
			}
			rs.close();
			pstmt.close();
			con.close();
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return list; // 조회한 레코드의 개수만큼 MemberVO객체를 저장한 ArrayList를 반환.
	}
	
	public void addMember(MemberVO memberVO)
	{
		try
		{
        // DataSource 이용해 데이터베이스와 연결
			Connection con = dataFactory.getConnection();
            // 테이블에 저장할 회원정보를 받아옴.
			String id = memberVO.getId();
			String pwd = memberVO.getPwd();
			String name = memberVO.getName();
			String email = memberVO.getEmail();
			
            // insert문을 문자열로 만듬.
			String query = "insert into t_member";
			query += " (id,pwd,name,email)";
			query += " values(?,?,?,?)"; // 순서대로 값을 assign 해야함.
			System.out.println("prepareStatement: " + query);
			pstmt = con.prepareStatement(query);
            // insert문의 각 ? 순서대로 회원정보를 세팅
			pstmt.setString(1, id);
			pstmt.setString(2, pwd);
			pstmt.setString(3, name);
			pstmt.setString(4, email);
            // 회원정보를 테이블에 추가.
			pstmt.executeUpdate();
			pstmt.close();
		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}
	
	public void delMember(String id)
	{
		try
		{
			Connection con = dataFactory.getConnection();
			// delete문을 문자열로 만듬.
			String query = "delete from t_member" + " where id=? ";
			System.out.println("prespareStatement: " + query);
			pstmt = con.prepareStatement(query);
			pstmt.setString(1, id); // 첫번째 ? 에 전달된 id를 인자로 넣음.
			pstmt.executeUpdate(); // delete문을 실행해 테이블에서 해당 id의 회원정보를 삭제.
			pstmt.close();
		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}
------------------
package sec02.ex02;

import java.sql.Date;

public class MemberVO {
	private String id;
	private String pwd;
	private String name;
	private String email;
	private Date joinDate;
	
	public MemberVO()
	{
		System.out.println("MeberVO 생성자 호출");
	}
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public Date getJoinDate() {
		return joinDate;
	}
	public void setJoinDate(Date joinDate) {
		this.joinDate = joinDate;
	}
}



'Bitcamp > BITCAMP - Servlet & JSP' 카테고리의 다른 글

6일차  (0) 2019.08.07
5일차  (0) 2019.08.06
3일차  (0) 2019.08.02
JSP(Java Server Page)  (0) 2019.08.02
2일차 - 서블릿  (0) 2019.08.01
And

3일차

|

주요내용 : get/post전송방식, 자바스크립트로 서블릿에 요청, 서블릿의 데이터베이스 연동, preparedStatement

package sec02.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class CalcServlet2
 */
@WebServlet("/calc2")
public class CalcServlet2 extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static final float USD_RATE = 1188.80F;
	private static final float JPY_RATE = 1089.24F;
	private static final float CNY_RATE = 172.07F;
	private static final float GBP_RATE = 1441.00F;
	private static final float EUR_RATE = 1312.38F;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init() throws ServletException {
		System.out.println("init 메소드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("destroy 메소드 호출");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter pw = response.getWriter();
		
		String command = request.getParameter("command");
		String won = request.getParameter("won");
		String operator = request.getParameter("operator");
		
		if(command != null && command.equals("calculate"))
		{
			String result = calculate(Float.parseFloat(won), operator);
			pw.print("<html><font size=10>변환 결과</font><br>");
			pw.print("<html><font size=10>" + result + "</font><br>");
			pw.print("<a href='/pro06/calc'>환율 계산기</a>"); // 다른 페이지로 이동
			return;
		}
	}
	
	private String calculate(float won, String operator) {
		String result = null;
		if(operator.equals("dollar")) {
			result = String.format("%.6f", won / USD_RATE);
		} else if(operator.equals("en")) {
			result = String.format("%.6f", won / JPY_RATE);
		} else if(operator.equals("wian")) {
			result = String.format("%.6f", won / CNY_RATE);
		} else if(operator.equals("pound")) {
			result = String.format("%.6f", won / GBP_RATE);
		} else if(operator.equals("euro")) {
			result = String.format("%.6f", won / EUR_RATE);
		}
		return result;
	}

}
--------------------------------------------------------------------------
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>환율계산기</title>
</head>
<body>
	<form name="frmCalc" method="get" action ="calc2">
		원화 : <input type="text" name="won" size= 10>
		<select name="operator">
		<option value="dollar">달러</option>
		<option value="en">엔화</option>
		<option value="wian">위안</option>
		<option value="pound">파운드</option>
		<option value="euro">유로</option>
		</select>
		<input type="hidden" name="command" value="calculate">
		<input type="submit" value="변환">
	</form>
</body>
</html>
--------------------------------------------------------------------------

package sec02.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class practice0803
 */
@WebServlet("/practice0803")
public class practice0802 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init() throws ServletException {
		System.out.println("init 메소드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("destroy 메소드 호출");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter pw = response.getWriter();
		
		String command = request.getParameter("command");
		String first = request.getParameter("first");
		String operator = request.getParameter("operator");
		String second = request.getParameter("second");
		
		if(command != null && command.equals("calculate"))
		{
			String result = calculate(Float.parseFloat(first), operator, Float.parseFloat(second));
			pw.print("<html><font size=10>계산 결과</font><br>");
			pw.print("<html><font size=10>" + result + "</font><br>");
			pw.print("<a href='/pro06/practice0803'>다시 계산해볼께요^^</a>"); // 다른 페이지로 이동
			return;
		}
		
		pw.print("<html><title>계산기</title>");
		pw.print("<font size=5>계산기</font><br>");
		pw.print("<form name='frmCalc' method='get' action = '/pro06/practice0803'/>");
		pw.print("첫번째 수 : <input type='text' name='first' size= 10 />");
		pw.print("<select name='operator'>");
		pw.print("<option value='+'>+</option>");
		pw.print("<option value='-'>-</option>");
		pw.print("<option value='*'>*</option>");
		pw.print("<option value='/'>/</option>");
		pw.print("</select>");
		pw.print("두번째 수 : <input type='text' name='second' size= 10 />");
		pw.print("<input type='hidden' name='command' value='calculate' />"); // hidden -> 서버로 전송하는 부분.
		pw.println("<input type='submit' value='변환' />");
		pw.println("</form>");
		pw.print("</html>");
		pw.close();
	}
	
	private String calculate(float first, String operator, float second) {
		String result = null;
		if(operator.equals("+")) {
			result = String.format("%.6f", first + second);
		} else if(operator.equals("-")) {
			result = String.format("%.6f", first - second);
		} else if(operator.equals("*")) {
			result = String.format("%.6f", first * second);
		} else if(operator.equals("/")) {
			result = String.format("%.6f", first / second);
		} 
		return result;
	}

}
--------------------------------------------------------------------------
package sec03.ex02;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet4
 */
@WebServlet("/login4")
public class LoginServlet4 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init() throws ServletException {
		System.out.println("init 메소드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("destroy 메소드 호출");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet 메소드 호출");
		doHandle(request, response); // get방식으로 요청시 다시 dohandle을 호출
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPost 메소드 호출");
		doHandle(request, response); // post방식으로 요청시 다시 dohandle을 호출
	}
	
	protected void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 모든 호출 방식에 대해 처리 가능.
		request.setCharacterEncoding("UTF-8");
		String user_id = request.getParameter("user_id");
		System.out.println("doHandle 메소드 호출");
		String user_pw = request.getParameter("user_pw");
		System.out.println("아이디 : " + user_id);
		System.out.println("비밀번호 : " + user_pw);
	}

}

--------------------------------------------------------------

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<script type="text/javascript"> // 자바스크립트 영역
		function fn_validate(){ // document : html 객체에 접근할 수 있는 자바스크립트 객체
			var frmLogin = document.frmLogin; // form 정보를 가져온다,
			var user_id = frmLogin.user_id.value;
			var user_pw = frmLogin.user_pw.value;
			
			if((user_id.length == 0 || user_id == "") || (user_pw.length == 0 || user_pw == "")){
				alert("아이디와 비밀번호는 필수입니다.");
			} else {
				frmLogin.method = "post";
				frmLogin.action = "login5";
				frmLogin.submit(); // submit 버튼을 대신한다.
			}
		}
	</script>
	<title>로그인창</title>
</head>

<body>
	<form name = "frmLogin" method = "post" action="login" encType="UTF-8">
		아이디 : <input type = "text" name = "user_id"><br>
		비밀번호 : <input type = "password" name = "user_pw"><br>
		<input type = "button" onClick="fn_validate()" value = "로그인">
		<input type = "reset" value = "다시 입력">
		<input type = "hidden" name="user_address" value = "서울시 성북구"/>
	</form>
</body>
</html>

--------------------------------------------------------------------------

package sec03.ex03;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet5
 */
@WebServlet("/login5")
public class LoginServlet5 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init() throws ServletException {
		System.out.println("init 메소드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("destroy 메소드 호출");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String id = request.getParameter("user_id");
		String pw = request.getParameter("user_pw");
		String address = request.getParameter("user_address");
		System.out.println("아이디 : " + id);
		System.out.println("비밀번호 : " + pw);
		
		String data = "<html>";
		data+= "<body>";
		data+= "아이디 : " + id;
		data+= "<br>";
		data+= "패스워드 : " + pw;
		data+= "<br>";
		data+= "주소 : " + address;
		data+= "</html>";
		data+= "</body>";
		out.print(data); // 브라우저로 쏨
		
	}

}

--------------------------------------------------------------------------
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>단수 입력창</title>
</head>
<body>
	<h1>출력할 구구단의 수를 지정해 주세요.</h1>
	<form method="get" action="/pro06/guguTest">
		출력할 구구단 : <input type=text name="dan" /><br>
		<input type="submit" value="구구단 출력">
	</form>
</body>
</html>
--------------------------------------------------------------------------
package sec04.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class GuguTest
 */
@WebServlet("/guguTest")
public class GuguTest extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init() throws ServletException {
		System.out.println("init 메소드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("destroy 메소드 호출");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		int dan = Integer.parseInt(request.getParameter("dan"));
		out.print("<table border=1 width=800 align=center>");
		out.print("<tr align=center bgcolor='#FFFF66'>");
		out.print("<td colspan=4>" + dan + "단 출력 </td>");
		out.print("</tr>");
		for(int i = 1 ; i < 10; i++)
		{
        // if문을 이용해 행을 나타내는 <tr>태그에 대해 교대로 다른 배경색을 적용합니다.
			if(i % 2 == 0)
			{
				out.print("<tr align = center bgcolor='#ACFA58'>");
			} else
			{
				out.print("<tr align = center bgcolor='#81BEF7'>");
			}
			out.print("<td width=200>");
			out.print("<input type='radio' name='first' />" + i); // radio버튼(name값 써줘야 다중선택 방지됨.)
			out.print("</td>");
			out.print("<td width=200>");
			out.print("<input type='checkbox' />" + i);
			out.print("</td>");
			out.print("<td width=400>");
			out.print(dan + "* " + i);
			out.print("</td>");
			out.print("<td width=400>");
			out.print(i * dan);
			out.print("</td>");
			out.print("</tr>");
		}
		out.print("</table>");
	}

}

--------------------------------------------------------------------------

package sec01.ex01;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class MemberServlet
 */
@WebServlet("/member")
public class MemberServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		MemberDAO dao = new MemberDAO();
		List list = dao.listMembers(); // listMembers메소드로 회원정보를 조회
		
		out.print("<html><body>");
		out.print("<table border=1><tr align='center' bgcolor='lightgreen'>");
		out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>가입일</td><td>");
		
		for(int i = 0; i<list.size(); i++)
		{
			MemberVO memberVO = (MemberVO) list.get(i);
			String id = memberVO.getId();
			String pwd = memberVO.getPwd();
			String name = memberVO.getName();
			String email = memberVO.getEmail();
			Date joinDate = memberVO.getJoinDate();
			out.print("<tr><td>" + id + "</td><td>" + pwd + "</td><td>" + name + "</td><td>" + email + "</td><td>" + joinDate + "</td></tr>");
		}
		out.print("</table></body></html>");
	}

}

------------------------------

package sec01.ex01;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class MemberDAO {
	private static final String driver= "oracle.jdbc.driver.OracleDriver";
	private static final String url = "jdbc:oracle:thin:@localhost:1521:XE";
	private static final String user ="scott";
	private static final String pwd = "tiger";
	private Connection con;
	private PreparedStatement pstmt; // 실무에선 PreparedStatement를 더 많이씀.
	
	public List listMembers()
	{
		List list = new ArrayList();
		try
		{
			connDB(); // 네가지 정보로 데이터베이스를 연결
			String query = "select * from t_member ";
			System.out.println("preparedStatement : " + query);
			pstmt = con.prepareStatement(query); // 파생된 SQL 재사용. preparedStatement 메소드에 sql문을 전달해 prepareStatement객체를 생성. 
			ResultSet rs = pstmt.executeQuery(); // sql문으로 회원 정보를 조회
			while(rs.next())
			{
				// 조회한 레코드의 각 컬럼 값을 받아옴.
				String id = rs.getString("id");
				String pwd = rs.getString("pwd");
				String name = rs.getString("name");
				String email = rs.getString("email");
				Date joinDate = rs.getDate("joinDate");
				// 각 컬럼 값을 다시 MemberVO 객체의 속성에 설정.
				MemberVO vo = new MemberVO();
				vo.setId(id);
				vo.setPwd(pwd);
				vo.setName(name);
				vo.setEmail(email);
				vo.setJoinDate(joinDate);
				list.add(vo); // 설정된 MemberVO 객체를 다시 ArrayList에 저장.
			}
			rs.close();
			pstmt.close();
			con.close();
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return list; // 조회한 레코드의 개수만큼 MemberVO객체를 저장한 ArrayList를 반환.
	}

	private void connDB()
	{
		try
		{
			Class.forName(driver);
			System.out.println("Oracle 드라이버 로딩 성공");
			con = DriverManager.getConnection(url, user, pwd);
			System.out.println("Connection 생성 성공");
		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}

--------------------------------------------

package sec01.ex01;

import java.sql.Date;

public class MemberVO {
	private String id;
	private String pwd;
	private String name;
	private String email;
	private Date joinDate;
	
	public MemberVO()
	{
		System.out.println("MeberVO 생성자 호출");
	}
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public Date getJoinDate() {
		return joinDate;
	}
	public void setJoinDate(Date joinDate) {
		this.joinDate = joinDate;
	}
}







'Bitcamp > BITCAMP - Servlet & JSP' 카테고리의 다른 글

5일차  (0) 2019.08.06
4일차  (0) 2019.08.05
JSP(Java Server Page)  (0) 2019.08.02
2일차 - 서블릿  (0) 2019.08.01
2일차 - HTML  (0) 2019.08.01
And

7일차

|
-- 회원 테이블 생성
create table t_member(
    id varchar2(10) primary key,
    pwd varchar2(10),
    name varchar2(50),
    email varchar2(50),
    joinDate date default sysdate -- default sysdate를 추가하지 않으면 현재시각이 뜸.
);

-- 회원 정보 추가
insert into t_member
values('hong', '1212', '홍길동', 'hong@gmail.com', sysdate);

insert into t_member
values('lee', '1212', '이순신', 'lee@test.com', sysdate);

insert into t_member
values('kim', '1212', '김유신', 'kim@jweb.com', sysdate);
commit; -- commit을 해줘야 영구적으로 반영됨.

select * from t_member; -- 테이블의 모든 컬럼을 조회

'Bitcamp > BITCAMP - SQL' 카테고리의 다른 글

9일차  (0) 2019.08.14
8일차  (0) 2019.08.12
6일차  (0) 2019.07.31
5일차  (0) 2019.07.30
4일차  (0) 2019.07.29
And

JSP(Java Server Page)

|

자바 서버 페이지(JSP)

위키백과 ― 우리 모두의 백과사전.

이동: 둘러보기, 찾기

자바 서버 페이지(JavaServer Pages, JSP)는 HTML내에 자바 코드를 삽입하여 웹 서버에서 동적으로 웹 페이지를 생성하여 웹 브라우저에 돌려주는 언어이다. Java EE 스펙 중 일부로 웹 애플리케이션 서버에서 동작한다.

자바 서버 페이지는 실행시에는 자바 서블릿으로 변환된 후 실행되므로 서블릿과 거의 유사하다고 볼 수 있다. 하지만, 서블릿과는 HTML 표준에 따라 작성되므로 웹 디자인하기에 편리하다. 이와 비슷한 구조인 것인 PHP, ASP, ASP.NET 등도 있다.

아파치 스트럿츠 자카르타 프로젝트 JSTL 등의 JSP 태그 라이브러리를 사용하는 경우에는 자바 코딩없이 태그만으로 간략히 기술이 가능하므로 생산성을 높일 수 있다.

● JSP - 위키백과 : http://ko.wikipedia.org/wiki/자바_서버_페이지

● OKJSP(JSP 전문 사이트) : http://okjsp.pe.kr

● JSP development (API and implementation) : https://jsp.dev.java.net/

● JAVA EE 5 API DOCS : http://java.sun.com/javaee/5/docs/api/

● JSP에 대한 설명 : http://en.wikipedia.org/wiki/JavaServer_Pages

● JavaServer Pages Technology pages of SUN : http://java.sun.com/products/jsp/

 

 

자바 서블릿

위키백과 ― 우리 모두의 백과사전.

이동: 둘러보기, 찾기

 

자바 서블릿(Java Servlet)은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말하며, 흔히 "서블릿"이라 불린다. 

자바 서블릿은 Java EE사양의 일부분으로, 주로 이 기능을 이용하여 쇼핑몰이나 온라인 뱅킹 등의 다양한 웹 시스템이 구현되고 있다.비슷한 기술로는  등을 이용한 CGI, PHP를 아파치 웹 서버 프로세스에서 동작하게 하는 mod_php, 마이크로소프트사의 IIS에서 동작하는 ASP 등이 있다. CGI는 요청이 있을 때마다 새로운 프로세스가 생성되어 응답하는 데 비해, 자바 서블릿은 외부 요청마다 프로세스보다 가벼운 쓰레드로써 응답하므로 보다 가볍다. 또한, 자바 서블릿은 자바로 구현되므로 다양한 플랫폼에서 동작한다.

서블릿은 동적인 콘텐츠를 생성하기 위해 자바로 작성한 웹 컴포넌트이다. 서블릿은 자바 클래스 형태로 작성할 수 있으며, 웹 컨테이너에 의해서 관리된다. 서블릿은 자바 언어를 이용해서 작성하지만, 기존의 C 혹은 C++ 언어를 사용하는 CGI 프로그램에 비해 성능이 뛰어나다. 이것은 CGI가 프로세스(Process) 기반으로 동작하는 것에 비해, 서블릿은 스레드(Thread) 기반으로 동작하기 때문이다. 스레드에 비해서 프로세스는 생성 속도가 느리며, 시스템 자원을 많이 소모한다.

 

서블릿의 장점

● 플랫폼 독립성

서블릿은 자바를 이용해서 작성하기 때문에 플랫폼에 독립적이다. 따라서 작성한 서블릿 프로그램은 변경하지 않더라도 UNIX, 윈도우 등의 컴퓨터 플랫폼에 상관없이 실행할 수 있다.

● 서버 독립성

서블릿은 거의 모든 웹 서버에서 지원하기 때문에 웹 서버와 무관하게 실행될 수 있다.

● 확장성

서블릿은 자바로 작성하기 때문에 다른 업체에서 지원하는 다양한 클래스들을 바로 사용할 수 있다 

● 개발 용이성

CGI 프로그램을 개발하려는 경우 적당한 통합 개발 환경(IDE)이 없지만, 자바의 경우는 다수의 통합 개발환경들이 있다. 프로그램 디버깅 층면에서도 Perl 이나 C로 작성된 CGI 프로그램은 예외처리가 되지 않아서 에러가 발생한 곳이 어딘지를 찾기가 어렵다. 이에 반해 자바는 예외 처리 기능과 통합 개발 환경을 이용해서 쉽게 에러를 발견할 수 있다. 이런 여러가지 측면에서 크고 복잡한 프로그램 개발에는 서블릿이 CGI 프로그램보다 적합하다.

 

● 자바 서블릿 관련 API : j2eeri-1_4-Servlet-doc-api.zip

● 참조 : http://java.sun.com/products/servlet/docs.html

 

[1]. JSP는 .JSP로 저장한다. 

[2]. JAVA 파일이 아니기 때문에 컴파일(Compile)을 필요로 하지 않는다. 

● JSP -> 자바 서블릿 으로 변환되어 실행

 

웹 응용프로그램(Web Application)


웹 서버의 기능을 확장함으로써 비즈니스 로직(Bussiness Logic)을 서버 측에 배포(설치, Deploy)하고, 클라이언트로 웹 브라우저를 사용하는 클라이언트/버서 형태의 프로그램이다.

 

팻클라이언트(Fat Client) - 클라이언트에 대용량의 실행파일을 설치해야하는 경우를 의미

팻서버(Fat Server) - 팻클라이언트 못지 않게 서버도 실행파일을 설치해둬야한다.

 

클라이언트 티어(Client Tier)

이에 해당하는 웹 브라우저는 사용자와 상호 작용하는 인터페이스 역할을 수행하며, 웹 사용자에게 HTML, CSS, 플래시, 자바 스크립트, 그림 파일 등으로 작성된 내용들을 보여준다. 웹 브라우저는 Thin Client(Fat Client의 반대의미)이기 때문에 비즈니스 로직을 가지고 있지 않으며, 사용자를 위한 GUI와 유효성 검사(Validity Check) 기능만을 가지고 있다.

 

미들 티어(Middle Tier)

비즈니스 로직을 수행하고 동적인 콘텐츠를 제공한다. 웹 응용프로그램 중에서 미들 티어는 가장 핵심적인 역할을 수행하는 부분으로서 주로 CGI, ASP, PHP, JSP, 서블릿 등의 기술을 이용해서 프로그램을 작성한다. 우리는 JSP와 서블릿을 이용해서 미들 티어 부분의 프로그램을 작성할 것이다.

 

서버 티어(Server Tier)

데이터를 저장하고 관리하는 역할을 수행하는 부분으로, 데이터를 저장하기 위해 대부분 오라클, MS SQL, MySQL과 같은 DBMS를 이용한다. 미들 티어가 서버 티어에 있는 데이터베이스에 접근하려면, JDBC, ODBC 등과 같은 표준화된 API와 DBMS에서 제공하는 고유의 API를 사용해야 한다.

 

 웹 응용프로그램을 작성하기 위해서는 클라이언트에서 사용하는 HTML, 플래시, 자바 스크립트와 같은 기술과 미들 티어에서 사용하는 CGI, PHP, ASP, JSP, 서블릿과 같은 기술을 함께 사용할 수 있어야 한다.

 

컨테이너(Container)

서버(Server)라고 생각하면 된다. JSP와 서블릿을 실행시킬수 있는 소프트웨어를 웹 컨테이너(Web Container) 혹은 서블릿 컨테이너(Servlet Container)라고 한다. 엔진 이라고도 한다. 대표적인 웹 컨테이너로는 자카르타 톰캣, Resin, 웹로직 등이 있다.

 

[1]. editplus + Resin

[2]. Eclipse + Tomcat

[3]. WebLogic

 


 

Resin 설치하기

http://caucho.com/ 에서 Resine 을 다운 받는다.

현재 업계에서 사용되는 것은 2.1.17 버전( resin-2.1.17.zip )이라고 한다.

압축파일을 풀고 /BIN 폴더로 들어가면 httpd.exe를 실행하면 아래화면을 볼 수 있다. 브라우저에서 http://localhost:8080 을 입력하면 Resine 서버가 작동되고 있는 것을 확인할 수도 있다.

 

 

 이 부분이 서블릿에서 가장 핵심이지 싶다. ㅡㅅ-);

● 서블릿을 만들어서 C:\Program Files\resin-2.1.17\doc\WEB-INF\classes 폴더에 저장해주어야 한다.

..\doc\WEB-INF\classes      (서블릿)JAVA 인 것을 저장.

 

● C:\Program Files\resin-2.1.17\doc 에는 html, jsp, txt, jpg 등을 에 넣어두어야 한다.

..\doc

 

 http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html 참조바람.

 

 


 

서블릿 프로그램 작성

서블릿은 두 개의 패키지로 구성되어 있다. 이 패키지들은 웹 컨테이너에 포함되어 있다.

javax.servlet         : 일반 서비스를 위한 서블릿 패키지

javax.servlet.http   : HTTP 서비스를 위한 패키지

 

아래 그림에 있는 jsdk23.jar 파일을 복사해서

  

아래 폴더의 위치에 붙여넣기 해준다.

 

다시 resin 폴더로 이동해서 resin.conf (resin 설정(Configure) 파일)을 열어본다. 특별히 수정할 필요는 없다.

 

 


 

HelloServlet.java 작성

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

        res.setContentType("text/html;charset=KSC5601");
        // setContentType 를 잘못 입력할 경우, 컴파일 시 다운로드 하시겠습니까? 라고 나온다.
        PrintWriter out = res.getWriter();

        out.println("<html>");
        out.println("<head><title>Hello Servlet</title></head>");
        out.println("<body>");
        out.println("Hello Servlet");
        out.println("</body>");
        out.println("</html>");
        out.close();

    }
}

 

작성 후

[1]. HelloServlet.java 프로그램을 컴파일하고, HelloServlet.class 파일을 <Resin>\doc\WEB-INF\classes 에 복사한다. 만약, class 디렉토리가 없는 경우에는 새로 만들도록 한다(본인의 경우에는 귀찮아서.... classes 폴더에서 자바(.java)를 작성하기로 결심했다).

 

[2]. http://localhost:8080/servlet/MessageServlet  라고 입력하면 

Hello Servlet 이라고 나오는 걸 볼 수 있을 것이다.

 

HelloServlet 과 MessageServlet을 서로 찾게 만드는 코드.

MessageServlet.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class MessageServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

        res.setContentType("text/html;charset=KSC5601");
        // setContentType 를 잘못 입력할 경우, 컴파일 시 다운로드 하시겠습니까? 라고 나온다.
        PrintWriter out = res.getWriter();

        //태그<tag> 사용할 때는 보다시피 .println() 메소드 안에 사용해주면 된다.
        out.println("<html>");
        out.println("<head><title>Hello Servlet</title></head>");
        out.println("<body>");
        out.println("Message Servlet : ");
        out.println("<a href='HelloServlet'>HelloServlet Link</a>");
        out.println("</body>");
        out.println("</html>");
        out.close();

    }
}

HelloServlet.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

        res.setContentType("text/html;charset=KSC5601");
        // setContentType 를 잘못 입력할 경우, 컴파일 시 다운로드 하시겠습니까? 라고 나온다.
        PrintWriter out = res.getWriter();

        //태그<tag> 사용할 때는 보다시피 .println() 메소드 안에 사용해주면 된다.
        out.println("<html>");
        out.println("<head><title>Hello Servlet</title></head>");
        out.println("<body>");
        out.println("Hello Servlet : ");
        out.println("<a href='MessageServlet'>MessageServlet Link</a>");
        out.println("</body>");
        out.println("</html>");
        out.close();

    }
}

 

그림 파일을 넣는 방법

HelloWorld.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloWorld extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

        res.setContentType("text/html;charset=KSC5601");
        // setContentType 를 잘못 입력할 경우, 컴파일 시 다운로드 하시겠습니까? 라고 나온다.
        PrintWriter out = res.getWriter();

        //태그<tag> 사용할 때는 보다시피 .println() 메소드 안에 사용해주면 된다.
        out.println("<html>");
        out.println("<head><title>Hello Servlet</title></head>");
        out.println("<body>");
        out.println("Hello Servlet : ");
        out.println("<a href='MessageServlet'>MessageServlet Link</a>");
        out.println("<img src = '/images/comics.gif>");
        out.println("</body>");
        out.println("</html>");
        out.close();

    }
}

 

 

HTTP 관련 오류코드

오류 1) http://localhost:8080/servlet/HelloWorld 8  라고 할 경우.

500 Servlet Exception

Resin 2.1.17 (built Tue Jul 11 09:01:03 PDT 2006)

 


 

오류 2) http://localhost:8080/test.html 라고 할 경우(404 에러)  파일이 존재하지 않을 때

404 Not Found

/test.html was not found on this server.

Resin 2.1.17 (built Tue Jul 11 09:01:03 PDT 2006)

 

 


 

오류 3) http://localhost:8080/servlet/HelloWorld 하고 발생할 경우(405 에러) Get 메소드가 쓰여야할 곳에 doPost()를 사용했을 때 발생.

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloWorld extends HttpServlet {
    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

        res.setContentType("text/html;charset=EUC-KR");
        // setContentType 를 잘못 입력할 경우, 컴파일 시 다운로드 하시겠습니까? 라고 나온다.
        PrintWriter out = res.getWriter();

        //태그<tag> 사용할 때는 보다시피 .println() 메소드 안에 사용해주면 된다.
        out.println("<html>");
        out.println("<head><title>Hello Servlet</title></head>");
        out.println("<body>");
        out.println("Hello Servlet : ");
        out.println("<a href='MessageServlet'>MessageServlet Link</a>");
        out.println("<img src = '/images/comics.gif>");
        out.println("</body>");
        out.println("</html>");
        out.close();

    }
}

405 GET not supported

 

Resin 2.1.17 (built Tue Jul 11 09:01:03 PDT 2006)

 

 

서블릿 라이프 사이클


서블릿은 init(), service(), destroy() 메소드를 호출하는 라이프 사이클을 가진다.

 

init()

 

처음에 서블릿이 메모리에 로드(Load)되면 init() 메소드가 수행된다. init() 메소드는 서블릿이 서비스 하기 위해 필요한 초기화 작업을 수행한다. 따라서 init()메소드는 서블릿이 실행되기 위해서 필요한 각종 환경을 설정하기 위한 목적으로 사용한다. 예를 들어, 필요한 파일을 열고, 데이터베이스에 연결하는 등의 작업을 수행한다(자바로 치면 생성자 정도 되려나?).

 

service()

 

초기화된 서블릿은 클라이언트의 요청이 있을 때마다 스레드가 생성되어서 병행적으로 service() 함수를 수행한다. 따라서 서블릿을 개발할 때 병행성 문제를 고려해야 한다. 클라이언트의 요청이 있을 때마다 service() 메소드가 호출되고, service() 메소드가 HTTP의 method 타입에 따라 GET 방식이면 doGet() 메소드를, POST 방식이면 doPost() 메소드를 호출한다.

 

destroy()

 

서블릿이 더 이상 서비스를 하지 않거나 메모리가 부족하면 웹 컨테이너에 의해 서블릿은 메모리에서 언로드(Unload)된다. 이때 메모리에서 언로드 되기 전에 destroy() 함수가 수행된다.

 

서블릿 작업 중단

클라이언트의 요청을 처리하는 서블릿의 작업을 더 이상 진행시키지 않고, 중단시키기 위해서는 doPost(), doGet(), service() 등의 함수에서 return 문을 사용해야 한다. 서블릿 작업을 중둔시키기 위해 System.exit()을 호출해서는 안된다. System.exit()을 호출하면 서블릿 컨테이너가 종료된다.

 

 

● doGet() 메소드는 브라우저에서 호출될 경우 작동함.

● doPost() 메소드는 Form 태그 안에서 method = POST 일 때에 호출됨

  1.  <BODY>
      <FORM METHOD=POST ACTION="">
       
      </FORM>
     </BODY>

 

서블릿을 이용한 폼 데이터 처리

  1. contact.html(경로 : <Resin>\doc\contact.html>
  2. 실행 : 웹브라우저 상에서 주소창에 http://localhost:8080/contact.html 호출

  3.  

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
     <HEAD>
      <TITLE> New Document </TITLE>
      <META NAME="Generator" CONTENT="EditPlus">
      <META NAME="Author" CONTENT="">
      <META NAME="Keywords" CONTENT="">
      <META NAME="Description" CONTENT="">
     </HEAD>

     <BODY>
      <FORM METHOD=POST ACTION=/servlet/Contact>
      <!-- 서블릿 에서는 doPost() 메소드를 사용해줘야 한다.-->
        로그인<br><hr>
        번호 : <INPUT TYPE="text" NAME="number"><br>
        이름 : <INPUT TYPE="text" NAME="name"><br>
        주소 : <INPUT TYPE="text" NAME="address"><br><hr>
        <INPUT type="submit">
        <!-- Form 태그에 ACTION 안에 입력된 곳으로 이동 -->
      </FORM>
     </BODY>
    </HTML>

 

  1. Contact.java (클래스 파일 위치는 <Resin>\doc\WEB-INF\classes\Contact.class)

  2.  

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Contact extends HttpServlet {

    public void doPost(HttpServletRequest req, HttpServletResponse res){
        try {
            res.setContentType("text/html; charset=KSC5601");
            PrintWriter out  = res.getWriter();
            req.setCharacterEncoding("KSC5601");
            String number = req.getParameter("number"); // html 에서 name ="number"인 입력상자의 파라메터 받아와서 number에 넣음
            String name = req.getParameter("name"); //name="name"인 파라메터 받아와서 name에 넣음
            String address = req.getParameter("address"); //name="address"인 파라메터 받아와서 address에 넣음
            out.println("<html>");
            out.println("<head><title>Contact 서블릿 실행하기</title></head>");
            out.println("<body><h3> " +number + " 번 당신!!<h3><br>");
            out.println("이름은 " + name + " 이고!!!");
            out.println("사는 곳은 " + address + " 가 맞지!?");
            out.println("조사하면 다나와~~ ㅡㅅ-)ㅋ");
            out.println("</body>");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

contact.html 실행화면(브라우저에서 실행해야 한다 ㅡㅅ-)b

 

contact.html 내에서 Form 의 action 에 의해 Contact 서블릿이 호출되는 상황

 

 

● 폼 데이터 처리

HTML의 폼에서 태그에 사용된 이름이 유일한 경우에는 getParameter9)로 값을 알아볼 수 있었다. 하지만, 동일한 이름이 여러 번 사용된 경우에는 어떻게 될까? 이러한 경우에는 전달되는 값도 여러 개이다. 따라서 값을 얻을 때 여러 개의 값을 저장할 수 있는 배열 형태를 사용해야 한다. HttpServletRequest는 이러한 용도로 getParameterValues() 메소드를 제공한다. 이 메소드는 다음 예와 같은 방법으로 사용할 수 있다. 이 메소드를 사용할 때 주의할 점은 해당 이름으로 값이 전달되지 않는 경우에 리턴 값이 "null"이 올 수도 있기 때문에 "null"인지 여부를 반드시 확인하여야 한다.

 

예 : 값이 여러 개 전달되는 경우

String values[] = res.getParameterValues("name");
if ( values != null) {
   ...
}

※ 전달되는 값

HTML의 폼(Form)에서 Input 타입이 text인 경우에는 사용자가 입력한 문자열이 서블릿에 전달된다. 그런데 입력 타입이 checkbox나 radio인 경우에는 어떤 값들이 전달될까? HML 폼에서 체크박스를 사용하면 선택된 체크 박스의 value 속성으로 기술된 값만 서블릿에 전달된다. 만약 HTML 폼의 체크 박스에 value 속성을 기술하지 않으면 'on' 값이 서블릿에 전달되기 때문에 주의해야 한다.

 

예 : 파라미터 이름을 모를 경우

import java.util.Enumeration; //필요

Enumeration e = req.getParameterNames();
while( e.hasMoreElements() ) {
   String name = (String) e.nextElement();
   String value = req.getParameter(name);
   if (values != null){
      for(int i = 0; i < values.length; i++ ) {
         out.println("<li>" + name + " : " + values[i]);
      }
   }
}



출처: https://java.ihoney.pe.kr/29 [허니몬(Honeymon)의 자바guru]

'Bitcamp > BITCAMP - Servlet & JSP' 카테고리의 다른 글

4일차  (0) 2019.08.05
3일차  (0) 2019.08.02
2일차 - 서블릿  (0) 2019.08.01
2일차 - HTML  (0) 2019.08.01
1일차  (0) 2019.07.31
And

좌석 예약 시스템

|
package Week04.day0730;

import java.util.Scanner;

/* 실습 2
다음은 명품콘서트홀 예약시스템이다
- 공연은 하루에 한 번 있다.
클래스로 구현하시오*/

public class BookingSystem {

	public static void main(String[] args) {
		
		boolean flag = true;
		
		
		String cusName = null; // 예약자 성명
		int stGubun = 0; // 좌석타입
		int stNum = 0;
		
		Book ss = new Book(cusName, stGubun, stNum);
		
		Scanner sc = new Scanner(System.in);
		
		while(flag) { // - 예약 시스템의 메뉴는 "예약", "조회", "취소", "끝내기"가 있다.
					  // - 없는 이름, 없는 번호, 없는 메뉴, 잘못된 취소 등에 대해서 오류 메시지를 출력하고 사용자가 다시시도하도록 한다.
			System.out.println();
			System.out.println("=============명품콘서트홀 예약시스템입니다.==============");
			System.out.println("원하는 서비스의 번호를 입력하세요. 1)예약 2)조회 3)취소 4)끝내기"); 
			
			int service_num = sc.nextInt();
			switch(service_num) {
			case 1: 
				ss.bookSeat();
				break;
			case 2: 
				ss.searchSeat();
				break;
			case 3: 
				ss.canSeat();
				break;
			case 4: // 끝내기
				System.out.println("시스템이 종료됩니다.");
				flag = false;
				break;
			default:
				System.out.println("잘못 누르셨습니다. 올바른 번호를 입력해주세요.");
			}
		}
	}
}

class Book{
	String cusName; // 예약자 성명
	int stGubun; // 좌석타입
	int stNum; // 좌석번호
	String[][] seats = new String[3][10]; // 좌석구분 - S A B 각 10석씩.
	String[] list = {"S","A","B"};
	
	public Book(String cusName, int stGubun, int stNum) {
		this.cusName = cusName;
		this.stGubun = stGubun;
		this.stNum = stNum;
		
		for(int i = 0 ; i < 3 ; i++) {
			for(int j = 0; j < 10 ; j++) {
				seats[i][j] = "__";
			}
		}
	}
	
	public void bookSeat() { // 좌석예약
		// 예약 - 예약은 한 자리만 가능하고, 좌석 타입, 예약자 이름, 좌석 번호를 순서대로 입력받아 예약한다.
		// - 좌석은 S석, A석,B석으로나뉘며,각각 10개의 좌석이 있다.
		
		Scanner sc = new Scanner(System.in);
		System.out.println("-----------좌석 예약-----------");
		System.out.println("성명을 입력하세요");
		System.out.println("성명 :");
		String cusName = sc.next();
		while(true) {
			System.out.println("원하시는 좌석등급을 선택하세요. S석 = 1/A석 = 2/B석 = 3 (숫자로 입력해주세요)");
			System.out.println("좌석등급 :");
			int stGubun = sc.nextInt() - 1;
			System.out.println("원하시는 좌석번호을 선택하세요. 1~10번");
			System.out.println("좌석번호 :");
			int stNum = sc.nextInt() - 1 ;
         		if(stNum>10){
         			System.out.println("잘못된 좌석번호 입니다. 다시 입력해주세요.");
         			stNum = sc.nextInt()-1;
         		}
         		if(seats[stGubun][stNum].equals(cusName)){
         			System.out.println("이미 예약된 자리입니다.다시 시도해주세요.");
         	}
         	seats[stGubun][stNum] = (cusName);
         	break;
		}
		System.out.println();
	}
	
	public void searchSeat() { // 좌석조회 및 출력
		// 조회 - 조회는 모든 좌석을 출력한다.
		System.out.println("-----------좌석조회-----------");
		for (int i = 0; i < 3; i++) {
            System.out.print("\n" + list[i] + "석 ");
            for (int j = 0; j < 10; j++) {
                System.out.print(" "+ seats[i][j]);
            }
        }
	}
	
	public void canSeat() { // 좌석취소
		// 취소 - 취소는 예약자의 이름을 입력받아 취소한다.
			Scanner sc = new Scanner(System.in);
			System.out.println("-----------예약 취소-----------");
			System.out.println("예약자 성명:");
				String canName = sc.next();
				for (int i = 0; i < 3; i++) {
					for (int j = 0; j < 10; j++) {
						if(canName.equals(seats[i][j])) {
							seats[i][j] = "__";
							System.out.println("예약이 취소 되었습니다.");
							break;
					}
				}
			}
	}
}

'Java' 카테고리의 다른 글

Server 1대에 Multi version 의 JDK 사용  (0) 2022.12.06
DAO, DTO, VO  (0) 2022.03.21
디버깅하는 법  (0) 2019.07.31
주차관리 시스템 ver.2  (0) 2019.07.24
Java - Stream, Network  (0) 2019.07.23
And

INNER JOIN

|

1. JOIN

 

JOIN이란, 두 개 이상의 테이블을 서로 묶어서 하나의 결과 집합으로 만들어 내는 것을 의미한다.

 

JOIN은 다음과 같이 네 가지 타입이 있다.

  • INNER JOIN
  • OUTER JOIN
  • CROSS JOIN
  • SELF JOIN

이번 챕터에서는 INNER JOIN에 대해서만 알아볼 것이다.

 

MSDN의 JOIN FUNDAMENTAL 페이지 Using JOINS 페이지를 참고하자.

 

 

2. INNER JOIN

 

대개의 업무에서 조인은 INNER JOIN을 주로 사용하며, 일반적으로 JOIN이라 하면, INNER JOIN을 지칭하는 것이다.

 

개념적인 이해를 돕기 위해, 우선 INNER JOIN을 사용해야 하는 경우에 대해 살펴보자.

아래 UserTable과 BuyTable을 기준으로 설명하겠다.

 

 

BuyTable을 보면, 물건을 구매한 사용자의 아이디와 물건 등의 정보만 나타난다.

그런데 이 물건을 배송하기 위해서는 구매한 회원의 주소를 알아야 한다.

이 회원의 주소를 알기 위해 주소 정보가 있는 UserTable과 결합하는 조인이 INNER JOIN이다.

 

우선 INNER JOIN의 기본 구문을 살펴보자.

 

SELECT <열 목록>

FROM <첫 번째 테이블>

    INNER JOIN <두 번째 테이블>

    ON <조인될 조건>

[WHERE 검색조건]

 

참고로, 위 형식에서 INNER JOIN을 JOIN이라고만 해도 INNER JOIN이라고 인식한다.

 

이제 BuyTable에서 'KJD'이라는 아이디를 가진 사람이 구매한 물건을 배송하기 위해서,

두 개의 테이블을 통째로 조인하려면 아래와 같이 하면 된다.

 

SELECT *

FROM BuyTable                         -- 첫번째 테이블

        INNER JOIN UserTable          -- 두번째 테이블

        ON BuyTable.ID = UserTable.ID -- JOIN 조건

WHERE BuyTable.ID = 'KJD'

 

위 예제의 결과는 다음과 같다.

 

 

UserTable과 BuyTable 모두 ID 컬럼이 존재하기에 반드시 테이블명.칼럼명 형태로 작성해야 한다.

그렇지 않으면, 아래와 같은 에러가 발생한다.

 

메시지 209, 수준 16, 상태 1, 줄 5

열 이름 'ID'이(가) 불확실합니다.

 

위 결과를 생성하기 위해서 다음과 같은 과정을 거친다.

  1. BuyTable의 'KJD' ID를 추출해 낸다.
  2. 'KJD'와 동일한 값을 UserTable에서 검색한 후
  3. 'KJD'라는 ID를 찾으면, BuyTable과 UserTable의 모든 칼럼을 결합(JOIN)한다.

만약, 위 예제에서 WHERE 문이 빠져 있다면, 모든 구매기록에 대해 BuyTable + UserTable의 결합이 발생하게 된다.

 

 

지금까지의 내용을 토대로 한 가지 사실을 유추해 낼 수 있다.

 

INNER JOIN 조인될 조건이 부합하는 행에 대해서만 JOIN이 발생하는 것이다.

 

 

3. 테이블의 별칭

 

이는 INNER JOIN에만 국한되는 것은 아니다.

다만, 앞으로 계속해서 사용하게 될 녀석이라 이 기회에 설명하고자 한다.

 

위 예제에서는 테이블 2개를 통째로 조인하였다.

그 결과 결합된 결과의 열이 너무 많아 이번엔 필요한 열만 추출해 보기로 하자.

 

SELECT BuyTable.ID, Name, GoodName, Addr, Mobile1 + N'-' + Mobile2 AS [연락처]

FROM BuyTable

        INNER JOIN UserTable

        ON BuyTable.Id = UserTable.ID

 

ID는 BuyTable에도 있고, UserTable에도 있기에 반드시 테이블명.컬럼명 형태로 작성해야 한다고 했다.

헌데, 매번 8~9 글자를 타이핑 하려니 여간 귀찮은 게 아니다.

 

이럴 때 테이블에 별칭을 부여하여, 타이핑을 간단하게 해 보자.

 

SELECT B.ID, Name, GoodName, Addr, Mobile1 + N'-' + Mobile2 AS [연락처]

FROM BuyTable AS B

        INNER JOIN UserTable AS U

        ON B.Id = U.ID

 

보통의 별칭 부여와 마찬가지로 AS 별칭을 구문을 사용하였다.

하지만, 테이블의 경우엔 간단히 FROM 절에 나오는 테이블 이름 뒤에 별칭만 붙여도 된다.

 

따라서, 위 예제에서 아래와 같이 테이블에 대해선 AS 를 생략할 수 있다.

 

SELECT B.ID, Name, GoodName, Addr, Mobile1 + N'-' + Mobile2 AS [연락처]

FROM BuyTable B

        INNER JOIN UserTable U

        ON B.Id = U.ID

 

 

4. DISTINCT를 이용한 예제

 

앞선 예제들에선 BuyTable에 UserTable을 결합시켰는데,

이번에는 반대로 UserTable에 BuyTable을 결합시켜 보자.

 

그리고 INNER JOIN은 조건에 부합되는 행만 조인하기에 이러한 특성을 이용하여,

한 번이라도 물건을 구매한 VIP 고객 정보만 추출해 보도록 하자.

 

-- DISTINCT문을 활용하여, 고객 명단만 추출하였다.

SELECT DISTINCT U.ID, Name, Addr

FROM UserTable U

        INNER JOIN BuyTable B

        ON U.ID = B.ID

 

위 예제를 EXISTS 구문을 이용하여 똑같은 결과를 얻을 수는 있지만,

이는 처리과정이 INNER JOIN에 비해 복잡하고 성능이 떨어지므로, 아래와 같은 방법은 혹여라도 사용하지 말자.

 

-- 아래 방법은 데이터베이스가 커질수록 성능이 나빠진다

SELECT DISTINCT U.ID, Name, Addr

FROM UserTable U

WHERE EXISTS

(

        SELECT *

        FROM BuyTable B

        WHERE U.ID = B.ID

)

 

 

5. 세 개 이상의 테이블 조인

 

테이블간 조인은 당연히 세 개 이상의 조인을 지원한다.

 

개념적으로 쉽게 접근하기 위해, 학생과 동아리의 관계를 생각해 보자.

한 학생은 여러 동아리에 가입할 수 있고, 한 동아리는 여러 학생이 가입할 수 있으므로, 

두 개는 서로 다대다(many-to-many) 관계라고 표현할 수 있다. 

 

다대다 관계를 구성하기 위해선 두 개의 테이블 사이에 연결 테이블을 둬서

이 연결 테이블과 두 테이블이 일대다 관계를 맺도록 구성해야 한다.

 

즉, 아래 세 테이블의 관계가 필요한 것이다.

 

-- 학생 테이블

-- 동명이인 처리를 위해 학생 이름을 PK로 잡진 않지만, 예제니까...

CREATE TABLE StudentTable

(

        Name NVARCHAR(5) NOT NULL PRIMARY KEY,

        Addr NVARCHAR(5) NOT NULL,

)

GO



-- 동아리 테이블

CREATE TABLE ClubTable

(

        Name NVARCHAR(5) NOT NULL PRIMARY KEY,

        RoomNo INT NOT NULL

)

GO



-- 학생과 동아리를 연결해주는 연결 테이블

-- 학생 테이블과 동아리 테이블의 PK들을 FK로 참조하고 있다

CREATE TABLE StdClubTable

(

        ID INT IDENTITY PRIMARY KEY,

        StdName NVARCHAR(5) NOT NULL FOREIGN KEY REFERENCES StudentTable(Name),

        ClubName NVARCHAR(5) NOT NULL FOREIGN KEY REFERENCES ClubTable(Name)

)

GO

 

위와 같이 테이블을 구성하고, 대략의 데이터를 채워 넣으면 아래와 같은 그림이 나온다.

 

 

이제 학생을 기준으로 학생이름, 지역, 가입한 동아리 이름, 동아리 방번호를 출력해 보자.

이를 출력하기 위해서는 다음과 같은 단계가 필요하다.

  1. StudentTable과 StdClubTable을 조인하여 학생 이름과 동아리 이름을 결합
  2. 이 결합된 것을 다시 ClubTable과 조인하여 동아리 방번호까지 결합

즉, 두 번의 조인(결합)이 필요하게 된다.

 

SELECT S.Name, Addr, C.Name, RoomNo

-- 먼저 StudentTable과 StdClubTable을 조인하고

FROM StudentTable S

        INNER JOIN StdClubTable SC

        ON S.Name = SC.StdName

            -- 그 결합에 다시 ClubTable을 조인한다

            INNER JOIN ClubTable C

            ON SC.ClubName = C.Name

 

위 예제의 결과는 다음과 같다.

 

 

And

OUTER JOIN

|

1. OUTER JOIN

 

INNER JOIN이 JOIN 조건에 부합하는 행만 JOIN이 발생하는 것이라면, 

OUTER JOIN 조건에 부합하지 않는 행까지도 포함시켜 결합하는 것을 의미한다.

 

자주는 아니지만, 가끔 유용하게 사용될 수 있으므로 꼭 알아둘 필요는 있다.

 

기본 구문은 아래와 같다.

 

SELECT <열 목록>

FROM <첫번째 테이블 (LEFT 테이블)>

    <LEFT | RIGHT | FULL> OUTER JOIN <두번째 테이블 (RIGHT 테이블)>

                          ON <조인될 조건>

[WHERE 검색 조건]

 

INNER JOIN과 유사해 보이지만, LEFT, RIGHT, FULL의 새로운 키워드들이 보인다.

 

 

2. LEFT OUTER JOIN

 

LEFT OUTER JOIN 왼쪽 테이블의 것은 조건에 부합하지 않더라도 모두 결합되어야 한다는 의미이다.

 

즉, FROM 첫번째 테이블 LEFT OUTER JOIN 두번째 테이블이라면, 첫번째 테이블의 것은 모두 출력되어야 한다.

예제를 살펴 보자.

 

-- 전체 회원의 구매기록을 살펴보자.

-- 단, 구매 기록이 없는 회원도 출력되어야 한다.



-- LEFT OUTER JOIN이므로, UserTable은 모두 출력된다



SELECT U.ID, Name, GoodName, Addr

FROM UserTable U                    -- LEFT Table    

        LEFT OUTER JOIN BuyTable B  -- RIGHT Table

        ON U.ID = B.ID

ORDER BY U.ID

 

INNER JOIN시 INNER 키워드를 생략 가능했던 것처럼,

LEFT OUTER JOIN 역시 LEFT JOIN만으로 작성해도 무방하다.

 

위 예제의 결과는 아래와 같다. (모든 UserTable의 행이 출력되었다)

 

 

 

3. RIGHT OUTER JOIN

 

RIGHT OUTER JOIN 오른쪽 테이블의 것은 조건에 부합하지 않더라도 모두 결합되어야 한다는 의미이다.

 

즉, FROM 첫번째 테이블 RIGHT OUTER JOIN 두번째 테이블이라면, 두번째 테이블의 것은 모두 출력되어야 한다.

LEFT OUTER JOIN의 예제와 동일한 결과를 얻을 수 있도록 예제를 작성해 보자.

 

- 전체 회원의 구매기록을 살펴보자.

-- 단, 구매 기록이 없는 회원도 출력되어야 한다.



-- RIGHT OUTER JOIN이므로, UserTable은 모두 출력된다



SELECT U.ID, Name, GoodName, Addr

FROM BuyTable B                       -- LEFT Table    

        RIGHT OUTER JOIN UserTable U  -- RIGHT Table

        ON B.ID = U.ID

ORDER BY U.ID

 

역시 RIGHT OUTER JOIN은 RIGHT JOIN만으로도 작성이 가능하다.

 

 

4. FULL OUTER JOIN

 

전체 조인 또는 전체 외부 조인이라고 한다.

FULL OUTER JOIN은 LEFT OUTER JOIN과 RIGHT OUTER JOIN을 합친 것이라고 생각하면 된다.

 

즉, 한쪽을 기준으로 조건과 일치하지 않는 것을 출력하는 것이 아니라,

양쪽 모두에 조건이 일치하지 않는 것들까지 모두 결합하는 개념이다.

 

따라서, 테이블들의 모든 행이 조건에 관계없이 결합된다.

 

 

5. 세 개 이상의 테이블 조인

 

INNER JOIN 문서의 예제를 재활용하자.

 

INNER JOIN 예제를 보면, 동아리에 가입하지 않은 '김제둥'은 결과에 포함되지 않았다.

이를 OUTER JOIN으로 동아리에 가입하지 않은 학생까지 출력되도록 예제를 작성해 보자.

 

SELECT S.Name, Addr, C.Name, RoomNo

FROM StudentTable S

        -- 먼저 StudentTable이 모두 출력될 수 있도록 StdClubTable과 LEFT OUTER JOIN

        LEFT OUTER JOIN StdClubTable SC

        ON S.Name = SC.StdName

            -- 그 결합에 다시 ClubTable을 LEFT OUTER JOIN

            LEFT OUTER JOIN ClubTable C

            ON SC.ClubName = C.Name

 

결과는 다음과 같이 동아리에 가입하지 않은 '김제둥'도 출력되었다.

 

 

이번엔 학생 기준이 아닌, 동아리를 기준으로 가입된 학생을 출력하되,

가입 학생이 하나도 없는 동아리라도 출력될 수 있도록 예제를 작성해 보자.

 

SELECT C.Name, RoomNo, S.Name, Addr

FROM StudentTable S

        -- 먼저 StudentTable이 모두 출력될 수 있도록 StdClubTable과 LEFT OUTER JOIN

        LEFT OUTER JOIN StdClubTable SC

        ON S.Name = SC.StdName

            -- 이후 클럽이 모두 출력될 수 있도록 ClubTable이 결합 결과를 RIGHT OUTER JOIN

            RIGHT OUTER JOIN ClubTable C

            ON SC.ClubName = C.Name

 

결과는 아래와 같다.

 

 

사실 위 예제에서 동아리에 가입하지 않은 학생의 경우 최종 목적 출력에 아무런 의미가 없으므로, 

아래와 같이 작성하는 것이 더욱 깔끔하고 성능도 조금 더 낫다.

 

SELECT C.Name, RoomNo, S.Name, Addr

FROM StudentTable S

        -- StudentTable과 StdClubTable을 INNER JOIN하여 동아리에 가입한 학생을 추출하고,

        INNER JOIN StdClubTable SC

        ON S.Name = SC.StdName

            -- 모든 클럽이 출력될 수 있도록 위 INNER JOIN의 결합 결과를 

            -- ClubTable이 다시 RIGHT OUTER JOIN

            RIGHT OUTER JOIN ClubTable C

            ON SC.ClubName = C.Name

And

2일차 - 서블릿

|

<doGet> : value값이 url에 붙어나옴

<doPost> : value값이 url에 붙어나오지 않음.

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 창</title>
</head>
<body>
	<form name="frmLogin" method="get" action="login2" encType="URF-8">// get or post 설정
		아이디 : <input type="text" name="user_id"> <br>
		비밀번호 : <input type="password" name="user_pw"> <br>
		<input type="submit" value="로그인"><input type="reset" value="다시입력">
	</form>
</body>
</html>

--------------------------------------------------------------------------

package sec01.ex01;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init() throws ServletException {
		System.out.println("init 메소드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("destroy 메소드 호출");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		System.out.println("아이디 : " + user_id);
		System.out.println("비밀번호 : " + user_pw);
	}
	
}

--------------------------------------------------------------------------

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>여러 가지 input 타입 표시 창</title>
</head>
<body>
	<form name="frmLogin" method="get" action="input2">
		아이디 : <input type="text" name="user_id"> <br>
		비밀번호 : <input type="password" name="user_pw"> <br>
		<input type="checkbox" name="subject" value="java" checked> 자바
		<input type="checkbox" name="subject" value="C언어" checked> C언어
		<input type="checkbox" name="subject" value="JSP" checked> JSP
		<input type="checkbox" name="subject" value="안드로이드" checked> 안드로이드
		<br><br>
		<input type="submit" value="전송">
		<input type="reset" value="초기화">
	</form>
</body>
</html>

--------------------------------------------------------------------------

package sec01.ex01;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class InputServlet
 */
@WebServlet("/input")
public class InputServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init() throws ServletException {
		System.out.println("init 메소드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("destroy 메소드 호출");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		System.out.println("아이디 : " + user_id);
		System.out.println("비밀번호 : " + user_pw);
		String[] subject = request.getParameterValues("subject");
		for(String str : subject) {
			System.out.println("선택한 과목 : " + str);
		}
	}

}

--------------------------------------------------------------------------

package sec01.ex01;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class InputServlet2
 */
@WebServlet("/input2")
public class InputServlet2 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init() throws ServletException {
		System.out.println("init 메소드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("destroy 메소드 호출");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		Enumeration enu = request.getParameterNames();
		while (enu.hasMoreElements())
		{
			String name = (String)enu.nextElement();
			String[] values = request.getParameterValues(name);
			for(String value : values)
			{
			System.out.println("name= " + name + ", value = " + value);
			}
		}
	}

}

--------------------------------------------------------------------------

package sec01.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet2
 */
@WebServlet("/login2")
public class LoginServlet2 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init() throws ServletException {
		System.out.println("init 메소드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("destroy 메소드 호출");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		//client에서 받을 user_id, user_pw
		String id = request.getParameter("user_id");
		String pw = request.getParameter("user_pw");
		
		String data = "<html>";
			data+= "<body>";
			data+= "아이디 : " + id;
			data+= "<br>";
			data+= "패스워드 : " + pw;
			data+= "</html>";
			data+= "</body>";
		out.print(data); // 브라우저로 쏨
	}

}
--------------------------------------------------------------------------
<환율계산기>

package sec02.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class CalcServlet
 */
@WebServlet("/calc")
public class CalcServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static final float USD_RATE = 1188.80F;
	private static final float JPY_RATE = 1089.24F;
	private static final float CNY_RATE = 172.07F;
	private static final float GBP_RATE = 1441.00F;
	private static final float EUR_RATE = 1312.38F;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init() throws ServletException {
		System.out.println("init 메소드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("destroy 메소드 호출");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter pw = response.getWriter();
		
		String command = request.getParameter("command");
		String won = request.getParameter("won");
		String operator = request.getParameter("operator");
		
		if(command != null && command.equals("calculate"))
		{
			String result = calculate(Float.parseFloat(won), operator);
			pw.print("<html><font size=10>변환 결과</font><br>");
			pw.print("<html><font size=10>" + result + "</font><br>");
			pw.print("<a href='/pro06/calc'>환율 계산기</a>"); // 다른 페이지로 이동
			return;
		}
		
		pw.print("<html><title>환율계산기</title>");
		pw.print("<font size=5>환율계산기</font><br>");
		pw.print("<form name='frmCalc' method='get' action = '/pro06/calc'/>");
		pw.print("원화 : <input type='text' name='won' size= 10 />");
		pw.print("<select name='operator'>");
		pw.print("<option value='dollar'>달러</option>");
		pw.print("<option value='en'>엔화</option>");
		pw.print("<option value='wian'>위안</option>");
		pw.print("<option value='pound'>파운드</option>");
		pw.print("<option value='euro'>유로</option>");
		pw.print("</select>");
		pw.print("<input type='hidden' name='command' value='calculate' />"); // hidden -> 서버로 전송하는 부분.
		pw.println("<input type='submit' value='변환' />");
		pw.println("</form>");
		pw.print("</html>");
		pw.close();
	}
		
	private String calculate(float won, String operator) {
		String result = null;
		if(operator.equals("dollar")) {
			result = String.format("%.6f", won / USD_RATE);
		} else if(operator.equals("en")) {
			result = String.format("%.6f", won / JPY_RATE);
		} else if(operator.equals("wian")) {
			result = String.format("%.6f", won / CNY_RATE);
		} else if(operator.equals("pound")) {
			result = String.format("%.6f", won / GBP_RATE);
		} else if(operator.equals("euro")) {
			result = String.format("%.6f", won / EUR_RATE);
		}
		return result;
	}

}

'Bitcamp > BITCAMP - Servlet & JSP' 카테고리의 다른 글

4일차  (0) 2019.08.05
3일차  (0) 2019.08.02
JSP(Java Server Page)  (0) 2019.08.02
2일차 - HTML  (0) 2019.08.01
1일차  (0) 2019.07.31
And

2일차 - HTML

|

주요내용 : HTML(W3School)

<!DOCTYPE html> -- html 버전이 무엇인지 표현해줌.
<html> -- 열고 닫는 구조로 되어 있음.
<head> -- html 설명해주는 부분. css
<title>Page Title</title>
</head>
<body> - body 필수, 컨텐츠 들어감.

<h2>My First Heading</h2> -- 제목태그 - 숫자가 작아지면 크기도 작아짐.
<p>My first paragraph.</p> -- 본문태그
<br>태그 - 줄바꿈

<a href="https://maeryo88.tistory.com/">매료매료</a> -- 페이지 이동시킬 때 사용

<img src="pic_trulli.jpg" alt="Trulli" width="500" height="333"> -- alt : 이미지가 없을때 대체 텍스트나오는 부분.

<button>Click me</button> -- 버튼

<ul> -- 리스트(순서없는 것)
<ol> -- 리스트(순서있는 것)

<pre> - 입력한대로 display 되는 태그

<h1 style="border: 2px solid white;">Hello World</h1> - 테두리 색 지정

<h1 style="background-color:rgba(255, 99, 71, 0.1);">rgba(255, 99, 71, 0.5)</h1> -- 0.1은 투명도

<!-- 주석내용 --> : 주석처리방법

<h2>Basic HTML Table</h2> -- 많이 쓰이는 태그
<table style="width:100%">
  <tr> -- row 구성
    <th>Firstname</th> -- clolumn header
    <th>Lastname</th> 
    <th>Age</th>
    <th>Company</th>
  </tr>
  <tr>
    <td>Jill</td> -- 속성값.
    <td>Smith</td>
    <td>50</td>
    <td>삼성</td>
    
th {
  text-align: left; -- 왼쪽 정렬
}

<!-- column merge--!>
 <th colspan="2">Telephone</th> -- 2개의 header를 merge(병합)시킴.
 
<!-- row merge--!>
 <th rowspan="3">Name:</th> -- row를 3개 병합
 
<caption>Monthly savings</caption> - table에 대한 설명을 달아줌.

★★★ Layout -- 중요 ★★★
<header> - Defines a header for a document or a section
<nav> - Defines a container for navigation links
<section> - Defines a section in a document -- 컨텐츠
<article> - Defines an independent self-contained article
<aside> - Defines content aside from the content (like a sidebar)
<footer> - Defines a footer for a document or a section -- 바닥부분 ex. 협력사 링크...
<details> - Defines additional details
<summary> - Defines a heading for the <details> element
-- 대부분의 웹은 이 틀(구조)안에서 움직인다.

Form - 서버와의 통신시 사용.
<input type="text" name="lastname">
<input type="submit" value="제출"> -- value값으로 버튼이 생김.
</form>

 <input type="radio" name="gender" value="male" checked> Male<br> - radio버튼
 
★★★ method Attrubute -- 중요 ★★★
겟 메소드 이용
<form action="/action_page.php" target="_blank" method="GET">
  First name:<br>
  <input type="text" name="firstname" value="Mickey">

Select Method -- 드랍다운 리스트
<form action="/action_page.php">
  <select name="cars" size="2"> 2개까지 미리 보여줘라.
    <option value="volvo">Volvo</option>
    <option value="saab">Saab</option>
    
submiteted from data - ctrl 누르고 동시제출가능
    
Textarea - 입력값 제출

datalist Element - list 연결할수있게 연결 + 뿌려줌.(HTML5 새로 나온것)

Input Type Radio - 유일한 선택값

<form action="/action_page.php">
  Username: <input type="text" name="usrname" required> - 필수값 메소드

</body>
</html>

'Bitcamp > BITCAMP - Servlet & JSP' 카테고리의 다른 글

4일차  (0) 2019.08.05
3일차  (0) 2019.08.02
JSP(Java Server Page)  (0) 2019.08.02
2일차 - 서블릿  (0) 2019.08.01
1일차  (0) 2019.07.31
And

1일차

|

<크롬 웹페이지 개발자 도구 화면>

ACCEPT : Client가 받아들인 content type, 언어

HOST : 요청하는 host 정보

User-Agent :  Clien Program

Content-Length : 본문의 Content 길이

Content-type : 본체의 Content type(여러개 추가가능)

 

package sec01.ex01;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FirstServlet extends HttpServlet{
	
	@Override
	public void init() throws ServletException{
		System.out.println("init 메소드 호출");
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
	throws ServletException, IOException{
		System.out.println("doGet 메소드 호출");
	}
	
	@Override
	public void destroy() {
		System.out.println("destroy 메소드 호출");
	}

}


--------------------------------------------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <servlet>
    <servlet-name>aaa</servlet-name>
    <servlet-class>sec01.ex01.FirstServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>aaa</servlet-name>
    <url-pattern>/first</url-pattern>
  </servlet-mapping>
</web-app>

--------------------------------------------------------------------------

package sec01.ex01;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ThirdServlet
 */
@WebServlet("/third")
public class ThirdServlet extends HttpServlet {
//	private static final long serialVersionUID = 1L;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		System.out.println("ThirdServlet init 메소드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("ThirdServlet destroy 메소드 호출");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("ThirdServlet doGet 메소드 호출");
	}

}

<서블릿 새로 생성시>

1. 라이브러리 새로 등록해야함

: 해당 패키지 우측클릭 -> properties -> build path : library탭 -> add External Jars : servlet-api.jar 파일 -> apply and close

2. 서버도 등록해야함.

 

<결과값 출력화면>

'Bitcamp > BITCAMP - Servlet & JSP' 카테고리의 다른 글

4일차  (0) 2019.08.05
3일차  (0) 2019.08.02
JSP(Java Server Page)  (0) 2019.08.02
2일차 - 서블릿  (0) 2019.08.01
2일차 - HTML  (0) 2019.08.01
And