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"> </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 |