반응형

1. index.jsp를 복사하여 그대로 chat.jsp로 만들어 줍니다

2. chat.jsp 안에 있는 채팅관련 코드를 삭제합니다.

3. CHAT DB를 만들어 주겠습니다.

4. 모델을 만들어 주도록 하겠습니다. 우선 chat 패키지를 만들어주고 ChatDTO와 ChatDAO 클래스를 만들어 줍니다.

DTO를 만들어 주었습니다.

package chat;

public class ChatDTO {
	
//	mysql> create table chat(
//		    -> chatID INT PRIMARY KEY AUTO_INCREMENT,
//		    -> fromID VARCHAR(20),
//		    -> toID VARCHAR(20),
//		    -> chatContent VARCHAR(100),
//		    -> chatTime DATETIME);
	
	int chatID;
	String fromID;
	String toID;
	String chatContent;
	String chatTime;
	public int getChatID() {
		return chatID;
	}
	public void setChatID(int chatID) {
		this.chatID = chatID;
	}
	public String getFromID() {
		return fromID;
	}
	public void setFromID(String fromID) {
		this.fromID = fromID;
	}
	public String getToID() {
		return toID;
	}
	public void setToID(String toID) {
		this.toID = toID;
	}
	public String getChatContent() {
		return chatContent;
	}
	public void setChatContent(String chatContent) {
		this.chatContent = chatContent;
	}
	public String getChatTime() {
		return chatTime;
	}
	public void setChatTime(String chatTime) {
		this.chatTime = chatTime;
	}
	
	
}

DAO를 만들어 주었습니다.

package chat;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class ChatDAO {

		DataSource dataSource;
		//DB접근
		public ChatDAO() {
			try {
				InitialContext initContext = new InitialContext();
				Context envContext = (Context) initContext.lookup("java:/comp/env");
				dataSource = (DataSource) envContext.lookup("jdbc/UserChat");
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		//함수 생성
		public ArrayList<ChatDTO> getChatListByID(String fromID, String toID, String chatID){
			ArrayList<ChatDTO> chatList = null;
			Connection conn = null;
			PreparedStatement pstmt = null;
			ResultSet rs = null;
			String SQL = "SELECT * FROM CHAT WHERE ((fromID = ? AND toID =?) OR (toID = ? AND fromID = ?)) AND chatID > ? ORDER BY chatTime";
			
			try {
				//db연결
				conn = dataSource.getConnection();
				pstmt = conn.prepareStatement(SQL);
				pstmt.setString(1,  fromID);
				pstmt.setString(2,  toID);
				pstmt.setString(3,  toID);
				pstmt.setString(4,  fromID);
				pstmt.setInt(5, Integer.parseInt(chatID));
				rs = pstmt.executeQuery();
				chatList = new ArrayList<ChatDTO>();
				while(rs.next()) {
					ChatDTO chat = new ChatDTO();
					chat.setChatID(rs.getInt("chatID"));
					chat.setFromID(rs.getString("fromID").replaceAll(" ", "&nbsp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\n", "<br>"));
					chat.setToID(rs.getString("toID").replaceAll(" ", "&nbsp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\n", "<br>"));
					chat.setChatContent(rs.getString("ChatContent").replaceAll(" ", "&nbsp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\n", "<br>"));
					int chatTime = Integer.parseInt(rs.getString("chatTime").substring(11, 13));
					String timeType = "오전";
					if(chatTime > 12) {
						timeType = "오후";
						chatTime -= 12;
					}
					chat.setChatTime(rs.getString("chatTime").substring(0, 11) + " " + timeType + " " + chatTime + ":" + rs.getString("chatTime").substring(14, 16)+ "");
					chatList.add(chat);
							
				}
			} catch(Exception e) {
				e.printStackTrace();
			} finally {
				try {
					if(rs != null) rs.close();
					if(pstmt != null) pstmt.close();
					if(conn != null) conn.close();
				}catch(Exception e) {
					e.printStackTrace();
				}
			}
			return chatList; //리스트 반환 
			
		}
		
			//대화 내역 중 최근 몇개만 가져옴
				public ArrayList<ChatDTO> getChatListByRecent(String fromID, String toID, int number){
					ArrayList<ChatDTO> chatList = null;
					Connection conn = null;
					PreparedStatement pstmt = null;
					ResultSet rs = null;
					String SQL = "SELECT * FROM CHAT WHERE ((fromID = ? AND toID =?) OR (fromID = ? and toID = ?)) AND chatID > (SELECT MAX(cahtID) - ? FROM CHAT) ORDER BY chatTime";
					
					try {
						//db연결
						conn = dataSource.getConnection();
						pstmt = conn.prepareStatement(SQL);
						pstmt.setString(1,  fromID);
						pstmt.setString(2,  toID);
						pstmt.setString(3,  toID);
						pstmt.setString(4,  fromID);
						pstmt.setInt(5, number);
						rs = pstmt.executeQuery();
						chatList = new ArrayList<ChatDTO>();
						while(rs.next()) {
							ChatDTO chat = new ChatDTO();
							chat.setChatID(rs.getInt("chatID"));
							chat.setFromID(rs.getString("fromID").replaceAll(" ", "&nbsp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\n", "<br>"));
							chat.setToID(rs.getString("toID").replaceAll(" ", "&nbsp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\n", "<br>"));
							chat.setChatContent(rs.getString("ChatContent").replaceAll(" ", "&nbsp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\n", "<br>"));
							int chatTime = Integer.parseInt(rs.getString("chatTime").substring(11, 13));
							String timeType = "오전";
							if(chatTime > 12) {
								timeType = "오후";
								chatTime -= 12;
							}
							chat.setChatTime(rs.getString("chatTime").substring(0, 11) + " " + timeType + " " + chatTime + ":" + rs.getString("chatTime").substring(14, 16)+ "");
							chatList.add(chat);
									
						}
					} catch(Exception e) {
						e.printStackTrace();
					} finally {
						try {
							if(rs != null) rs.close();
							if(pstmt != null) pstmt.close();
							if(conn != null) conn.close();
						}catch(Exception e) {
							e.printStackTrace();
						}
					}
					return chatList; //리스트 반환 
					
				}
				
				// 채팅을 상대방에게 보내는 기능
				// fromID로부터 toID에게 어떠한 chatContent를 보내는지.
				public int submit(String fromID, String toID, String chatContent){
					Connection conn = null;
					PreparedStatement pstmt = null;
					ResultSet rs = null;
					String SQL = "INSERT INTO CHAT VALUES (NULL, ?, ?, ?, NOW())";
					try {
						//db연결
						conn = dataSource.getConnection();
						pstmt = conn.prepareStatement(SQL);
						pstmt.setString(1,  fromID);
						pstmt.setString(2,  toID);
						pstmt.setString(3,  chatContent);
						//성공적으로 채팅을 보냈다면  1개의 데이터에 삽입이 되서 1이라는 값이 반환
						return pstmt.executeUpdate();
					} catch(Exception e) {
						e.printStackTrace();
					} finally {
						try {
							if(rs != null) rs.close();
							if(pstmt != null) pstmt.close();
							if(conn != null) conn.close();
						}catch(Exception e) {
							e.printStackTrace();
						}
					}
					return -1; //데이터베이스 오류
					
				}
		
}
반응형
블로그 이미지

꽃꽂이하는개발자

,
반응형

  JSTL이란 커스텀 태그 중 가장 많이 사용되는 태그를 표준화하여 라이브러리로 제공하는 것을 말합니다. JSTL에서는 여러 가지 태그를 지원하는데, 표로 정리해 보겠습니다.

라이브러리 세부 기능 접두어  관련 URI
코어 변수 지원, 흐름 제어, 반복문 처리, URL처리 c http://java.sun.com/jsp/jstl/core
국제화 지역, 메시지 형식, 숫자 및 날짜 형식 fmt http://java.sun.com/jsp/jstl/fmt
XML XML 코어, 흐름제어, XML변환 sql http://java.sun.com/jsp/jstl/.sql
데이터베이스 SQL sql http://java.sun.com/jsp/jstl/sql
함수 컬렉션 처리, 문자열 처리 fn http://java.sun.com/jsp/jstl/functions

  JSTL은 JSP 2.0 규약부터 추가된 기능이므로 현재는 톰캣에서 기본으로 제공되지 않습니다. 따라서 다음 사이트에서 라이브러리를 다운로드해 설치해야 합니다.

 

  우선 http://tomcat.apache.org/download-taglibs.cgi 에 접속하신 후 4개의 jar 파일을 다운로드 해주세요.

4개의 파일을 다운받으신 후 프로젝트의 lib에 복사해서 붙여 넣겠습니다.

이렇게 해서 JSTL을 사용하는 데 필요한 라이브러리를 설정했으니 이제는 JSP에서 직접 JSTL의 기능을 사용해 보겠습니다.

-다음 글에서..-

반응형

'2020 > JSP SERVLET' 카테고리의 다른 글

<c:set> tag  (0) 2019.12.20
JSTL Core taglib  (0) 2019.12.20
EL SCOPE 우선순위  (0) 2019.12.20
표현 언어(EL)로 바인딩 속성 출력  (0) 2019.12.19
has-a 관계 빈  (0) 2019.12.19
블로그 이미지

꽃꽂이하는개발자

,

JSP EL HashMap

2020/JSP SERVLET 2019. 12. 19. 10:25
반응형

  이번에는 자바 HashMap에 저장된 객체에 접근해 보겠습니다.

  전송된 회원 정보를 첫 번째 빈 m1속성에 설정하고 <useBean> 태그를 이용해 HashMap객체인 membersMap을 생성하고 membersMap에 회원 정보를 key/value로 저장합니다. memberMap에 ArrayList를 저장한 다음 membersMap에 key로 접근하여 value를 출력하겠습니다.

 

member5.jsp
member5.jsp
memberForm.jsp

 

반응형

'2020 > JSP SERVLET' 카테고리의 다른 글

표현 언어(EL)로 바인딩 속성 출력  (0) 2019.12.19
has-a 관계 빈  (0) 2019.12.19
EL Collection 객체 사용  (0) 2019.12.18
EL에서 빈(bean) 사용  (0) 2019.12.18
pageContext 객체  (0) 2019.12.18
블로그 이미지

꽃꽂이하는개발자

,
반응형

  JSP  페이지를 실행하다 보면 종종 실행중에 오류가 발생합니다.

  예를 들어 은행 사이트에서 송금을 하려는데 일반인이 봤을때 ??? 하는 프로그래밍 언어가 브라우저에 출력이 된다면?? 고개들은 당황하게 됩니다.  그러면서 어떠한 문제가 생겼을 거라고 의심하게 되고 사이트에 대한 신뢰도 또한 떨어질 것입니다. 하지만 이러한 예외나 오류를 안내하는 페이지가 뜨게 된다면? 좀 더 신뢰있고 사용자 친화적인 웹 페이지를 만들 수 있겠죠?

 

  JSP 예외 처리 페이지를 만들어 볼까요?

  먼저 예외 처리 JSP를 만든 후 디렉티브 태그 속성 중 isErrorPage 속성을 true로 설정합니다. 그리고 일반 JSP페이지의 디렉티브 태그 속성 중 errorPage 속성을 예외 처리 페이지 이름으로 지정합니다.

 

  우선 합계 구하는 메인 화면을 만들어 보겠습니다.

 

다음으로 예외 발생시 예외를 처리할 jsp페이지를 지정하고 계산할 화면을 만들겠습니다.

add.jsp

 

addException.jsp

이렇게 작성을 해주시고 실행해 보겠습니다.

이렇게 숫자를 입력하면 계산이 됩니다.

하지만 abcd를 입력해 보면

이러한 화면이 나타나게 됩니다.

 

# JSP 실행 시 자주 발생하는 오류들이 있습니다. 이 책의 실습 과정에서도 자주 보았던 404오류는 요청한 JSP페이지가 없을 때 발생하는 오류이고, 500오류는 컨테이너에서 JSP페이지 처리 중에 오류가 발생할 때 표시되는 오류입니다.

 

 

반응형
블로그 이미지

꽃꽂이하는개발자

,
반응형

  구구단의 단수를 전송 받은 후 구구단을 자바 for문과 <table> 태그의 <tr> 태그를 이용해 리스트로 출력하는 예제를 실습해 보겠습니다.

 

gugu.jsp

 

gugu2.jsp

반응형

'2020 > JSP SERVLET' 카테고리의 다른 글

JSP 내장객체  (0) 2019.12.12
JSP 이미지 리스트 출력  (0) 2019.12.12
JSP 학점 변환  (0) 2019.12.11
스크립트 요소 로그인  (0) 2019.12.11
JSP 주석문  (0) 2019.12.11
블로그 이미지

꽃꽂이하는개발자

,

JSP 학점 변환

2020/JSP SERVLET 2019. 12. 11. 20:58
반응형

JSP로 학점 변환 예제를 실습해 보겠습니다.

 

scoreTest.html

 

 

이제 출력을 해 보겠습니다.

 

github : github.com/soulwine-it

 

 

반응형

'2020 > JSP SERVLET' 카테고리의 다른 글

JSP 이미지 리스트 출력  (0) 2019.12.12
JSP 구구단 출력  (0) 2019.12.12
스크립트 요소 로그인  (0) 2019.12.11
JSP 주석문  (0) 2019.12.11
JSP 표현식(expression tag)  (0) 2019.12.11
블로그 이미지

꽃꽂이하는개발자

,
반응형

로그인 상태처럼 사용자와 관련된 정보를 바인딩해서 사용할 때는 세션을 이용하는 것이 편리합니다. 

세션은 사용자당 한 개씩 생성되기 때문입니다.

우선 연습을 하기전에 톰캣이 종료된 후에도 세션이 메모리에서 삭제되지 않는 경우가 있으므로 톰캣 설정파일인 context.xml을 열어 <Manager pathname="" /> 태그의 주석을 해제 합니다.

로그인 창에서 id와 비밀번호를 입력한 후 서블릿으로 전송할 수 있도록 login.html파일을 작성하였습니다.

로그인창에서 로그인한 경우 ID와 비밀번호를 가져오고, 최초 요청 시 세션에 setAttribute() 메서드를 이용해 user_id로 사용자ID를 바인딩하도록 구현합니다. <a>태그를 이용해 재요청하고 세션의 user_id값을 가져와 로그인 여부를 확인합니다.

 

이제 로그인창 요청후 ID와 비밀번호를 입력하고 전송해 보겠습니다.

최초 로그인 시 세션에 ID를 바인딩합니다.

로그인 상태 확인을 클릭해서 /login으로 재요청하면 현재 로그인 상태를 출력합니다.

톰캣 재실행 후 로그인창을 거치지 않고 바로 /login으로 요청하면 세션에 ID가 없으므로 "다시 로그인 하세요!!!" 라는 메시지가 출력됩니다.

 

반응형

'2020 > JSP SERVLET' 카테고리의 다른 글

서블릭 속성과 스코프(Scope)  (0) 2019.12.09
세션 로그인 session login  (0) 2019.12.09
세션 유효 시간 재설정, 세션 삭제  (0) 2019.12.05
서블릿에서 세션생성 API 이용하기  (0) 2019.12.05
세션이란?  (0) 2019.12.05
블로그 이미지

꽃꽂이하는개발자

,
반응형

자바란?

  • 운영체제의 종류에 상관없이 JVM(Java Virtual Machine)위에서 작동하기 때문에 이식성이 높다.
  • 객체지향언어(OOP)이다. 하나의 기능을 객체로 만들어서 이러한 객체들을 결합해서 하나의 프로그램을 만든다.
  • C언어와는 다르게 메모리를 자동으로 관리해준다. 
  • 멀티 스레드를 쉽게 구현이 가능하다.
  • 미리 객체를 만들지 않고, 필요한 시점에 동적으로 로딩해서 객체를 생성할 수 있으며 유지보수가 용이하다.
  • 오픈소스 언어로 자바를 활용한 라이브러리가 굉장히 많다. 시간비용을 줄이고 좋은 어플리케이션을 만들기 편하다.

OOP(객체지향프로그래밍)

  • 코드의 재사용성이 높으며 코드의 변경이 용이하다
  • 직관적인 코드분석이 가능하며 개발속도를 향상시킬 수 있다.
  • 상속을 통한 장점을 극대화 할 수 있습니다.

Overloading vs Overriding

 

  • 오버로딩 - 같은 이름의 메소드를 여러개 정의하며 매개변수의 타입이 다르거나 개수가 달라야 한다. 
  • 오버로딩 - 또한 return type과 접근 제어자는 영향을 주지 않는다.
  • 오버라이딩 - 상속에서 나온 개념으로 상위 클래스(부모클래스)의 메소드를 하위 클래스(자식클래스에서)재정의

Servlet

  • 웹 기반의 요청에 대한 동적인 처리가 가능한 Java Program
  • 순수 자바 코드로만 이루어진 것(Html in JAVA)

JSP(Java Server Page)

  • html기반에 JAVA코드를 블록화하여 삽입한 것(Java in HTML)
  • Servlet을 보완하고 기술을 확장한 스크립트 방식 표준

 

Get과 Post방식

Get

  • 클라이언트에서 서버로 데이터를 전달할 때, 주소 뒤에 "key"와 "value"가 결합된 스트링 형태로 전달
  • 주소창에 쿼리 스트링이 그대로 보여지기 때문에 보안성이 떨어진다
  • Post방식보다 상대적으로 전송속도가 빠르다

Post

  • 일정 크기 이상의 데이터를 보내야 할 때 사용한다
  • 주소창에 전송하는 데이터의 정보가 노출되지 않아 Get방식에 비해 보안성이 높다
  • 속도가 Get방식보다 느리다.
  • 쿼리스트링 데이터 뿐만 아니라, 라디오 버튼, 텍스트 박스 같은 객체들의 값도 전송이 가능하다

Get과 Post의 차이

  • Get은 주로 웹 브라우저가 웹 서버에 데이터를 요청할때 사용
  • Post는 웹 브라우저가 웹 서버에 데이터를 전달하기 위해 사용
  • Get방식은 전달되는 데이터가 255개의 문자를 초과하면 문제를 발생시킬 수 있다
  • 보안성의 문제
반응형

'2020 > 신입 개발자 면접 질문 모음' 카테고리의 다른 글

URI와 URL의 차이  (0) 2019.12.09
신입 개발자 면접질문 #3  (0) 2019.12.06
신입개발자 면접 질문 #2  (0) 2019.12.06
가비지 컬렉션이란?  (0) 2019.12.06
#1 쿠키와 세션의 차이  (0) 2019.12.05
블로그 이미지

꽃꽂이하는개발자

,