반응형

1.게시판을 만들어보자^^ (로그인 필요 없이 간단한 게시판 형태)

 

<oracle db>

SQL> create table temp20t(
  2  data char(3) null
  3  );

테이블이 생성되었습니다.

SQL> insert into temp20t values('abc');

1 개의 행이 만들어졌습니다.

SQL> insert into temp20t values(null);

1 개의 행이 만들어졌습니다.

Q. NULL 4글자가 입력 가능? null은 빈값을 의미

insert into temp20t values('null'); -> null과 'null'은 구분하자

 

% select * from temp20t where data = null;        NO

    select * from temp20t where data is null;        YES

(null 과의 비교는 is를 이용한다)

 

<문제점>

package main;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class Test110 {
	public static void main(String[] args) throws Exception {
		String data = "xyz";
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection conn = DriverManager.getConnection(
			"jdbc:oracle:thin:@127.0.0.1:1521/XE","HR","HR");
		
		
		//sql 이어 붙일 땐 ''에 주의해야한다
		//data에 null 일 때는 에러 -> 왜? null이라는 문자열이 들어가는 것으로 됨
		//나름 해결책 이지만 null 가능 필드가 2개면 경우의 수가 4개 / 3개면 8개
		//이런 문제 떄문에 현업에서는 PreparedStatement를 더 선호한다.
		//현업에서는 아예 char 는 무조건 4자리 이상을 잡게 하는 경우도 있다.
		String sql =(data != null) ? 
				"insert into temp20t values ('"+data+"')":
				"insert into temp20t values(null)";
		Statement stmt = conn.createStatement();
		
		stmt.executeUpdate(sql);
		
		stmt.close();
		conn.close();
	}

}

<해결책>

package main;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class Test111 {
	public static void main(String[] args) throws Exception {
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection conn = DriverManager.getConnection(
			"jdbc:oracle:thin:@127.0.0.1:1521/XE","HR","HR");
		
		/*Statement 가 어떤 sql 문장이든 실행하는 범용적인데 반해서
		 * preparedStatement 는 생성시에 준비한 그 문장만 실행 할 수 있다
		 * 대신 ?  영역을  setString , setInteger등을 이용하여 채울 수 있다
		 * (순서가 1부터 시작하는 것에 주의)
		 * execute 시에 매개변수 없음에 주의*/
		
		String sql = "insert into temp20t values(?)";
		PreparedStatement stmt = conn.prepareStatement(sql); //sql문장 전용의 바구니
//		stmt.setString(1,"LEE");
		stmt.setString(1, null);//에러 안남 null값이 들어간 행이 생김
		//이걸 쓰면 null 값을 넣을 때 ''를 붙여야 할지를 결정하기 위해 이런저런 고민 할 필요가 없어진다(위의 코드처럼)
		stmt.executeUpdate();
		
		stmt.close();
		conn.close();
	}
}

/*SQL> select * from temp20t;

DATA
------
abc

xyz
xyz
xyz
LEE -> 컴파일 시 들어감*/

AUTOBOXING / UNBOXING

package main;

public class Test112 {
	//매개변수로 String 을 0..*개를 넣어도 에러가 안나는 선언 방식
	public static void test2(Object...args){
		for(int i = 0; i < args.length; i++){
			if(args[i] == null){
				System.out.println("null");
			}else if(args[i] instanceof Integer){
				int r = ((Integer)args[i]).intValue();
				System.out.println("null");
			}else if(args[i] instanceof Double){
				double r = ((Double)args[i]).doubleValue();
				System.out.println(r+0.1);
			}else if(args[i] instanceof String){
				System.out.println((String)args[i]);
			}
		}
		
	}
	
	public static void test(String... args){
		System.out.println(args.length);
	}
	//Object arg_1 = 100; -> 100을 new Integer(100)로 자동변환
	//Object arg_3 = 3.14; => 3.14를 new Double(3.14)로 자동변환
	public static void main(String[] args){
		
		test2(100, "Hello", 3.14, null);
		
		test("apple");
		test();
		test("apple", "banana");
	}
}


/*autoboxing unboxing
 * 
 * Object i = 100;(o)
 * int i = j;(x)
 * 
 * Integer i = 100(o)
 * int j = i;(o)*/

<프레임워크 만들기>

package main;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class Test113 {
	public static int update(String sql, Object... args) throws Exception{
		int rc = 0;

		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection conn = DriverManager.getConnection(
			"jdbc:oracle:thin:@127.0.0.1:1521/XE","HR","HR");
		PreparedStatement stmt = conn.prepareStatement(sql); //sql문장 전용의 바구니
	
		for(int i = 0; i < args.length; i++){
			if(args[i] == null){
				stmt.setObject(i+1, null);
			}else if(args[i] instanceof Integer){
				int r = ((Integer)args[i]).intValue();
				stmt.setInt(i+1, r);
			}else if(args[i] instanceof Double){
				double r = ((Double)args[i]).doubleValue();
				stmt.setDouble(i+1, r);
			}else if(args[i] instanceof String){
				stmt.setString(i+1, (String)args[i]);
			}
		}
		rc = stmt.executeUpdate();
		
		stmt.close();
		conn.close();
		return rc;
	}
	
	public static void main(String[] args) throws Exception{
		String sql = "insert into temp20t values(?,?)";
		update(sql, "KIM",100);
		
	}
}
/*프레임워크 만들기 */

<Anonymous class>

package main;

interface ITemp{
	public void print();//인스턴스 못만듬 , abstract 클래스이기 떄문에 
	//클래스 : 참조형변수 선언/  인스턴스 생성 / 상속해서 인스턴스 선언
}
public class Test114 {
	public static void main(String[] args){
		/*Anonymous class : 이름 없는 클래스
		 * -> 조상은 있음 : ITemp
		 * ITemp를 상속받고 -> 모든 메소드 오버라이딩 해주고 
		 * 이름이 없어서 재사용은 불가능하다
		 * -클래스 선언하고 , 인스턴스 생성하고는 끝
		 * t가 왜 가리킬 수 있는 거지? A t = new B() 자손이 조상에서 오버라이딩한 것을 가져올 수 있기 때문에 */
		
		final int i = 100; //i = 로컬변수다  -> final로 선언해주면 어나니머스 클래스에서 사용할 수 있음 / 객체 지향 개념
		
		ITemp t = new ITemp(){
			public void print(){
				System.out.println("HelloWorld" + i);
			}
		};
		t.print();//자손 인스턴스가 소환
	}
}

JSP 기본 문법

  • JSP 페이지
    • <%-- JSP 주석  --%>
    • <% 스클립틀릿(자바 명령문) %>  -> 웹 서버 쪽 실행
    • <%= 익스프레션 %> -> 자바식 (연산자 포함식, 메서드 호출식) -> 웹 서버 쪽 실행 => 웹 브라우저로 실행
    • ${  익스프레션 랭귀지 } - 빠른 간단한 연산 가능
<HTML>
	<BODY>
    	<% int total = 0;
        	for(int cnt = 0; cnt <= 100; cnt++)
            	total += cnt;
       	%> //스클립틀릿 -> 자바 명령문
        
        <%= total %> //익스프레션 -> 자바식(연산자 포함식, 메서드 호출식)
	</BODY>
</HTML>
  • 서블릿 클래스
    • 서블릿 클래스 골격 선언 -> service 함수 메서드 선언 -> 명령 -> 파일로 텍스트 출력
//서블릿 클래스 골격 선언
public class Servlet extends HttpServlet{
	//service 함수 메서드 선언
	public void service(HttpServletRequest request, HttpServletResponse response) 
    					throws IOException ServletException{
                        
        //명령
		for(int cnt = 1; cnt <= 100; cnt++)
        	total += cnt;
            //파일로 텍스트 출력
            PrintWriter out = response.getWriter();
            out.println("<HTML>");
            out.println("<BODY>");
            out.println("%d",total);
            out.println("</BODY>");
            out.println("</HTML>");
    }
}
 
        

<web.xml> 에 서블릿 등록

<servlet>
	<servlet-name>Servlet-test</servlet-name>
    <servlet-class>servlet</servlet-class>
</servlet> //서블릿 클래스 이름이 들어감

<servlet-mapping>
	<servlet-name>servlet-test</servlet-name>
    <url-pattern>/servlet</url-pattern>
</servlet-mapping> //서블릿 클래스 호출할 때 사용할 URL 들어감
	

 

<쿠키 : 웹 브라우저 쪽에서 데이터 입력, 수정, 삭제, 조회 >

-> 결제 모듈에서 사용 / A, B, C 서블릿이 각자 있고 각자의 유저가 쿠키를 생성하여 따로 저장할 수 있음 (장바구니 , 로그인 정보에 사용)

package study3;

import java.io.IOException;

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


/*http://localhost:8081/study3/state?use=readCookie
 * 요청 -> 응답, 요청의 방법이 두가지 get / post // get : 엽서 / post : 택배
 * 
 * 엽서와 주소의 내용을 구분하는 선의 역할 : ?
 * ? 오른쪽 내용 : key=value 형태로 구성
 *  request.getParameter를 이용하여 추출할 수 있따
 *  거의 대부분이 get방식이고 form 에서 method = "POST"로 지정된 경우만 POST방식*/
public class StateServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String use = request.getParameter("use");
		
		if("addCookie".equals(use)){
			Cookie ck = new Cookie("name", "apple");
			response.addCookie(ck);
		}else if("readCookie".equals(use)){
			Cookie[] cks = request.getCookies();
			if(cks != null){
				for(int i = 0; i < cks.length; i++){
					String l = cks[i].getName() + ","+ cks[i].getValue();
					System.out.println(l);
				}
			}else{
				System.out.println("Cookie is null");
			}
		}
		
		System.out.println(use);
	}
	//addcookie 후 read 쿠키를 하니 
	/*Cookie is null
	readCookie
	getCookie
	
	/*쿠키는 서블렛과 다르게 브라우저에서 생성 -> 서버에서 알 수 있는 방법은 응답이 넘어갈 때(addCookie -> response 멤버 변수)
	*요청할 때 쿠키를 물고온다 / 응답 내보낼때만 서블릿이 조작할 수 있음 
	*/
}

세션사용

      최초 getSession() 호출시에는 고유 넘버가 없이 요청이 들어온다
       * 기억장소 생성 - Map<String, Object> 형태
       * 고유 넘버 생성
       * JSESSIONID 키 값으로 고유 넘버를 쿠키에 저장
       * 
       * 그 이후에 getSession() 호출 : 고유 넘버 물고 왔으니 그걸로 기억장소 찾는다
       * "브라우저 마다 개별적인 기억장소가 생성된다"
package study3;

import java.io.IOException;

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

//session으로 접근 가능하게 만드세요 
// http://localhost:8081/study3/state?use=readCookie

public class SessionServlet extends HttpServlet {

   @Override
   protected void service(HttpServletRequest request, HttpServletResponse response) 
         throws ServletException, IOException {
         
      HttpSession session = request.getSession();
      System.out.println( session.isNew() );
      
      //true
      //JSESSIONID,2C7E8E0D95817C0E56780B2B4644924D
      
      session.setAttribute("apple", "Object!!");
      Object value = session.getAttribute("apple");
      System.out.println(value.toString());
      
      /*false
		Object!!
       	*/
      
      /*최초 getSession() 호출시에는 고유 넘버가 없이 요청이 들어온다
       * 기억장소 생성 - Map<String, Object> 형태
       * 고유 넘버 생성
       * JSESSIONID 키 값으로 고유 넘버를 쿠키에 저장
       * 
       * 그 이후에 getSession() 호출 : 고유 넘버 물고 왔으니 그걸로 기억장소 찾는다
       * 
       * "브라우저 마다 개별적인 기억장소가 생성된다"*/
   }

}

 

<jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
    <%!
    
    int i = 0;
    
    %>
    <%
    
    int j = 0;
    
    %>
http://www.w3.org/TR/html4/loose.dtd">

<%=i++ %>
<%=j++ %>

<%-- jsp 주석 ,html 파일 요청하듯이 요청한다(web.xml 수정할 필요 없다)
i = 멤버 변수 / j = 로컬 변수의 느낌이 난다
jsp 파일을 요청하면 톰캣은 이것을 *.java 파일로 변환한다(서블릿코드)
이것은 컴파일하고 인스턴스를 만들어 적재하고 인스턴스 재활용 한다

서블릿 이후에 asp의 등장으로 위기를 느낀 자바쪽에서 ASP 비슷하게 만든 게 JSP
  http://192.168.2.11:8081/study/Test115.jsp --%>
package study3;

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

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class JSPServlet extends HttpServlet{
	
	private ServletContext application = null;
	//대표적인 함수 getRealPath
	private ServletConfig config = null;

	
	//적재된 서블릿의 시점을 가져오는 것이 init 함수
	

	@Override
	public void init(ServletConfig config) throws ServletException {
		this.config = config;
		application = config.getServletContext();
	}

	/*-------------------------------------------------------------------------------- 
	 *<%! ... %> 은 여기에 온다
	 *    int i = 0;
	 *-------------------------------------------------------------------*/

	@Override
	public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		PrintWriter out = response.getWriter();
		/*--------------------------------------------------
		 * <%....%>은 여기에 온다
		 *     int j = 0;
		 * --------------------------------------------------*/
		/*--------------------------------------------------
		 * <%=... %은 print()로 감싸서 나온다
		 * 	<%=i++ %>
		 * out.println(i++);
			<%=j++ %>
		   out.println(j++);
		   
		   Test115.jsp > 유사한 형태로 변환되고 컴파일되고 인스턴스 만들어지고 적재된 뒤에 실행한다
		 * --------------------------------------------------*/
		out.flush();
		out.close();
	
	}
}

 

어디에 들어있어야 하는지, 왜 되는지 정확하게 알아보기!

 

문제

1. 구구단 배경색 새로고침 시 변경

 

<%@ page contentType="text/html;charset=UTF-8"%><%!
    String getColor(){
        char[] chs = "0123456789abcdef".toCharArray();
        StringBuffer sb = new StringBuffer();

        for(int i=1;i<=6;i++) {
            int index = (int)(Math.random() * 16);
            sb.append(chs[index]);
        }
        return sb.toString();
    }
%>
<html>
<body>
    <table border ="1" bordercolor="black" cellspacing = "0" align="center" cellpadding="7">
    <% for(int i=2;i<=9;i++){ %>
        <tr>
      <% for(int j=1;j<=9;j++){ %>
            <% String color = getColor(); %>
            <td bgColor="#<%=color%>" >
        <%=i%> * <%=j%> = <%=i*j%>
            </td>
      <% } %>
        </tr>
    <% } %>
</body>
</html>

 

2. errortrace.jsp 만들어서 찍어보기

 

<error.jsp>

<%@ page contentType="text/html; charset=utf-8" isErrorPage="true"
	pageEncoding="EUC-KR"%>
<%
	Exception e = (Exception) session.getAttribute("error");
%>
<!DOCTYPE html>
<html>
<body>
	<%
		StackTraceElement[] st = e.getStackTrace();
		for (int i = 0; i < st.length; i++) {
	%>
	<%=st[i]%>
	<%
		}
	%>
</body>
</html>

1. 채팅방을 만들어보자

 

create table talk_room_t(
no number(5),
apple char(4),
banana char(4),
orange char(4)
);
//톡방 만들기
 insert into talk_room_t values(0,'1234','2345','3456');
 
 create table talk_t(
  talk_no number(6),
  room_no number(6),
  content varchar2(123)
 );
 
 create sequence seq_talk;
  //시퀀스 제작
 insert into talk_t values(seq_talk.nextval, 0, 'blabla....');
  //talk_t에 시퀀스 넘버를 받아 값 넣음
 commit;

<talk_login.jsp>

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

</head>
<body>
talk_login.jsp<br/>

<%-- POST : 택배, GET : 엽서
	GET 방식 일 떄는 주소 옆에 붙어서가고 POST 방식일 때는 내부에 숨겨서 간다
	-talk_login2.jsp?roomNo=0&pwd=abcd
	
	강사습관 : html을 생성하지 않은 곳은 2를 붙이더라 --%>
<form method = "POST" action = "talk_login2.jsp">
	<input type= "text" name = "roomNo" size = "4"/>
	<input type= "password" name = "pwd" size = "8"/>
	<input type= "submit"/>
	</form>
</body>
</html>

<talk_login2.jsp>

<%@ page import="study3.Util" pageEncoding="EUC-KR"%>
<%

String ctxPath = request.getContextPath();

//문자열 숫자 변환 시에 에러 발생될 수 있다.
int roomNo = Util.parseInt(request.getParameter("roomNo"));
String pwd = request.getParameter("pwd");

if(roomNo == -1 || pwd == null  || "".equals(pwd)){
	response.sendRedirect("/study3/talk_login.jsp");
	
	//sendRedirect 코드 이후의 코드는 의미 없다
	
	return;
}

Exception err = null;

try{
	if(err == null)
		throw new Exception();
}catch(Exception e){
	err = e;
}

if(err != null)
{
	response.sendRedirect(ctxPath + "/error.jsp");
	return;
}
%>

<%--
talk_login2.jsp
see : study3.Util.class

 --%>

 


<TalkRoomVo.jsp>

package study3;

public class TalkRoomVO {
	public Integer getRoomNo() {
		return roomNo;
	}
	public void setRoomNo(Integer roomNo) {
		this.roomNo = roomNo;
	}
	public String getApple() {
		return apple;
	}
	public void setApple(String apple) {
		this.apple = apple;
	}
	public String getBanana() {
		return banana;
	}
	public void setBanana(String banana) {
		this.banana = banana;
	}
	public String getOrange() {
		return orange;
	}
	public void setOrange(String orange) {
		this.orange = orange;
	}
	private Integer roomNo = null;
	private String apple = null;
	private String banana = null;
	private String orange = null;

}

<talk_login2.jsp>

<%@ page import="study3.Util" pageEncoding="EUC-KR" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="study3.TalkRoomVO" %>
<%
	
	String ctxPath = request.getContextPath();
	
	//문자열 숫자 변환 시에 에러 발생될 수 있다.
	int roomNo = Util.parseInt(request.getParameter("roomNo"));
	String pwd = request.getParameter("pwd");
	
	if(roomNo == -1 || pwd == null  || "".equals(pwd)){
		response.sendRedirect("/study3/talk_login.jsp");
		return;
		//sendRedirect 코드 이후의 코드는 의미 없다
		
	}
	
	Exception err = null;
	TalkRoomVO vo = null;
	
	try{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection conn = DriverManager.getConnection(
				"jdbc:oracle:thin:@127.0.0.1:1521/XE","HR","HR");
			String sql = "select * from talk_room_t where no = ?";
			PreparedStatement stmt = conn.prepareStatement(sql);
			stmt.setInt(1,roomNo);
			ResultSet rs = stmt.executeQuery();
			
			System.out.println(rs);
			System.out.println(conn);
			if(rs.next()){
				vo = new TalkRoomVO();
				vo.setRoomNo(rs.getInt("no"));
				vo.setApple(rs.getString("apple"));
				vo.setBanana(rs.getString("banana"));
				vo.setOrange(rs.getString("orange"));
			}
			rs.close();
			stmt.close();
			conn.close();
			
	}catch(Exception e){
		err = e;
	}
	System.out.println(vo);
	
	if(err != null)
	{
		response.sendRedirect(ctxPath + "/error.jsp");
		return;
	}
	//해당 방이 없는 경우
	if(vo == null){
		response.sendRedirect(ctxPath + "/talk_login.jsp");
	}
	else if(vo.getApple().equals(pwd)){
		Cookie ck = new Cookie("level", "apple");
		response.addCookie(ck);
		
		Cookie ck2 = new Cookie("roomNo", String.valueOf(roomNo));
		response.addCookie(ck2);
		
		response.sendRedirect(ctxPath + "/talk_view_apple.jsp");
	}
	else if(vo.getBanana().equals(pwd)){
		Cookie ck = new Cookie("level", "banana");
		response.addCookie(ck);
		
		Cookie ck2 = new Cookie("roomNo", String.valueOf(roomNo));
		response.addCookie(ck2);
		
		response.sendRedirect(ctxPath + "/talk_view_banana.jsp");
	}
	else if(vo.getOrange().equals(pwd)){
		Cookie ck = new Cookie("level", "Orange");
		response.addCookie(ck);
		
		Cookie ck2 = new Cookie("roomNo", String.valueOf(roomNo));
		response.addCookie(ck2);
		
		response.sendRedirect(ctxPath + "/talk_view_orange.jsp");
		
	}
	else{
		response.sendRedirect(ctxPath + "/talk_login.jsp");
	}
	
%>

<%--
talk_login2.jsp
see : study3.Util.class

 --%>

<talk_view_apple.jsp>

<%@ page contentType="text/html;charset=UTF-8" import="study3.Util, study3.TalkVO, java.util.*, java.sql.*" %>

<% String ctxPath = request.getContextPath();

    Cookie[] cks = request.getCookies();
    if(cks == null){
        response.sendRedirect(ctxPath + "/talk_login.jsp");
        return;
    }
    int roomNo = -1;
    String level = null;

    for(int i=0;i<cks.length;i++){
        if(cks[i].getName().equals("level")){
            level = cks[i].getValue();
        }else if (cks[i].getName().equals("roomNo")){
            roomNo=Util.parseInt(cks[i].getValue());
        }
    }

    if(level == null || !level.equals("apple")){
        response.sendRedirect(ctxPath + "/talk_login.jsp");
        return;
    }
    
    
    List<TalkVO> rl = new ArrayList<TalkVO>();
   	Exception err = null;
   	
   	try{
   		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection conn = DriverManager.getConnection(
			"jdbc:oracle:thin:@127.0.0.1:1521/XE","HR","HR");
   		String sql = "select * from talk_t where room_no = ? order by talk_no desc";
   		PreparedStatement stmt = conn.prepareStatement(sql);
   		stmt.setInt(1, roomNo);
   		ResultSet rs = stmt.executeQuery();
   		
   		while(rs.next()){
   			TalkVO vo = new TalkVO();
   			vo.setTalkNo(rs.getInt("talk_no"));
   			vo.setRoomNo(rs.getInt("room_no"));
   			vo.setContent(rs.getString("content"));
   			rl.add(vo);
   		}
   		
   		rs.close();
   		stmt.close();
   		conn.close();
   		
   	}catch(Exception e){
   		err = e;
   	}
   	
   	if(err != null){
   		response.sendRedirect(ctxPath + "/error.jsp");
   		return;
   	}%>
   
<!DOCTYPE html>
<body>
talk_view_apple.jsp
				<table border ="1" cellspacing = "0" cellpadding="8">
				<%for(TalkVO vo : rl){%><tr>
					<td bgcolor ="hotpink"> <%=vo.getTalkNo()%> </td>
					<td bgcolor = "babypink"> <%=vo.getRoomNo()%> </td>
					<td bgcolor = "skyblue"> <%=vo.getContent()%></td>
				</tr><%}%></table>	
<%= rl %>
</body>
</DOCTYPEhtml><%@ page contentType="text/html;charset=UTF-8" import="study3.Util, study3.TalkVO, java.util.*, java.sql.*" %>

<% String ctxPath = request.getContextPath();

    Cookie[] cks = request.getCookies();
    if(cks == null){
        response.sendRedirect(ctxPath + "/talk_login.jsp");
        return;
    }
    int roomNo = -1;
    String level = null;

    for(int i=0;i<cks.length;i++){
        if(cks[i].getName().equals("level")){
            level = cks[i].getValue();
        }else if (cks[i].getName().equals("roomNo")){
            roomNo=Util.parseInt(cks[i].getValue());
        }
    }

    if(level == null || !level.equals("apple")){
        response.sendRedirect(ctxPath + "/talk_login.jsp");
        return;
    }
    
    
    List<TalkVO> rl = new ArrayList<TalkVO>();
   	Exception err = null;
   	
   	try{
   		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection conn = DriverManager.getConnection(
			"jdbc:oracle:thin:@127.0.0.1:1521/XE","HR","HR");
   		String sql = "select * from talk_t where room_no = ? order by talk_no desc";
   		PreparedStatement stmt = conn.prepareStatement(sql);
   		stmt.setInt(1, roomNo);
   		ResultSet rs = stmt.executeQuery();
   		
   		while(rs.next()){
   			TalkVO vo = new TalkVO();
   			vo.setTalkNo(rs.getInt("talk_no"));
   			vo.setRoomNo(rs.getInt("room_no"));
   			vo.setContent(rs.getString("content"));
   			rl.add(vo);
   		}
   		
   		rs.close();
   		stmt.close();
   		conn.close();
   		
   	}catch(Exception e){
   		err = e;
   	}
   	
   	if(err != null){
   		response.sendRedirect(ctxPath + "/error.jsp");
   		return;
   	}%>
   
<!DOCTYPE html>
<body>
talk_view_apple.jsp
				<table border ="1" cellspacing = "0" cellpadding="8">
				<%for(TalkVO vo : rl){%><tr>
					<td bgcolor ="hotpink"> <%=vo.getTalkNo()%> </td>
					<td bgcolor = "babypink"> <%=vo.getRoomNo()%> </td>
					<td bgcolor = "skyblue"> <%=vo.getContent()%></td>
				</tr><%}%></table>	
<%= rl %>
</body>
</DOCTYPEhtml>

<게시판삭제, 더하기>

<talk_view_apple.jsp>

<%@ page contentType="text/html;charset=UTF-8" import="study3.Util, study3.TalkVO, java.util.*, java.sql.*" %>

<% String ctxPath = request.getContextPath();


	int roomNo = -1;
	String level = null;
	
    Cookie[] cks = request.getCookies();
    if(cks == null){
        response.sendRedirect(ctxPath + "/talk_login.jsp");
        return;
    }

    for(int i=0;i<cks.length;i++){
        if(cks[i].getName().equals("level")){
            level = cks[i].getValue();
        }else if (cks[i].getName().equals("roomNo")){
            roomNo=Util.parseInt(cks[i].getValue());
        }
    }

    if(level == null || !level.equals("apple")){
        response.sendRedirect(ctxPath + "/talk_login.jsp");
        return;
    }
    
    
    List<TalkVO> rl = new ArrayList<TalkVO>();
   	Exception err = null;
   	
   	try{
   		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection conn = DriverManager.getConnection(
			"jdbc:oracle:thin:@127.0.0.1:1521/XE","HR","HR");
   		String sql = "select * from talk_t where room_no = ? order by talk_no desc";
   		PreparedStatement stmt = conn.prepareStatement(sql);
   		stmt.setInt(1, roomNo);
   		ResultSet rs = stmt.executeQuery();
   		
   		while(rs.next()){
   			TalkVO vo = new TalkVO();
   			vo.setTalkNo(rs.getInt("talk_no"));
   			vo.setRoomNo(rs.getInt("room_no"));
   			vo.setContent(rs.getString("content"));
   			rl.add(vo);
   		}
   		
   		rs.close();
   		stmt.close();
   		conn.close();
   		
   	}catch(Exception e){
   		err = e;
   	}
   	
   	if(err != null){
   		response.sendRedirect(ctxPath + "/error.jsp");
   		return;
   	}%>
   
<!DOCTYPE html>
<body>
talk_view_apple.jsp

				<table border ="1" cellspacing = "0" cellpadding="8">
					<tr>
						<td width = "80" align = "center">번호</td>
						<td width = "420" align = "center">내용</td>
						<td width = "420" align = "center">&nbsp;</td>
					</tr>
				<%for(TalkVO vo : rl){%><tr>
					<td bgcolor ="hotpink"> <%=vo.getTalkNo()%> </td>
					<td bgcolor = "skyblue"> <%= vo.getContent() %> </td>
					<td><a href = "talk_del2.jsp?talkNo=<%=vo.getTalkNo()%>">삭제 </a></td>
				</tr><%	
				}%></table>	
		<br/>
		<br/>
				
	<form method = "POST" action = "talk_add2.jsp">
		<textarea rows = "7" cols = "40" name = "content"></textarea>
		<br/><input type = "submit">
	
	</form>
<%= rl %>
</body>
</DOCTYPEhtml>

<talk_del2.jsp>

<%@ page import="study3.Util" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page contentType="text/html;charset=UTF-8"%><%
    String ctxPath = request.getContextPath();
    int talkNo = Util.parseInt(request.getParameter("talkNo"));
    int roomNo = -1;
    String level = null;
    Exception err = null;

    Cookie[] cks = request.getCookies();
    if(cks == null){
        response.sendRedirect(ctxPath + "/talk_login.jsp");
        return;
    }

    for (int i = 0; i < cks.length; i++) {
        if(cks[i].getName().equals("level"))
            level = cks[i].getValue();
        else if(cks[i].getName().equals("roomNo"))
            roomNo = Util.parseInt(cks[i].getValue());
    }

    if(level == null || roomNo == -1 || level.equals("apple")){
        response.sendRedirect(ctxPath + "/talk_login.jsp");
        return;
    }

    try{
        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection conn = DriverManager.getConnection(
				"jdbc:oracle:thin:@127.0.0.1:1521/XE","HR","HR");

        String sql = "delete from talk_t where room_no =? and talk_no = ?";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1, roomNo);
        ps.setInt(2, talkNo);

        ps.executeUpdate();

        ps.close();
        conn.close();

    }catch (Exception e ) { err = e; }

    if(err != null){
    	System.out.println(err);
        response.sendRedirect(ctxPath + "/error.jsp");
        return;
    } else{
        response.sendRedirect(ctxPath + "/talk_view_apple.jsp");
    }
%>
<html>
<body>

</body>
</html>

<talk_add2.jsp>

<%@ page pageEncoding="EUC-KR"%>
<%@ page import= "study3.Util"%>
<%@ page import= "java.sql.*"%>
    
    <%
    request.setCharacterEncoding("UTF-8");
    String ctxPath = request.getContextPath();
	int roomNo = -1;
	String level = null;
	String content = request.getParameter("content");
	
    Cookie[] cks = request.getCookies();
    if(cks == null){
        response.sendRedirect(ctxPath + "/talk_login.jsp");
        return;
    }

    for(int i=0;i<cks.length;i++){
        if(cks[i].getName().equals("level")){
            level = cks[i].getValue();
            
        }else if (cks[i].getName().equals("roomNo")){
            roomNo=Util.parseInt(cks[i].getValue());
        }
    }
    
    if(level == null || roomNo == -1 || level.equals("orange")){
    	response.sendRedirect(ctxPath + "/talk_login.jsp");
    	return;
    }
    
    Exception err = null;
    try {

        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection conn = DriverManager.getConnection(
				"jdbc:oracle:thin:@127.0.0.1:1521/XE","HR","HR");
		String sql = "insert into talk_t values (seq_talk.nextval, ?,?)";
		
		PreparedStatement stmt = conn.prepareStatement(sql);
		stmt.setInt(1,roomNo);
		stmt.setString(2,content);
		
		stmt.executeUpdate();
		
		stmt.close();
        conn.close();

    }
   	catch(Exception e ){
   		err = e;
   		}
    
    if(err != null){
    	response.sendRedirect(ctxPath + "/error.jsp");
    }
    else if(level.equals("apple")){
    	response.sendRedirect(ctxPath + "/talk_view_apple.jsp");
    }
    else if(level.equals("banana")){
    	response.sendRedirect(ctxPath + "/talk_view_banana.jsp");
    }
    System.out.println(level);
    System.out.println(roomNo);
    %>

<Util.java>

package study3;

public class Util {
	public static int parseInt(String l){
		try{
			int r = Integer.parseInt(l);
			return r;
		}catch(Exception e){
			return -1;
		}
	}
	
	
	public static String h( String l ){
		if(l == null || l.equals("")){
			return l;
		}
		
		try{
    		byte[] bs = l.getBytes("8859_1");
    		l = new String(bs, "UTF-8");
    	}catch(Exception e){
    		
    	}
		return l;
	}

}

 

<talk_view_banana.jsp>

<%@ page contentType="text/html;charset=UTF-8" import="study3.Util, study3.TalkVO, java.util.*, java.sql.*" %>

<% String ctxPath = request.getContextPath();


	int roomNo = -1;
	String level = null;
	
    Cookie[] cks = request.getCookies();
    if(cks == null){
        response.sendRedirect(ctxPath + "/talk_login.jsp");
        return;
    }

    for(int i=0;i<cks.length;i++){
        if(cks[i].getName().equals("level")){
            level = cks[i].getValue();
        }else if (cks[i].getName().equals("roomNo")){
            roomNo=Util.parseInt(cks[i].getValue());
        }
    }

    if(level == null || !level.equals("banana")){
        response.sendRedirect(ctxPath + "/talk_login.jsp");
        return;
    }
    
    
    List<TalkVO> rl = new ArrayList<TalkVO>();
   	Exception err = null;
   	
   	try{
   		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection conn = DriverManager.getConnection(
			"jdbc:oracle:thin:@127.0.0.1:1521/XE","HR","HR");
   		String sql = "select * from talk_t where room_no = ? order by talk_no desc";
   		PreparedStatement stmt = conn.prepareStatement(sql);
   		stmt.setInt(1, roomNo);
   		ResultSet rs = stmt.executeQuery();
   		
   		while(rs.next()){
   			TalkVO vo = new TalkVO();
   			vo.setTalkNo(rs.getInt("talk_no"));
   			vo.setRoomNo(rs.getInt("room_no"));
   			vo.setContent(rs.getString("content"));
   			rl.add(vo);
   		}
   		
   		rs.close();
   		stmt.close();
   		conn.close();
   		
   	}catch(Exception e){
   		err = e;
   	}
   	
   	if(err != null){
   		response.sendRedirect(ctxPath + "/error.jsp");
   		return;
   	}%>
   
<!DOCTYPE html>
<body>
talk_view_apple.jsp

				<table border ="1" cellspacing = "0" cellpadding="8">
					<tr>
						<td width = "80" align = "center">번호</td>
						<td width = "420" align = "center">내용</td>
					</tr>
				<%for(TalkVO vo : rl){%><tr>
					<td bgcolor ="hotpink"> <%=vo.getTalkNo()%> </td>
					<td bgcolor = "skyblue"> <%= vo.getContent() %> </td>
				</tr><%	
				}%></table>	
		<br/>
		<br/>
				
	<form method = "POST" action = "talk_add2.jsp">
		<textarea rows = "7" cols = "40" name = "content"></textarea>
		<br/><input type = "submit">
	
	</form>
<%= rl %>
</body>
</DOCTYPEhtml>

<talk_view_orange.jsp>

<%@ page contentType="text/html;charset=UTF-8" import="study3.Util, study3.TalkVO, java.util.*, java.sql.*" %>

<% String ctxPath = request.getContextPath();


	int roomNo = -1;
	String level = null;
	
    Cookie[] cks = request.getCookies();
    if(cks == null){
        response.sendRedirect(ctxPath + "/talk_login.jsp");
        return;
    }

    for(int i=0;i<cks.length;i++){
        if(cks[i].getName().equals("level")){
            level = cks[i].getValue();
        }else if (cks[i].getName().equals("roomNo")){
            roomNo=Util.parseInt(cks[i].getValue());
        }
    }

    if(level == null || !level.equals("orange")){
        response.sendRedirect(ctxPath + "/talk_login.jsp");
        return;
    }
    
    
    List<TalkVO> rl = new ArrayList<TalkVO>();
   	Exception err = null;
   	
   	try{
   		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection conn = DriverManager.getConnection(
			"jdbc:oracle:thin:@127.0.0.1:1521/XE","HR","HR");
   		String sql = "select * from talk_t where room_no = ? order by talk_no desc";
   		PreparedStatement stmt = conn.prepareStatement(sql);
   		stmt.setInt(1, roomNo);
   		ResultSet rs = stmt.executeQuery();
   		
   		while(rs.next()){
   			TalkVO vo = new TalkVO();
   			vo.setTalkNo(rs.getInt("talk_no"));
   			vo.setRoomNo(rs.getInt("room_no"));
   			vo.setContent(rs.getString("content"));
   			rl.add(vo);
   		}
   		
   		rs.close();
   		stmt.close();
   		conn.close();
   		
   	}catch(Exception e){
   		err = e;
   	}
   	
   	if(err != null){
   		response.sendRedirect(ctxPath + "/error.jsp");
   		return;
   	}%>
   
<!DOCTYPE html>
<body>
talk_view_apple.jsp

				<table border ="1" cellspacing = "0" cellpadding="8">
					<tr>
						<td width = "80" align = "center">번호</td>
						<td width = "420" align = "center">내용</td>
					</tr>
				<%for(TalkVO vo : rl){%><tr>
					<td bgcolor ="hotpink"> <%=vo.getTalkNo()%> </td>
					<td bgcolor = "skyblue"> <%= vo.getContent() %> </td>
				</tr><%	
				}%></table>	
		<br/>
		<br/>
<%= rl %>
</body>
</DOCTYPEhtml>

<jsp 문법>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="EUC-KR"
    isELIgnored = "true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

</head>
<body>

	${100 + 100 };
</body>
</html>

//${100 + 100}; 은 서버에서 동작하고 200이라는 결과를 만들어 내어서 응답에 포함시켰따고 봐야한다.

최근 jsp 에서는 간단한 연산을 - ${...} : EL Language 을 이용하여 할 수 있는 기술을 포함

 

-isELIgnored ="true" 가 설정되면 ${100 + 100 }은 EL이 아닌 단순 문자열로 인식한다(무시한다)

 

-실제로 html안은 복잡한 코드보다 단순한 코드가 훨씬 많다 
모든 작업을 EL로 처리가능하면 디자인 속도가 훨씬 빠를 것이다. 

-request.setAttribute 또는 session.setAttribute를 통해서 저장된 값은 키 값을 이용해서 EL에서 사용이 가능하다

정리 : session , request, application 3개 객체는 모두 
void setAttribute(String, Object),
Object getAttribute(String)
void removeAttribute(String) 을 지원한다

 

EL이 반응이 좋아서 확장한 기능인 jstl을 지원하게 되었다

-jstl : 태그를 사용하여 만든 언어

-> SGML 에서 태그를 처음 도입 => 문서를 전산화 할 수 있는 언어를 개발

-> MathML, MusicML, Postscript 등 파생된 서브셋이 엄청 많다 

-> pdf로 발전하여

-> XML, HTML,로 성공하였다

 

태그의 특징

- 최 외곽의 태그는 단 하나만 존재하야 한다

- 태그는 중첩해서 선언하지 않는다

- 속성은 시작태그에 선언한다

- 속성은 KEY = "VALUE" 또는 OR KEY = 'VALUE'

    => 단, ''안에 ''은 못온다

- 하나의 태그에서 속성은 두번 선언하지 않는다

- 시작태그가 있으면 반드시 끝 태그가 있다

 

 


파일업로드 

 

<web.xml>에 서블릿 등록

<servlet> <servlet-name>abcd9</servlet-name> <servlet-class>study3.FileUpServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>abcd9</servlet-name> <url-pattern>/fileup</url-pattern> </servlet-mapping>

 <Test122.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<body>

<!--  input type = "file" : 파일을 서버로 업로드 할 때 사용
이때 반드시 enctype = "multipart/form-data" 을 사용한다 

fileup 에 해당하는 서블릿은 cos.jar 파일의 MultipartRequest 를 이용하여 업로드를 처리하는 것이 일반적
-->
	<form method = "POST" action = "fileup" enctype = "multipart/form-data">
		<input type = "text" name = "title" size = "20">
		<input type = "file" name = "apple">
		<input type = "submit">
	</form>
</body>
</html>

<fileUpServlet.jsp>

package study3;

import java.io.IOException;

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

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

import java.io.InputStream;


public class FileUpServlet extends HttpServlet{
	private ServletContext application = null;
	

	@Override
	public void init(ServletConfig config) throws ServletException {
		application = config.getServletContext();
	}

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			String l = process2(request);
			System.out.println(l);
	}
	
	/*request : 요청 , 브라우저에서 서버로 전달하는 개념
	 * request.getInputStream() 은 브라우저에서 서버로 전달되는 내용을 볼 수 있다
	 * 이 내용을 재구성하는 기능이 cos.jar 파일의 MultipartRequest 이다.
	 * .*/
	
	public String process(HttpServletRequest request) throws IOException{
		byte[] buf = new byte[1024];
		int len = 0;
		
		StringBuffer sb = new StringBuffer();
			
		InputStream in = request.getInputStream();
		
		while((len = in.read(buf)) != -1){
			sb.append(new String(buf, 0, len));
		}
		in.close();
		return sb.toString();

		
	}
	
	
	public String process2(HttpServletRequest request) throws IOException{
		
		//fileup 디렉터리의 실제 저장 위치(절대 경로) 값을 파악한다.
		String path = application.getRealPath("/WEB-INF/fileup");
		System.out.println(path);
		
		//cos.jar에서 제공되는 클래스
		//DefaultFileRenamePolicy :  이름이 겹칠 때 이름 바꿔서 올린다
		//따라서 올릴 때 이름과 서버에 올려진 이름이 다를 수 있따.
		MultipartRequest mpr = new MultipartRequest(
				request, path, 1024*1024*20, "UTF-8",
				new DefaultFileRenamePolicy());
		
		//업로드한 원래 파일이름
		String ofn = mpr.getOriginalFileName("apple");
		
		//중첩될 경우 이름을 바꾸어 저장하는 이름
		String fsn = mpr.getFilesystemName("apple");
		
		System.out.println(ofn +","+ fsn);
		
		//MultipartRequest 쓰면 request.getParameter 못쓴다. 
        // 대신 MultipartRequest 안의 getParameter 써야 한다.
     // 한글 처리도 내부에서 해주더라 !! ( "UTF-8"로 설정해서 
		String title = mpr.getParameter("title");
		System.out.print(title);
		
		System.out.print(path);
		return null;
		

	}
	

}

filedown

<web.xml>

<servlet> <servlet-name>abcd10</servlet-name> <servlet-class>study3.FileDownServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>abcd10</servlet-name> <url-pattern>/filedn</url-pattern> </servlet-mapping>

<Test123.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<body>
<!--  WEB-INF는 브라우저가 접근이 불가능하다 -->
	<a href = "WEB-INF/fileup/user.png">fileDown</a>
	<a href ="filedn?fsn=user.png">fileDown</a>
</body>
</html>

 

<fileDownServlet.jsp>

package study3;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

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

public class FileDownServlet extends HttpServlet {

	   @Override
	   protected void service(HttpServletRequest request, HttpServletResponse response) 
	         throws ServletException, IOException {
	      
	      String fsn = request.getParameter("fsn");
	      String ofn = request.getParameter("ofn");
	      
	      if(ofn == null){
	    	  ofn = fsn;
	      }
	      
	      String path = request.getServletContext().getRealPath("/WEB-INF/fileup");
	      
	      
	      /*전송 이전에 어떤 성경의 정보를 전달할 지를 먼저 브라우저에 통보한다 
	       * application/octet-stream 과 같은 것을 MIME TYPE이라고한다
	       * 
	       * 주의 : 반드시 응답이 내보내기 전에 쓰여져야한다*/
	      response.setContentType("application/octet-stream");
	      response.setHeader("content-disposition", "attachment;filename=" + ofn);
	      
	      //서버에 보관중인 파일을 읽어서 브라우저로 내보내는 전송 프로그램
	      InputStream in= new FileInputStream(path +"\\"+ fsn);
	      OutputStream out = response.getOutputStream();
	      
	      byte[] buf = new byte[1024*4];
	      int len = 0;
	      
	      while((len = in.read(buf)) != -1){
	    	  out.write(buf,0,len);
	    	  out.flush();
	      }
	      
	      out.close();
	      
	      in.close();
	   
	   }

	}
반응형

'Language Study > Java' 카테고리의 다른 글

제주에서 자바_Week3_4  (0) 2019.08.11
##자바 헷갈리는 이론  (0) 2019.08.01
제주에서 자바_Week3_2  (0) 2019.07.30
제주에서 자바_Week3_1  (0) 2019.07.29
제주에서 자바_Week2_3  (0) 2019.07.25

+ Recent posts