2015. 10. 8. 14:00 JAVA

서비스중인 파일을 실시간 값을 바꿔 올려야 할 필요가 있을 때 사용 

사용되는 라이브러리 

commons-net-3.3.jar

여기서 삽질은 ... FTP로 다운로드 받아서 파일로 저장해서 다시 읽어 들여서 파일 수정하고 파일 올렸더니 

인코딩 문제로 ...


그래서 다운받아 원하는 부분 수정하고 저장하는 방법으로 수정하니깐 된다 



import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.text.SimpleDateFormat;

import java.util.Arrays;

import java.util.regex.Matcher;

import java.util.regex.Pattern;


import org.apache.commons.net.ProtocolCommandEvent;

import org.apache.commons.net.ProtocolCommandListener;

import org.apache.commons.net.ftp.FTP;

import org.apache.commons.net.ftp.FTPClient;

import org.apache.commons.net.ftp.FTPConnectionClosedException;

import org.apache.commons.net.ftp.FTPReply;


public class BatChFTPCategoryVersionnew {


final String SERVER_DOWNLOAD_FILE_TEMP = "info_";

final String SERVERINFO_REMOTE = "/was/resin3/webapps/ROOT/info.jsp";


String username = "admin";

String password = "password";


String local;

String remote;

String servers[] = {

"111.222.333.444","111.222.333.444","111.222.333.444" };

String dateChange;


/**

* @param args

*           

*/


public static void main(String[] args) {

// TODO Auto-generated method stub

System.out.println(Arrays.toString(args));


new BatChFTPCategoryVersionnew(args);

}


public BatChFTPCategoryVersionnew(String[] args) {


{

System.out.println("BATCH_SERVERINFO");


remote = SERVERINFO_REMOTE;

dateChange = (String) (new SimpleDateFormat("yyyyMMddHHmmss").format(System.currentTimeMillis()));

try {

if (callFtp(servers[1], false, "UTF-8"))

logicFtp();


} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


System.out.println("dfadsf");

}


public void logicFtp() {


for (int i = 0; i < servers.length; i++) {

if (!callFtp(servers[i], true, "UTF-8"))

break;


}


}


public boolean callFtp(String server, boolean writeFile, String encoding) {


boolean binaryTransfer = false, error = false;

FTPClient ftp;

ftp = new FTPClient();

ftp.setControlEncoding(encoding);

ftp.addProtocolCommandListener(new ProtocolCommandListener() {

@Override

public void protocolReplyReceived(ProtocolCommandEvent arg0) {


printLog("receive : " + arg0.getMessage());

}


@Override

public void protocolCommandSent(ProtocolCommandEvent arg0) {


if (!arg0.getCommand().equals("PASS"))

printLog("send : " + arg0.getCommand() + " => " + arg0.getMessage());

}

});


try {

int reply;

ftp.connect(server);

printLog("Connected to " + server + ".");


// After connection attempt, you should check the reply code to

// verify

// success.

reply = ftp.getReplyCode();


if (!FTPReply.isPositiveCompletion(reply)) {

ftp.disconnect();

printLog("FTP server refused connection.");

return false;// System.exit(1);

}

} catch (IOException e) {

if (ftp.isConnected()) {

try {

ftp.disconnect();


} catch (IOException f) {

// do nothing

}

}

printLog("Could not connect to server.");

e.printStackTrace();

return false;// System.exit(1);

}


__main: try {

if (!ftp.login(username, password)) {

printLog("LOGIN FAIL");

ftp.logout();

ftp.disconnect();

error = true;

break __main;

}

printLog("LOGIN SUCCESS");


ftp.setFileType(FTP.ASCII_FILE_TYPE);


ftp.enterLocalPassiveMode();


String tempPath = System.getProperty("user.dir").replace("\\src", "") + "\\" + SERVER_DOWNLOAD_FILE_TEMP

+ dateChange + ".jsp";

System.out.println(tempPath);

if (writeFile) {


FileInputStream input = new FileInputStream(new File(tempPath));


boolean fcheck = ftp.storeFile(remote, input);

input.close();

System.out.println("remote >>>>>>>>>>>>>>>>>>>>>>>>>\n " + remote);

System.out.println("fcheck >>>>>>>>>>>>>>>>>>>>>>>>>\n " + fcheck);


} else {


String remoteFile = SERVERINFO_REMOTE;


File f = new File(tempPath);

if (f.exists())

f.delete();


InputStream inputStream = ftp.retrieveFileStream(remoteFile);

byte[] bytesArray = new byte[inputStream.available()];

inputStream.read(bytesArray);


{


String str = new String(bytesArray, "UTF-8");

Pattern p = Pattern.compile("\"categoryVersion\".*:.*\"[0-9]{14}\"");

Matcher m = p.matcher(str);

if (m.find()) {

String s = m.group(0);

str = str.replace(s, "\"categoryVersion\"" + ":\"" + dateChange + "\"");

System.out.println("**************************\n" + str);

}

OutputStream outputStream2 = new BufferedOutputStream(new FileOutputStream(f));

outputStream2.write(str.getBytes("UTF-8"));

outputStream2.close();

inputStream.close();

if (str.length() == 0)

error = true;


File fcheck = new File(tempPath);

System.out.println("exists " + fcheck.exists() + " length " + fcheck.length());

if (!fcheck.exists() || fcheck.length() == 0)

error = true;

}


}


ftp.logout();

} catch (Exception e) {

error = true;

printLog("Server closed connection error." + e.toString());


e.printStackTrace();

} finally {

if (ftp.isConnected()) {

try {

ftp.disconnect();

} catch (IOException f) {

// do nothing

}

}

}

if (error)

printLog("Server end connection ERROR ");


printLog("===========================================================");

return !error;

// System.exit(error ? 1 : 0);

} //


public void printLog(String str) {

System.out.println(str);

}

}



컴파일 배치 

d:

cd D:\PROJECT\tempworkspace\BatChFTPCategoryVersionnew 


javac -cp libs\commons-net-3.3.jar src\BatChFTPCategoryVersionnew .java

cd src

java -classpath "D:\PROJECT\tempworkspace\BatChFTPCategoryVersionnew \libs\commons-net-3.3.jar;" BatChFTPCategoryVersionnew


'JAVA' 카테고리의 다른 글

jsp  (0) 2015.04.04
이클립스 워크 스페이스 삭제후 에러 발생  (0) 2014.12.03
서버 확인후 메시지 보내기  (0) 2014.10.20
java 이미지 바이트 조합  (0) 2014.01.09
자바 정렬  (0) 2011.12.01
posted by 욱이다
2015. 4. 4. 19:51 JAVA

jsp

설치
jdk-8u40-windows-x64.exe 설치
apache-tomcat-8.0.21.exe 설치
eclipse jee 설치


세팅
JAVA_HOME
C:\Program Files\Java\jre1.8.0_40
PATH
C:\Program Files\Java\jre1.8.0_40\bin
CATALINA_HOME
D:\Tomcat 8.0

 

확인 
cmd창에서 java입력시 내용 나오면 
tomcat/bin폴더에 startup.bat실행후 
http://localhost:8080  <--- 톰캣 설치시 8080포트 설정했다면 ..
고양이 나오는 페이지 뜨면 완료


맥일경우 관리자 권한으로 실행 해야하기 때문에 

sudo ./startup.bat 으로 실행해야지 

HTTP Status 500 - java.lang.IllegalStateException: No output folder 이 에러가 뜨지 않는다 ㅠㅠ


톰캣과 아파치의 차이

톰캣은 동적인 처리 아파치는 정적인 페이지 처리 
그래서 jsp사용에서는 톰캣을 사용하는게 적절하다 
톰캣은 was와 같다 라고 … 한다


이클립스 서버 세팅 
이클립스 window-> preferences -> server -> runtime enviroment -> add  tomcat 8.0 선택


file -> new -> dynamic web project
Generate web.xml development description 체크 중요

 

 


클래스 패스 지정 하지 않고 컴파일 하기위해 하는 방법
D:\Tomcat 8.0\lib\servlet-api.jar
여기에다가 복사 
C:\Program Files\Java\jdk1.8.0_40\jre\lib\ext


window -> web browser -> internet exploer


하나의 웹어플리케이션 만들기
폴더 생성(구조 반드시 지켜야한다)
D:\Tomcat 8.0\webapps\first\WEB-INF\classes
D:\Tomcat 8.0\webapps\first\WEB-INF\src

 


<!-- 페이지 디렉티브 import , include  
session : 세션의 사용여부 지정 : 기본값은 true
buffer : 버퍼사이즈 지정 : ex)8kb : 응답하기위한 출력 버퍼
autoFlush : 버퍼가 찾을 경우 버퍼에 저장된 내용을 클라이언트 상으로 전송할지 여부 지정 : 기본값은 true
info : jsp페이지를 설명하기 위한 문자를 입력한다 
errorPage : 에러발생시 보여줄 페이지 
isErrorPage :현재 페이지가 에러를 처리하기 위한 페이지 인가? : 기본값은 false
pageEncoding : 현재 작성하는 jsp페이지의 인코딩 방식 지정
isElignored : 표현언어 사용 여부 지정 : 기본값 flase
trimDirectiveWhitespaces : 출력결과에 공백을 제거 : 기본값은 false
EUC-KR 대신에 UTF-8로 쓰자 
charset지정하지 않으면 iso-8859-1로 설정된다 
 -->


함수 선언 방법 
<body>

 <%! <<<<<== 이게중요
  public int add(int a, int b) {
   return a + b;
  }
 %>
 <%=add(10,20)%>
</body>


쿠키와 클라이언트의 차이 
쿠키는 클라이언트 저장 공간 
세션은 서버 저장 공간

 


 

파라메터 값 모두 가져오기 
<br>
<%
Enumeration rr = request.getParameterNames();

while(rr.hasMoreElements())
{
%>
<%=request.getParameter((String)rr.nextElement()) %>
<br>
<%

}

%>

 

헤더 값 찍어보자 
<%
 Enumeration header = request.getHeaderNames();
 
 while(header.hasMoreElements())
 {
  String HeaderName = (String)header.nextElement();
  String HeaderValue = request.getHeader(HeaderName);
 %>
  <%=HeaderName%>   => <%=HeaderValue%>
  <br>
 <%
 }
%>

 

response 쓰는 경우는 조건검색후 다른 페이지로 넘기는 경우에 쓴다 
[잘안쓴단다 포워드 함수 쓴단다 ]
<%
 String name = request.getParameter("name");
 if(name==null)
  response.sendRedirect("06.jsp");
 else if(name.equals("kim"))
  response.sendRedirect("07.jsp");
%>

 


버퍼 옵션 

 <%@ page buffer="1kb" autoFlush="false" %>
<!-- buffer // autoFlush 옵션 테스트  
buffer="none" : 버퍼를 사용하지 않겠따

버퍼의 기본사이즈는  8kb이다 
버서 사용 이유는 데이터 전송속도를 증대시켜줄 목적으로 버퍼기능 사용
버퍼를 사용하지 않을 때 forword 액션테그를 사용할 수없다  
 -->
<%
 for(int i = 0 ; i < 10000; i ++)
  out.append("ddddd");
 out.flush();
%>

 

<!-- 
out 내장 객체
jsp가 생성하는 모든 내용을 out을 이용해 전송할 수 있다 .
boolean isAutoFlush() 출력버퍼가 꽉 찾을 경우 처리 여부를 결정한다 .
int getBufferSize();
int getRemaining(); 사용한 버퍼의 사이즈 출력
 -->
 
 
 <%
 out.println("Dfads");
 out.println(out.getBufferSize());
 out.println(out.isAutoFlush());
 out.println(out.getRemaining());
 %>


활용범위
pagecontext < request < session < application

 



그냥 알고만 있자 그냥 땡겨 써도되는데 굳이 이걸로 할 수있따 보여주는 것 
<!-- 
pageContext 내장객체
1.하나의 jsp 페이지와 일대일 대응
2.pagecontext 객체에 다른 내장개체의 포인터를 리턴하는 함수를 제공 
 getRequest();//request랑 같다 
 getResponse();//response랑 같다
 getOut()//out이랑 같다 
 getSession() - Session 내장객체 리턴
 getServletContext() - application 내장객체 리턴
 getPage()
 getServletConfig() - config
 getException() - exception
 
-->
 <%
  HttpServletRequest req = (HttpServletRequest)pageContext.getRequest();//request랑 같다 
 pageContext.getRequest();
 pageContext.getResponse();
 pageContext.getOut();
 pageContext.getSession() ;//- Session 내장객체 리턴
 pageContext.getServletContext();// - application 내장객체 리턴pageContext.pageContext.
 pageContext.getPage();
 pageContext.getServletConfig();// - config
 pageContext.getException();// - exception
 %>

 

<!-- 
 application 내장 객체
 1.모든 jsp페이지에서 application 내장 객체를 공유한다
 2.웹어플리케이션에 관련된 전반적인 정보를 저장
 -->
 <%
  String info = application.getServerInfo();
  int maj = application.getMajorVersion();
  int mij = application.getMinorVersion();
  String path = application.getRealPath("/");
 %>
 

 

 

초기 파라메터값 가져오기 Cons 같은 느낌

web.xml값 세팅 후 서버 리붓 
<web-app>


 <context-param>
   <description>로그인여부</description>
   <param-name>logYN</param-name>
   <param-value>true</param-value>
  </context-param>
  
    <context-param>
   <description>디버깅</description>
   <param-name>debugCnt</param-name>
   <param-value>1</param-value>
  </context-param>
</web-app>

<title>초기파라메터값 읽어 오기</title>
</head>
<body>
<%
 Enumeration e = application.getInitParameterNames();

 while(e.hasMoreElements())
 {
  String strName = (String)e.nextElement();
  String strValue = application.getInitParameter(strName);
  %>
  <%=strName %>=<%=strValue %><br>
  
  <%
 }
%>

 

로그 남기기

application.log("log message reg");

D:\Tomcat 8.0\logs 경로에서 로그 확인 가능

 


파일 읽기 /ch02/06.jsp에서

<%
 String str ="/ch02/text/aa.txt";
%>


실제 경로 :<%=application.getRealPath(str) %><br>
<%
 BufferedReader br = null;
 char [] buf= new char[512];
 int len = -1 ;
 try{
  br = new BufferedReader(new InputStreamReader(application.getResourceAsStream(str)));
  while((len=br.read(buf))!=-1)
  {
   out.print(new String(buf,0,len));
  }
  br.close();
 }catch(Exception aa)
 {
  
 }finally
 {
  if(br != null)
   try{
  br.close();}catch(Exception e){}
 }

%>

파일읽기 다른 방법 
<%
  String str = "/ch02/text/aa.txt";
  BufferedReader br = null;
  char[] buf = new char[512];
  int len = -1;

  try {
   URL url = application.getResource(str);
   br = new BufferedReader(new InputStreamReader(url.openStream()));
   while ((len = br.read(buf)) != -1) {
    out.print(new String(buf, 0, len));
   }

  } catch (Exception aa) {

  } finally {
   if (br != null)
    try {
     br.close();
    } catch (Exception e) {
    }
  }
 %>









2일차 



<!--jsp의 기본 객체 영역

-age,request,session,application 의 4개의 영역이 있다 

1.page영역

-하나의 jsp페이지와 1대1 대응 된다 

-내장 객체로 pageContext가 있다 (this와 흡사하다 )

-자바의 this와 흡사하다 


2.request 영역

-내장객처로 request가 있다 

-하나의 응답과 일대일 대응 처리 된다 


3.session 영역 

-내장 객체로 session가 있다

-하나의 웹브라우져와 1대1 대응 된다 


4.application영역

-내각 객체로 application이 있다 

-하나의 웹 어플리케이션당 1개의 객체가 생성된다 .



사용범위 

page<request<session<application(서버 종료되어야지 값이 삭제된다 )


함수 

setAttribute() - 내각 객체에 속성값을 설정하는함수 

getAttribute() - 속성 값을 리턴하는 함수 

removeAttribute() - 속성을 삭제 한다 

getAttributeNames() - 속성의 목록을 리턴 (pageContext 내장 객체가 있다 )

-->


<%

String name = request.getParameter("name");

String val = request.getParameter("val");

if(name != null && val != null)

application.setAttribute(name,val);

%>

<%

if(name != null && val != null)

{

%>

application의 속성값 설정 

<%=name %> =<%=val %>

<%

}else {

%>

값 없음 

<%

}

%>



<%

//application값 확인하기 

//이전 소스에서 입력한 application.setAttribute(name,val); 의 값을 다른 페이지에서 확인 할 수있다 

Enumeration attr = application.getAttributeNames();


while(attr.hasMoreElements())

{

String name = (String)attr.nextElement();

%>

<h1><%=name %>=</h1><%=application.getAttribute(name) %><br>

<% 

}

%>



<!-- 

페이지 모듈화 & 흐름 제어 

-액션태그:

1.페이지사이를 전환할때 사용(include,forword)

2.java 애플릿 기능 설정 

3.xml문서 생성기능

4.자바빈 사용 

5.커스텀 태그 생성 

-jsp라는 프리픽스를 붙여야한다 

-대소문자 구분 

<jsp:include>로 시작 

지정한 페이지를 수행 시켜서 수행된 결과를 현재페이지에 포함 시킨다 

<jsp:forword>

지정페이지 를 무시하고 포워드 페이지로 넘어간다

 -->

=====01.jsp내용 ===

 main에서 처리된 내용 <br>

 <jsp:include page="subpage.jsp" flush="false"/>

 <!-- flush :true이면 해당 버퍼상의 내용을 응답하고 분기하겠다 는 것이다 

인클루드 액션태그 만나기 이전의 처리 내용을 클라이언트 상으로 먼저 전송하기 때문에 수정할 수도없고 취소 처리 작업도 할 수 없다  

기본 값은 false-->

subpage.jsp 처리후 <br>


=====subpage.jsp내용===

subpage.jsp 수행내용 <br>


결과====

main에서 처리된 내용 

subpage.jsp 수행내용 

subpage.jsp 처리후 







=====main.jsp======

메인 페이지 <br>

<!--  분기페이지로 전달시 사용된다  -->

<jsp:include page="info.jsp" flush ="false">

<jsp:param value="va1111l" name="AA"/>

<jsp:param value="va2221l" name="BB"/>

</jsp:include>

메인 페이지 수행후 <br>



=====info.jsp=====

<%

String val = request.getParameter("AA");

String val1 = request.getParameter("BB");

%>

<%=val %>

<%=val1 %>




<jsp:include 로 모듈화 시킬수 있따 해더나 푸터 



<jsp:include page="111.jsp"/>와(1) <%@ include file="111.jsp"%>의(2) 차이 

1은 지정한 페이지를 수행 시켜서 수행된 결과를 현재페이지에 포함 시킨다  (html만 복사하는 것 같은데) 

2는 소스 모두를 포함시킨다 

2는 디렉티브라고 말한다


인클루드 디렉티브는 <%@ include file=""%>

1. 컴파일 이전에 코드를 해당 위치에 코드 복사한다 

2. 모든 페이지에서 공유 변수를 사용 한다 

3. 모든 페이지에서 똑같은 문자열 포함시 사용한다 






=====web.xml====


<web-app>

.

.

.

인클루드로 포함 시킬수있찌만 web.xml 옵션 설정으로도 포함 시킬수있다 

  <jsp-config>

  <jsp-property-group>

  <url-pattern>/ch03/view/*</url-pattern>//이폴더에 이런 규칙을 만든다 //해당폴더에 옵션을 설정해준다 

  <include-prelude>/ch03/module/botttop.jsp</include-prelude>//상단에 복사하고자 한다 

  <include-coda>/ch03/module/subtop.jsp</include-coda>//하단에 복사하고자 한다 

  </jsp-property-group>

  </jsp-config>

.

.

</web-app>






=====07.jsp=======


/*

forword 액션테크 

1.클라이언트 요청을 조건에 따라 각각 다른 jsp 페이지로 분기 할때 

2.분기페이지로 넘어갔다 다시 돌아오지 않는다 

3.출력 버퍼를 none으로 지정하면 오류 발생

4.포워드 액션테그 사용하기 이전에 출력버퍼상에 저장된 내용은 클리어된 상태에서 해당페이지로 분기된다 

*/

%>

이페이지는 main페이지에서 처리한 내용 

<jsp:forward page="/ch03/07_1.jsp"/>

처리후 출력 


=====07_1.jsp====

aaaaaaa



출력은 

aaaaaaa  만출력된다 




포워드에 값 전달 하기 request attribute사용한다 

=====07.jsp======

<%

request.setAttribute("aa", "ddewdas");

%>

이페이지는 main페이지에서 처리한 내용 

<jsp:forward page="/ch03/07_1.jsp"/>


=====07_1.jsp=====

<%

String value =(String)request.getAttribute("aa");

%>

<%=value %>

dddddd<br>





form select를 이용한 값 전달 

=====09.jsp===


<form action="<%=request.getContextPath() + "/ch03" %>/09_1.jsp">

전환 페이지를 선택:

<select name="code">

<option value="A">A page</option>

<option value="B">B page</option>

<option value="C">C page</option>

</select>

<input type="submit" value="이동">

</form>

09_1.jsp=== 값 찍어보기 

<%

String code = request.getParameter("code");

%>

dfasd   <%=code %>


=====09_1.jsp====이건 분기 처리로도 해봤따 

<%

String code = request.getParameter("code");

String urlpath = null;

if(code.equals("A"))

{

urlpath ="/ch03/path/a.jsp";

}else if(code.equals("B"))

{

urlpath ="/ch03/path/b.jsp";

}else if(code.equals("C"))

{

urlpath ="/ch03/path/c.jsp";

}

%>

<%=code %>


<jsp:forward page="<%=urlpath %>"></jsp:forward>




exception error 처리 

=====01.jsp=====

<%@ page errorPage="/ch04/error.jsp" %>

<%

/*

예외처리 

1.에러발생시 보여줄 페이지는 page디렉티브의 errorPage속성을 사용하여 지정할 수있다 

2.에러처리 페이지에는 isErrorPage 속성이 true로 설정되어 이어야한다 

3.에러처리 페이지에서만 exception 내장 객체를 사용할 수있다 .

4. 404:해당 페이지가 없을 경우 

500: 프로그램오류 

*/

%>

name 값:<%= request.getParameter("name").toLowerCase() %><<== 여기서 에러 냈다 



=====error.jsp=====

<!-- 현재페이지가 오류를 처리하기 위한 페이지라는 것을 지정하는 것이다  -->

<%@ page isErrorPage="true"%>


에러다

<%=exception.getMessage() %>

<!--  가끔 내용이 부족하면 에러 페이지가 뜨질 않는다 

전체 페이지의 크기가 513바이트 보다 커야한다 

그래서 주석을 쓸때 없이 크게 만들어도 된다 -->






exception error page web.xml에서 설정도 가능 

<error-page>

<error-code>404</error-code>

<location>/ch04/error404.jsp</location>

</error-page>

<error-page>

<error-code>500</error-code>

<location>/ch04/error500.jsp</location>

</error-page>

<error-page>

<exception-type>java.lang.NullPointerException</exception-type>

<location>/ch04/errorNull.jsp</location>

</error-page>

익셉션 타입에 따라서 에러 페이지 이동도 가능하다 


error400.jsp error500.jsp는 <%@ page isErrorPage="true"%> 이거 선언 안하면 exception 클래스를 사용 할 수없다 

이페이지들도 용량이 513 보다 작으면 페이지를 찾을 수 없다고 한다 



우선순위는 페이지에 선언된 <%@ page errorPage="/ch04/error.jsp" %> 로 분기하고

선언되어 있지 않으면 web.xml에 선언된 에러페이지로 분기한다 



에러의

우선순위 

1.page의 에러페이지 속성

2.web.xml의 exception관련 지정 페이지 

3.web.xml의 에러 코드 지정 페이지 




<%

/*

쿠키 

1.서버에서 클라이언트를 구분하기 위한 정보를 클라이언트 컴퓨터에 저장

2.서버를 방문할때 마다 쿠키 정보를 함께 전송한다 

3.정보를 클라이언트 컴퓨터에 저장하다보니 보안성이 떨어진다 

4.클라이언트가 쿠키 사용을 거부하면 사용할 수 없음

5.쿠키크기는 4kb로 제한된다 .

6.저장할 수 있는 쿠키의 갯수는 300개 까지이다.

관련함수 

set - getComment() - 쿠키에 대한 설명을 String타입으로 리턴한다 

set - getDomain() - 쿠키의 정보를 전달 해줄 도메인 서버를 리턴한다 

set - getMaxAge() - 쿠키의 유효 시간을 int타입으로 리턴한다 

set - getName() - 쿠키명 리턴 

set - getPath() - 쿠키의 유효한 디렉토리 경로를 리턴해준다 

set - getVersio() - 쿠키의 버젼을 리턴한다 

set - getValue() - 쿠키의 설정된 값을 리턴한다 

쿠키를 사용은 request, response 내장 객체를 이용한다 


이미 저장되있는 쿠키 값을 가져올때는 request객체를 사용하고 

클라이언트 컴퓨터에 쿠키를 저장 할 때에는 response객체를 이용한다 


*/

/*

쿠키 객체를 정의 

쿠키명 지정 제한 사항

1.쿠키의 이름은 영문자와 숫자의 조합으로 이루어진다.

2.,:공백 등을 포함 할 수 없다 .

3.$사용 불가

4.특수한 문자를 사용하고자 할경우 인코딩 작업을 해야한다 .

*/


Cookie info = new Cookie("test","Hello world");

// 2.쿠키의 속성 설정

info.setMaxAge(365 * 24 * 60 * 60 ); //365일

info.setPath("/"); //현재 웹어플리케이션의 영역에 저장 

// 3.쿠키를 추가 

// response객체에게 클라이언트에 저장할 쿠키 정보를 붙여 준다 

response.addCookie(info); //클라이언트에 각각 브라우저에 관련되 쿠키정보를 저장하는 디렉토리에 저장된다 

%>

쿠키를 저장하는 작업을 합니다.





한글을 쿠키로 저장

<%

Cookie c = new Cookie("name",URLEncoder.encode(" 안녕"));

response.addCookie(c);

%>

<%=c.getName() %>=<%=c.getValue() %>

<%=c.getName() %>=<%=URLDecoder.decode(c.getValue()) %>






쿠키 정보가 있는지 확인한다 

<%

Cookie info[] = request.getCookies();

if (info != null && info.length > 0) {

for(int i = 0 ; i < info.length ; i ++)

{

%>

<%=info[i].getName() %> = <%=URLDecoder.decode(info[i].getValue()) %><br>

<% 

}

}else 

{

%>

쿠키가 없다 

<%

}

%>


쿠키값을 찾아서 변경한다 

<%


Cookie co[]= request.getCookies();

if(co != null && co.length>0)

{

for(int i = 0 ; i < co.length ; i ++)

{

if(co[i].getName().equals("name"))

{

Cookie newCookie = new Cookie("name","5555");

response.addCookie(newCookie);

break;

}

}

}


%>



쿠키 값으 삭제한다 

<%


Cookie co[]= request.getCookies();

if(co != null && co.length>0)

{

for(int i = 0 ; i < co.length ; i ++)

{

if(co[i].getName().equals("name"))

{

Cookie newCookie = new Cookie("name","");

//쿠키를 삭제하기 위해서는 0을 전달하면 된다 

newCookie.setMaxAge(0);

response.addCookie(newCookie);

break;

}

}

}


%>




html5 에서는 session storage라는게 있어서 용량제한이 없단다 



쿠키 확인은 크롬에서 페이지에서 마우스 오른쪽 버튼 요소검사 > resource>cookies>localhost로 확인 가능






/*

session 내장 객체 

1.클라이언트를 구분하기위한 정보를 서버에 저장

2.하나의 web브라우져에 대해서 오직 하나의 session 객체가 대응 된다 

3.세션을 사용하기 위해서 별도로 정의할 객채는 없다 

4.page디렉티브에서 session 속성을 true 설정

<%@ page session=true%>

기본 속성은 true

5.session을 false로 지정하면 session 내장 객체는 사용할 수 없다 

6.

getId()- session을 구분하기 위한 고유의 아이디 값을 리턴한다

getCreationTime()-session이 생성된 시간을 리턴한다 

getLastAccessedTime()-브라우져가 가장마지막에 session에 접근한 시간을 리턴한다  

*/



세션이 웹브라우져를 새로시작 할때 마다 세션 생성 시간이 현재 시간이 되고 

릴로드 하면 세션 마지막 접근 시간이 갱신된다 


<%

Date d = new Date();

SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

%>

세션 ID :

<%=session.getId()%><br>

<%

d.setTime(session.getCreationTime());

%>

세션 생성시간 :<%=sd.format(d) %><br>

<%

d.setTime(session.getLastAccessedTime());

%>

세션 마지막 접근 시간 :<%=sd.format(d) %>





페이지간 session값 전달예제 

=====07.jsp======

<%

session.setAttribute("id", "1234id");

%>

<jsp:forward page="/ch05/07_1.jsp"/>


=====07_1.jsp======

<%=session.getAttribute("id")%>

=======================================








<%

//session을 종료 한다 

session.invalidate();

%>

세션이 종료 되었습니다.<br>


종료하고 다시 세션확인할때 시간이 나오는데 확인해보면 세션 아이디가 다르다 

세션이 종료되고 새로운 세션이 새롭게 생성 된 것이다 





현재 접속자를 알아내는 session 카운터 확인하는 방법 알아보자 

알아 봐야하는데 ....




로그인 

=====09.jsp=======로그인 텍스트 입력창


<form action="<%=request.getContextPath() + "/ch05" %>/09_1.jsp" method="post">

id:<input type="text"  name="id" size="10"/><br>

pass:<input type="password" name="pass" size="10"/><br>

<input type="submit" value="이동"/>

</form>


=====09_1.jsp======로그인 아이디 패스워드 비교

<%

String id = request.getParameter("id");

String pass = request.getParameter("pass");


if(id.equals(pass))

{

session.setAttribute("memid", "99898");

%>

로그인 성공

<% 


}else

{

%>

<%=id %><br>

<%=pass %>

<script type="text/javascript">

alert("back");

history.go(-1);

</script>

<%} %>


=====10.jsp======입력한 세션 확인창 

<%

String mem = (String)session.getAttribute("memid");

boolean login = mem==null?false:true;

%>

<%

if(login)

{

%>

멤버아이디는 <%=mem %>

<%}else{ %>

로그인 되지 않은 상태 

<%} %>




javaBean

java 소스 만들기 프로젝트 선택후 오른쪽 버튼 그냥 JAVA > CLASS생성

자바 컴파일은 이클립스 클린한번 해줘라 



src MemberInfo.java만들었다 

변수는 

private String id ;

//게터 세터 생성 

public String getId()

{
    return id;

}

public void setId(String value)

{
    id = value;

}


request영역까지 살아서 사용할 수있따 (jsptest는 패키지명)

<jsp:useBean id="member" scope="request" class="jsptest.MemberInfo"/>

member.setId("Ddd");

member.getId();


jsp bean으로 값 전달 방법

=====make.jsp=====값 보낸는 페이지

<jsp:useBean id="member" scope="request" class="jsptest.MemberInfo" />

<%

member.setId("3333");

%>

<%=member.getId()%>

<jsp:forward page="/ch06/sendObj.jsp"/>

=====sendObj.jsp============값 받는 페이지

<jsp:useBean id="member" scope="request" class="jsptest.MemberInfo" />

<%

String id = member.getId();

%>

안녕<%=id %>


=====MemberInfo.java========


public class MemberInfo {


private String id;....

public String getId() {

return id;

}

public void setId(String value) {

id = value;

}

}


클레스의 세터 함수 게터 함수 정확히 선언 (다시 확인해 보자 )

=====memberInput.jsp======

<form action="process.jsp" method="post">

<table border="1" cellpadding="0" cellspacing="0">

<tr>

<td>아이디</td>

<td colspan="3"><input type="text" name="id" size="10" /></td>

</tr>

<tr>

<td>이름</td>

<td><input type="text" name="name" size="10"></td>

<td>이메일</td>

<td><input type="text" name="email" size="10"></td>

</tr>

<tr>

<td>주소</td>

<td colspan="3"><input type="text" name="addr" size="30"></td>

</tr>

<tr>


<td colspan="3"><input type="submit" value="확인"></td>

</tr>

</table>

</form>

=====process.jsp======

<%

request.setCharacterEncoding("euc-kr");

%>

<jsp:useBean id="member" class=jsptest.MemberInfo />

<jsp:setProperty property="*" name="member" />

<jsp:setProperty property="pass" name="member"

value="<%=member.getId()%>" />

<table width ="400" border="1" cellpadding="0" cellspacing="0">

<tr>

<td>아이디</td>

<td><jsp:getProperty property="id" name="member"/></td>

</tr>

<tr>

<td>이름</td>

<td><jsp:getProperty property="name" name="member"/></td>

<td>이메일</td>

<td><jsp:getProperty property="email" name="member"/></td>

</tr>

<tr>

<td>주소</td>

<td colspan="3"><jsp:getProperty property="addr" name="member"/></td>

</tr>

</table>










디비 설치할때 다 디폴트로 설치하는데 케릭터셋을 euckr로 세팅해줘야한다 

디비 설치할때 인코딩 설정 옵션 설정하니깐 한글 입력 잘되네 




또 디비 설치 할때 

패스워드 설정 


삭제시 제어판에서 삭제 ,legedit mysql 관련내용 삭제 ,

program폴더에서 모두 삭제 숨김 폴더 까지 다해서 mysq찾아서 삭제 



mysql 설치된 bin폴더에서 실행

mysql -u root -p 

암호 입력 

quit


나와서 

mysqladmin -u root -p create mydb

암호입력1234

다시 mysql -u root -p 

로그인 

show databases;




grant select,insert,update,delete,create,drop

 on mydb.* to 'jspid'@'localhost'

 identified by 'jsppass';


quit


mysql -u jspid -p mydb

암호 입력 jsppass입력


하면 jspid 계정설정 된 놈은 mydb만 쓸 수있게 된다 


show database;하면 이전의 명령에서 제한 된 값이 나온다 





create table member(

memberid varchar(10) not null primary key,

password varchar(10) not null,

name varchar(20) not null,

email varchar(80))

default character set=euckr;






<%@page import="org.apache.jasper.tagplugins.jstl.core.Catch"%>

<%@page import="java.sql.SQLException"%>

<%@page import="java.sql.ResultSet"%>

<%@page import="java.sql.Statement"%>

<%@page import="java.sql.Connection"%>

<%@page import="java.sql.DriverManager"%>

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

.

.

.

member 테이블의 내용 

<table width="100% bolder="1">

<tr>

<td>이름</td><td>아이디</td><td>이메일</td>

</tr>

<%

//1.jdbc 드라이브를 로드 

//오라클 : oracle.jdbc.driver.OracleDriver

//mssql: com.microsoft.sqlserver.jdbc.SQLServerDriver

Class.forName("com.mysql.jdbc.Driver");

Connection con = null ; // DB연결 정보를 저장하는 객체의 위치값 저장

Statement stmt = null ; //SQL문장을  수행 시키기 위한 함수가 포함

ResultSet rs = null; //쿼리 수행 결과를 저장하는 객체 

try{

// 3306은 mssql설치할때 포트 명 

//mydb는 내가 만든 db명 

String jdbcDriver="jdbc:mysql://localhost:3306/mydb?"+

"useUnicode=true&characterEncoding=euckr";

String dbUser = "jspid";

String dbPass = "jsppass";

String query = "select * from member order by memberid";

//2.데이터 베이스 연결

//Connection 객체 리턴  : DB 연결 정보 저장 

con = DriverManager.getConnection(jdbcDriver,dbUser,dbPass);

//3.SQL 문장을 수행 시키기 위한 Statement 객체 생성

/*

stmt.executeQuery() -> select 문자 수행시 쿼리된 결과는 Resultset객체에 저장된다 

stmt.executeUpdate() -> select 이외의 sql 문장 수행시 처리된 레코드의 건수 리턴

*/

stmt = con.createStatement();

// 4. 쿼리 작업 

rs = stmt.executeQuery(query);

//5. 쿼리 결과 출력 

while( rs.next())

{

%>

<tr>

<td><%=rs.getString("name") %></td>

<td><%=rs.getString("memberid") %></td>

<td><%=rs.getString("email") %></td>

</tr>

<% 

}

}catch(SQLException e)

{

out.println(e.getMessage());

e.printStackTrace();

}finally{

//6.db 관련 객체를 해제

if(rs != null)

try{rs.close();}catch(SQLException e){}

if(stmt != null)

try{stmt.close();}catch(SQLException e){}

if(con != null)

try{con.close();}catch(SQLException e){}

}

%>

</table>

.

.

.








디비 업데이트 


===02.jsp===

<body>


<form action="update.jsp" method="post">

<table border ="2">

<tr>

<td>아이디 </td><td><input type="text" name="memberID" size="10"></input></td>

<td>이름</td><td><input type="text" name="name" size="10"></input></td>

</tr>

<tr>

<td colspan="4"><input type="submit" value="변경"/><td>

</tr>

</table>


</form>

</body>


===update.jsp====

<body>

<%

request.setCharacterEncoding("euc-kr");

String memberID = request.getParameter("memberID");

String name = request.getParameter("name");

Class.forName("com.mysql.jdbc.Driver");

Connection con = null ;

Statement stmt = null ;

int cnt = 0;

try{

String jdbcDriver="jdbc:mysql://localhost:3306/mydb?"+

"useUnicode=true&characterEncoding=euckr";

String dbUser = "jspid";

String dbPass = "jsppass";

String query = "update member set name='"+name+"' where memberID ='"+memberID+"';";

con = DriverManager.getConnection(jdbcDriver,dbUser,dbPass);

stmt = con.createStatement();

cnt = stmt.executeUpdate(query);

}catch(SQLException e)

{

out.println(e.getMessage());

e.printStackTrace();

}finally{

if(stmt != null)

try{stmt.close();}catch(SQLException e){}

if(con != null)

try{con.close();}catch(SQLException e){}

}

%>

이름변경


<% if(cnt>0) {%>

<%=memberID %>의 이름을 <%= name %>으로 변경

<%}else  {%>

<%=memberID %>의 이름은 존재하지 않는다 

<%} %>

</body>








[[[[[[[[[[LONG VARCHAR 읽어 들이는 방법 ]]]]]]]]]]]]]



db table 만들기 

long varchar 에서 글자 길게 들어가는 예제

create table member2(

memberid varchar(12) not null primary key,

memo long varchar)default character set=euckr;



<body>

<%

/*

ResultSet 객체함수

next()->커서를 다음 레코드로 이동

previous()->커서를 앞의 레코드로 이동 

first()-> 첫번째 레코드로 커서 이동

last() -> 마지막 레코드로 커서 이동 

isFirst()->첫번째 레코드인가를 체크 

isLast()->마지막 레코드인가를 체크 

getRow()->현재커서가 존재하는 레코드의 ??값 리턴 

beforeFirst()->처음 레코드 이전으로 커서 이동

afterLast()-> 마지막 레코드 다음으로 커서 이동 

*/

String memberId = "dad13";//request.getParameter("id");

%>

<%

Class.forName("com.mysql.jdbc.Driver");

Connection con = null ;

Statement stmt = null ;

ResultSet rs = null;

int cnt = 0;


try{

String jdbcDriver="jdbc:mysql://localhost:3306/mydb?"+

"useUnicode=true&characterEncoding=euckr";

String dbUser = "jspid";

String dbPass = "jsppass";

String query = "select * from member2 where memberid='"+memberId+"'";

con = DriverManager.getConnection(jdbcDriver,dbUser,dbPass);

stmt = con.createStatement();

rs = stmt.executeQuery(query);

if(rs.next())

{

%>

<table border="2">

<tr>

<td>아이디</td><td><%=memberId %></td>

</tr>

<tr>

<td>메모</td>

<td>

<%

String memo = null;

Reader reader = null;

try{

//memo 필드이 자료를 읽기 , long varchar 타입의 필드를 입력 스트링으로 연다

reader = rs.getCharacterStream("memo");

if(reader != null)

{

StringBuffer buff = new StringBuffer();

char[] ch = new char[512];

int len = -1;

while((len = reader.read(ch))!=-1)

{

buff.append(ch,0,len);

}

memo = buff.toString();

}

}catch(IOException e){

}finally

{

if(reader !=null)

try{reader.close();}catch(IOException e){}

}

%>

<%=memo %>

</td>

</tr>

</table>

<%

}

}catch(SQLException e)

{

out.println(e.getMessage());

e.printStackTrace();

}finally{

if(rs != null)

try{rs.close();}catch(SQLException e){}

if(stmt != null)

try{stmt.close();}catch(SQLException e){}

if(con != null)

try{con.close();}catch(SQLException e){}

}


%>

</body>











<body>

<%

/*

PreparedStetement 클래스 이용시 장점

1.코드 구성시 편리함 

2.sql 분석 시간을 줄일 수 있다 

*/

%>

<form action="update1.jsp" method="post">

<table border="1">

<tr>

<td>아이디</td>

<td><input type="text" name="memberid" size = "10"/></td>

<td>암호</td>

<td><input type="password" name="password" size = "10"/></td>

</tr>

<tr>

<td>이름</td>

<td><input type="text" name="name" size = "10"/></td>

<td>이메일</td>

<td><input type="text" name="email" size = "80"/></td>

</tr>

<tr>

<td colspan="4"><input type="submit" value="삽입"/></td>

</tr>

</table>

</form>

</body>


<body>

<%

request.setCharacterEncoding("euc-kr");


String memberid = request.getParameter("memberid");

String password = request.getParameter("password");

String name = request.getParameter("name");

String email = request.getParameter("email");


Class.forName("com.mysql.jdbc.Driver");

Connection con = null ;

PreparedStatement stmt = null ;


int cnt = 0;


try{

String jdbcDriver="jdbc:mysql://localhost:3306/mydb?"+

"useUnicode=true&characterEncoding=euckr";

String dbUser = "jspid";

String dbPass = "jsppass";

con = DriverManager.getConnection(jdbcDriver,dbUser,dbPass);

stmt = con.prepareStatement("insert into member value(?,?,?,?)");

stmt.setString(1, memberid);//인덱스는 0이아니라 1부터 카운트 한다 

stmt.setString(2,password);

stmt.setString(3,name);

stmt.setString(4,email);

cnt = stmt.executeUpdate();

}catch(SQLException e)

{

out.println(e.getMessage());

e.printStackTrace();

}finally{

if(stmt != null)

try{stmt.close();}catch(SQLException e){}

if(con != null)

try{con.close();}catch(SQLException e){}

}

%>

Member 테이블에 레코드 삽입 

<%=cnt %>


</body>













//////// 최초 한번만 jdbc로딩 하는 방법 /////



/*

웹 어플리케이션 구동시 jdbc 드라이브 로딩 

-웹어플리케이션 최초 실행시 한번만 로딩 시켜주고 다른 jsp페이지 구동할때 드라이브 로딩을 하지 않는 방법이다 

-mysql-connector-java-5.1.21-bin.jar 를 lib폴더에 위치  (톰캣의 웹앱 lib폴더에 넣어둔다 )

-web.xml 편집 

아래의 내용 추가 

<servlet>

<servlet-name>JDBCDriverLoader</servlet-name>

<servlet-class>conn.Loader</servlet-class> //소스 패키지 conn생성후 Loader클래스 파일 생성 

<init-param>

<param-name>jdbcdriver</param-name>

<param-value>com.mysql.jdbc.Driver</param-value>

</init-param>

<load-on-startup>1</load-on-startup>//최초 한번만 로딩 된다 선언 

</servlet>

*/


conn.Loader.java


package conn;


import java.util.StringTokenizer;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;


public class Loader extends HttpServlet {


public void init(ServletConfig config) throws ServletException {

try {

/*

* web.xml

* <servlet-class>conn.Loader</servlet-class>

* <init-param>

<param-name>jdbcdriver</param-name>//여기서 선언한것을 getInitParameter에서 동일하게 선언

<param-value>com.mysql.jdbc.Driver</param-value>

//여러게 추가가능 

<param-value>com.mysql.jdbc.Driver,오라클,mssql</param-value>

</init-param>

*/

String drivers = config.getInitParameter("jdbcdriver");

StringTokenizer st = new StringTokenizer(drivers,",");

while(st.hasMoreElements())

{

String jdbcDriver = st.nextToken();

Class.forName(jdbcDriver);

}

} catch (Exception e) {

throw new ServletException(e);

}

System.out.println("이클립스에서 서버 재구동되면서 이 로그가 콘솔에 찍힌다. 계속 찍히면 문제 있는것");

}


}


이건 결국 Class.forName("com.mysql.jdbc.Driver"); 이걸 안할려고 하는 작업 


////////////////////////////////////////////////////////////////////////////////////////////





Connection pool 사용 하자 


pool.jocl



commons-dbcp-1.4.jar


commons-pool-1.5.7.jar


/*

Connection pooling 기법 

-컨넥션 풀에 미리 필요한 만큼 Connection 객체를 미리 만듬

-Connection 객체가 필요할때 마다 컨넥션 풀에서 빌려 쓴다 

-전부 사용한 컨넥션 객체는 컨넥션 풀로 반남하는 형태이다 

-이렇게 함으로써 Connection객체를 매 페이지마다 생성 시켜주는 시간을 절약 할 수 있다 .

-여러사용자가 동시에 접속할 경우 서버가 다운되는 것을 막기위한 방법도 된다 .

http://commons.apache.org/proper/commons-dbcp/index.html에서 다운로드 

commons-dbcp-1.4.jar commons-pool-1.5.7.jar파일 lib폴더에 추가 

*/




pool.jocl파일생성 아래는 내용이다  이걸 이클립스 src폴더에 넣어둔다 

<object class="org.apache.commons.dbcp.PoolableConnectionFactory" 

xmlns="http://apache.org/xml/xmlns/jakarta/commons/jocl">


<object class="org.apache.commons.dbcp.DriverManagerConnectionFactory">

<string value="jdbc:mysql://localhost:3306/mydb?useUnicode=true&amp;characterEncoding=euckr"/>//mydb는 생성된 디비명 

<string value="jspid"/>//설정한 아이디 

<string value="jsppass"/>//설정한 비번 

</object>

<object class="org.apache.commons.pool.impl.GenericObjectPool">

<object class="org.apache.commons.pool.PoolableObjectFactory" null="true" />

</object>

<object class="org.apache.commons.pool.KeyedObjectPoolFactory" null="true"/>


///이 하단에 설정 되는것은 jocl파일 설정 방법으로 찾아보자 

// <int value="5"/>  << 이렇게 하면 초기 설정 5개만 설정하는 것이다 


<string null="true"/>

<boolean value="false"/>

<boolean value="true"/>

</object>


Loader.java 파일 내용 추가 

package conn;


import java.util.StringTokenizer;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;


public class Loader extends HttpServlet {


public void init(ServletConfig config) throws ServletException {

try {

/*

* web.xml

* <servlet-class>conn.Loader</servlet-class>

* <init-param>

<param-name>jdbcdriver</param-name>//여기서 선언한것을 getInitParameter에서 동일하게 선언

<param-value>com.mysql.jdbc.Driver</param-value>

//여러게 추가가능 

<param-value>com.mysql.jdbc.Driver,오라클,mssql</param-value>

</init-param>

*/

String drivers = config.getInitParameter("jdbcdriver");

StringTokenizer st = new StringTokenizer(drivers,",");

while(st.hasMoreElements())

{

String jdbcDriver = st.nextToken();

Class.forName(jdbcDriver);

}

//컨넥션 풀링 사용하기 위한 드라이드 로딩 

Class.forName("org.apache.commons.dbcp.PoolingDriver");//<<<추가 내용 

} catch (Exception e) {

throw new ServletException(e);

}

System.out.println("이클립스에서 서버 재구동되면서 이 로그가 콘솔에 찍힌다. 계속 찍히면 문제 있는것");

}


}



컨넥션 풀 사용 예제 



--member테이블의 내용


<table width="100%" bolder="1">

<tr>

<td>이름</td>

<td>아이디</td>

<td>이메일</td>

</tr>

<%

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

try {

String jdbcDriver = "jdbc:apache:commons:dbcp:/pool";//pool.jocl파일명이 들어간 것임 

String query = "select * from member order by memberid";

conn = DriverManager.getConnection(jdbcDriver);

stmt = conn.createStatement();

rs = stmt.executeQuery(query);

while (rs.next()) {

%>

<tr>

<td><%=rs.getString("name")%></td>

<td><%=rs.getString("memberid")%></td>

<td><%=rs.getString("email")%></td>

</tr>

<%

}

} catch (Exception e) {

out.println(e.getMessage());

e.printStackTrace();


} finally {

if (rs != null)

try {

rs.close();

} catch (SQLException e) {

}

if (stmt != null)

try {

stmt.close();

} catch (SQLException e) {

}

if (conn != null)

try {

conn.close();

} catch (SQLException e) {

}

}

%>

</table>




<body>


/////////////////////////////////////////////////////////////



<%

/*

표현언어 (EL)

장점

1.jsp의 4가지 기본 객체가 제공하는 영역을 사욯 할 수 있따 (page,request,session,application)

2.집합 객체에 대한 접근 방법을 제공해 준다 .

3.수치관계 논리 연산기능을 제공해 준다 

4.자바클레스의 메소드를 호출하는 기능을 제공해 준다 

5.표현언어의 기본 객체 제공

6.앞에서 보았떤 표현식을 사용하는 것보다 간편하게 사용할 수 있따 

형식

${표현언어}

${10} == <%=10> 이것과 동일

${10+20} 

기본객체 

pageContext : jsp에 page기본객체와 동일

pageScope : pagecontext에 저장된 속성과 값을 맵객체로 맵핑시켜준다 

requestScope : jsp의 request와 동일 

sessionScope : jsp의 session객체와 동일 

applicationScope : ""

param : request.getParameter와 동일 

paramValues : request.getParameterValues()와 동일

header : request.getHeaders()동일

headerValues : request.getHeaders()

Cookie : request.getCookies()

initParam : application.getInitParameter()

*/

request.setAttribute("name", "kim");

%>

요청 uri = ${pageContext.request.requestURI} </br>

request 의 name 속성 : ${requestScope.name} </br><!--  request.getAttribute("name") -->

name 파라메터의 값 : ${param.name} </br> <!-- request.getPrameter(name) -->


${10+20 }

</body>










<body>

<%

/*

boolean : tru ,false

Integer : 0 ~ 9

float : 소숫점을 포함하는 수치 값 

String : '',""

Null : 

산술연산자 

/(div)

%(mod)

비교연산자 

==(eq)

!=(ne)

<(lt)

>(gt)

<=(le)

>=(ge)

논리연산자 

&& (and)

||(or)

!(not)


*/


request.setAttribute("name", "kim");

String str = "123";

%>

${10==20}<br>

${10 - 3 }<br>

${10/3 }<br>

${'hello' }<br>

${ "world"}<br>

null=> ${null }<br>

scope=> ${pageScope.name }<br><!--  아무 것도 안나온다 kim은 request에 들어있기 때문이다  -->

name=> ${name }<br><!-- page,request,session,application 순으로 검색해서 값이 kim으로 나오낟  -->

${"10"+10 }<br>

${null + 10 }<br><!-- 널은 0으로 취급하고 처리한다  -->

${20 >= 10 }<br>

${20 ge 10 }<br>

${str =="123" }<br>



</body>

false

 7

 3.3333333333333335

 hello

 world

 null=> 

 scope=> 

 name=> kim

 20

 10

 true

 true

 false







TimeTest.java

package el;


import java.util.Date;

public class TimeTest {

Date d = new Date();

public Date getDate()

{

return d;

}

}

04.jsp

<%@ page import ="el.*" %>


<body>

<%


TimeTest time = new TimeTest();

request.setAttribute("t", time);

%>

${t.getDate() }

</body>













$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

이거는 다음주에 다시 해준다 

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


el-functions.tld


============


WEB-inf/tlds 폴더추가 

======폴더에 el-functions.tld파일 추가 =======

파일 내용 

<?xml version="1.0" encoding="euc-kr" ?>


<taglib xmlns="http://java.sun.com/xml/ns/javaee" 

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

        http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"

    version="2.1">


    <description>EL에서 함수실행</description>

    <tlib-version>1.0</tlib-version>

    <short-name>ELfunctions</short-name>


    <function>

        <description>Date 객체 포맷팅</description>

        <name>dateFormat</name>

        <function-class>el.DateChul</function-class>

        <function-signature>

            java.lang.String format(java.util.Date)

        </function-signature>

    </function>


</taglib>


=======DateChul.java==============

package el;


import java.text.SimpleDateFormat;

import java.util.Date;


public class DateChul {

private static SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");

public static String format(Date date)

{

return format1.format(date);

}

}




======web.xml 에다가 추가 ======


<jsp-config>

<taglib>

<taglib-uri>

/WEB-INF/tlds/el-functions.tld

</taglib-uri>

<taglib-location>

/WEB-INF/tlds/el-functions.tld

</taglib-location>

</taglib>

<jsp-property-group>

<url-pattern>

/ch08/*

</url-pattern>

<el-ignored>true</el-ignored>

</jsp-property-group>

</jsp-config>


======04_1.jsp========


<%@ page session="false" %>


<%@ taglib prefix="elfmt" uri="/WEB-INF/tlds/el-functions.tld"%>

<%

java.util.Date todate = new java.util.Date();

request.setAttribute("today", todate);

%>

${}


$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$







/*

JSTL() JSP STANDARD TAG 라이브러리 

코어 : 변수 지원 ,흐름 지원 ,URL 처리 : 접두어는 c : http://java.sun.com/jsp/jstl/core

XML: XML 변환                             :    x : http://java.sun.com/jsp/jstl/xml

국제화 : 지역에 맞는 날짜와 시간형식으로 만들어 준다 : fmt:http://java.sun.com/jsp/jstl/fmt

DB관련: SQL :SQL :http://java.sun.com/jsp/jstl/sql

함수 :컬렉션 처리 스트링 처리 : fn :http://java.sun.com/jsp/jstl/functions

http://search.maven.org/#browse%7c-658715035

jstl-1.2.jsr 다운로드 받아 lib 폴더에 넣어라 

jstl-1.2.jar


코어 라이브러리 

변수지원 : set(변수정의시 ) , remove(정의된 변수 삭제시)

흐름제어 : if,choose,forEach, forTokenes

URL제어 : import , redirect, url

기타 :catch ,out

*/






//////////////게시판 만들어 보자 




cannot connect to mysql server on localhost (10061)

이런 에러가 난다 

http://blog.naver.com/munjh4200/50176975094

여기서 해결 햇따 

mysqld --skip-grant 하고 다시 시작 

이렇게 하니 접속은 하는데 grant명령어가 안먹네 ;;;

그래서 아래의 guest는 그냥 계정으로 만들었따 



mysql -u root -p

create database guestbook default character set euckr;

grant select ,insert , update , create, drop ,delete

on guestbook.* to 'jspid'@'localhost' identified by 'jsppass';


quit



mysql - u jspid -p guestbook 

jsppass


create table guest(

message_id int not null auto_increment primary key,

guest_name varchar(50) not null,

password varchar(10) not null,

message text not null)default character set=euckr;



web.xml 


<servlet>

<servlet-name>MessageDaoProviderInit</servlet-name>

<servlet-class>myjsp.guest.dao.MessageDaoProviderInit</servlet-class>

<init-param>

<param-name>dbms</param-name>

<param-value>mysql</param-value>

</init-param>

컨넥션 갯수는 사람이 많이 접속하면 숫자 늘리는데 선언안하면 계속 만들어질 수있어 메모리 누수 발생이 가능할 수있다 

<load-on-startup>1</load-on-startup>

</servlet>





web.xml


<servlet>

<servlet-name>DBCPInit</servlet-name>

<servlet-class>myjsp.jdbc.DBCPInit</servlet-class>  

<init-param>

<param-name>jdbcdriver</param-name>

<param-value>com.mysql.jdbc.Driver</param-value>

</init-param>

<load-on-startup>1</load-on-startup> ///이건 라이브러리라 한번만 로딩되면된다 

///jocl은 동시 접속 자가 많으면 숫자가 커져야한다 

</servlet>



MessageDao.java



package myjsp.guest.dao;


import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.List;


import myjsp.jdbc.jdbcUtil;

import mysql.guest.model.Message;





public abstract class MessageDao {

//상속되는 하위 클레스에서 반드시 제정의 시켜서 사용하라는  강제 조항을 달아주기 위한 목적으로 추상적인 메소드로 구성 

//추상적인 메소드를 포함 하는 클레스는 추상적인 클레가 되어야하기 때문에 class앞에 abstract를 붙인다 

public abstract int insert(Connection conn,Message message) throws SQLException;

//MessageId에 해당하는 한사람분의 자료를 message객체에 저장하여 리턴 

public Message select (Connection conn , int messageId) throws SQLException

{

PreparedStatement pstmt = null;

ResultSet rs = null;

try{

pstmt = conn.prepareStatement("select * from guest where Message_id=?");

pstmt.setInt(1, messageId);

rs= pstmt.executeQuery();

if(rs.next())

{

return makeMessageFromResultSet(rs);

}else 

return null;

}catch(Exception d)

{

}finally{

jdbcUtil.close(rs);

jdbcUtil.close(pstmt);

}

return null;

}

//ResultSEt 객체의 내용을 Message객체로 저장해서 리턴한다 

protected Message makeMessageFromResultSet(ResultSet rs) throws SQLException

{

Message message = new Message();

message.setId(rs.getInt("message_id"));

message.setGuestName(rs.getString("guest_name"));

message.setPassword(rs.getString("password"));

message.setMessage(rs.getString("message"));

return message;

}

//전체 레코드의 건수를 리턴하는 함수 

public int selectCount(Connection conn )throws SQLException

{

Statement stmt = null;

ResultSet rs = null;

try{

stmt = conn.createStatement();

rs = stmt.executeQuery("select count(*) from guest");

rs.next();

return rs.getInt(1);

}catch(Exception e)

{

}

finally

{

jdbcUtil.close(rs);

jdbcUtil.close(stmt);

}

return 0;

}

//message객체를 List객체에 저장 리턴하는 함수 

public abstract List<Message> selectList(Connection conn,int firstRow, int endRow) throws SQLException;

public int delete(Connection conn , int messageid) throws SQLException

{

PreparedStatement pstmt = null;

ResultSet rs = null;

try{

pstmt = conn.prepareStatement("delete from guest where message_id=?");

pstmt.setInt(1, messageid);

return pstmt.executeUpdate();

}catch(Exception e)

{

}

finally

{

jdbcUtil.close(rs);

jdbcUtil.close(pstmt);

}

return -1;

}

}


MessageDaoProvider.java


package myjsp.guest.dao;


import myjsp.guest.dao.mysql.MySQLMessageDao;



public class MessageDaoProvider {

private static MessageDaoProvider instance = new MessageDaoProvider();

//생성자,, 클래스 밖에서 new 연산자를 이용하여 객체를 정의하는 것을 막기 위함 

private MessageDaoProvider()

{

}

public static MessageDaoProvider getInstance()

{

return instance;

}

private MySQLMessageDao mysqlDao = new MySQLMessageDao();

private String dbms;

public void setDbms(String dbms)

{

this.dbms = dbms;

}

public MessageDao getMessageDao()

{

if(dbms.equals("mysql"))

{

return mysqlDao;

}else if (dbms.equals("ora"))

{

//오라클로 정의된 messagedao를 넘겨 주라 

return null;

}

return null;

}

}



MessageDaoProviderInit.java

package myjsp.guest.dao;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;


public class MessageDaoProviderInit extends HttpServlet{


@Override

public void init(ServletConfig config) throws ServletException {

// TODO Auto-generated method stub

/*

* web.xml 내용

<servlet>

<servlet-name>MessageDaoProviderInit</servlet-name>

<servlet-class>myjsp.guest.dao.MessageDaoProviderInit</servlet-class>

<init-param>

<param-name>dbms</param-name>

<param-value>mysql</param-value>

</init-param>

컨넥션 갯수는 사람이 많이 접속하면 숫자 늘리는데 선언안하면 계속 만들어질 수있어 메모리 누수 발생이 가능할 수있다 

<load-on-startup>1</load-on-startup>

</servlet>

*/

//web.xml 파일에 dbms라는 파라케터가 잇어야한다 

String dbms = config.getInitParameter("dbms");

if(dbms != null)

{

MessageDaoProvider.getInstance().setDbms(dbms);

}

}


}



MySQLMessageDao.java


package myjsp.guest.dao.mysql;


import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Collections;

import java.util.List;


import myjsp.guest.dao.MessageDao;

import mysql.guest.model.Message;

import myjsp.jdbc.*;


public class MySQLMessageDao extends MessageDao {


// insert 문장 수행

// 1레코드씩 추가


public int insert(Connection conn, Message message) throws SQLException {

PreparedStatement pstmt = null;

try {

pstmt = conn.prepareStatement("insert into guest"

+ " (guest_name,password,message) values (?,?,?)");

pstmt.setString(1, message.getGuestName());

pstmt.setString(2, message.getPassword());

pstmt.setString(3, message.getMessage());


return pstmt.executeUpdate();

} catch (Exception e) {


} finally {

jdbcUtil.close(pstmt);


}

return -1;

}


// 범위안에 포함된 레코드를 축출하여 List객체로 리턴


@Override

public List<Message> selectList(Connection conn, int firstRow, int endRow)

throws SQLException {

// TODO Auto-generated method stub


PreparedStatement pstmt = null;

ResultSet rs = null;


try {

pstmt = conn

.prepareStatement("select * from guest order by message_id desc limit ?, ?");

pstmt.setInt(1, firstRow);

pstmt.setInt(2, endRow);

rs = pstmt.executeQuery();


if (rs.next()) {

List<Message> messagelist = new ArrayList<Message>();

do {

messagelist.add(super.makeMessageFromResultSet(rs));

} while (rs.next());

return messagelist;

}else 

{

//데이터가 존재 하지 않을 경우 길이 0인 리스트를 만들어준다 

return Collections.emptyList();

}

} catch (Exception e) {


} finally {

jdbcUtil.close(rs);

jdbcUtil.close(pstmt);

}


return null;

}


}


jdbcUtil.java

package myjsp.jdbc;


//연결의 끊어주는 클래스 

import java.sql.*;


public class jdbcUtil {


public static void close(ResultSet rs) {

if (rs != null) {

try {

rs.close();


} catch (SQLException e) {


}

}

}

public static void close(Statement stmt) {

if (stmt != null) {

try {

stmt.close();


} catch (SQLException e) {


}

}

}

public static void close(Connection conn) {

if (conn != null) {

try {

conn.close();


} catch (SQLException e) {


}

}

}

//rollback처리 함수 

public static void rollback(Connection conn) {

if (conn != null) {

try {

conn.rollback();


} catch (SQLException e) {


}

}

}


}


ConnectionProvider.java


package myjsp.jdbc.connection;


import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;


//Connection 객체를 connection pool로 부터 리턴 

public class ConnectionProvider {


//컨넥션 풀에서 컨넥션 객체를 가져온다 

public static Connection getConnection() throws SQLException

{

return DriverManager.getConnection("jdbc:apache:commons:dbcp:/mysql");

}

}


Message.java

package myjsp.guest.model;

//한사람의 자료를 객체로 만들었따 

public class Message {


private int id;

private String guestName;

private String password;

private String message;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getGuestName() {

return guestName;

}

public void setGuestName(String guestName) {

this.guestName = guestName;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getMessage() {

return message;

}

public void setMessage(String message) {

this.message = message;

}

//방명록에 암호가 저장되어 있는지 여부를 체크 

//글 삭제시 사용하는 암호를 체크할 목적으로 

public boolean hasPassword()

{

return password !=null && !password.isEmpty();

}

}






MessageListView.java

package myjsp.guest.model;


import java.util.List;


public class MessageListView {

private int messageTotalCount;

private int currentPageNumber;

private List<Message> messagelist;//

private int pageTotalCount;

private int messageCountPerPage;

private int firstRow;

private int endRow;

public MessageListView(List<Message> messageList, int messageTotalCount , int currentPageNumber

,int messageCountPerPage , int firstRow,int endRow)

{

this.currentPageNumber = currentPageNumber;

this.messagelist = messageList;//

this.pageTotalCount = messageTotalCount;

this.messageCountPerPage= messageCountPerPage;

this.firstRow = firstRow;

this.endRow = endRow;

 

calPageTotalCount();

}

private void calPageTotalCount()

{

if(messageTotalCount == 0)

pageTotalCount = 0;

else 

{

pageTotalCount = messageTotalCount/messageCountPerPage;

if((pageTotalCount % messageCountPerPage)!=0)

pageTotalCount ++;

}

}

public int getCurrentPageNumber() {

return currentPageNumber;

}

public int getEndRow() {

return endRow;

}

public int getMessageTotalCount() {

return messageTotalCount;

}

public List<Message> getMessagelist() {

return messagelist;

}

public int getPageTotalCount() {

return pageTotalCount;

}

public int getMessageCountPerPage() {

return messageCountPerPage;

}

public int getFirstRow() {

return firstRow;

}

public boolean isEmpty()

{

return messageTotalCount == 0;

}

}


GetMessageListService.java

package myjsp.guest.service;


import java.sql.Connection;

import java.sql.SQLException;

import java.util.Collections;

import java.util.List;


import myjsp.guest.dao.MessageDao;

import myjsp.guest.dao.MessageDaoProvider;

import myjsp.guest.model.Message;

import myjsp.guest.model.MessageListView;

import myjsp.jdbc.jdbcUtil;

import myjsp.jdbc.connection.ConnectionProvider;


public class GetMessageListService {

private static GetMessageListService inst = new GetMessageListService();


private GetMessageListService() {


}


public static GetMessageListService getInstance() {

return inst;

}


private static final int MESSAGE_COUNT_PERPAGE = 3;


// 지정된 페이지에 해당하는 기본적인 처리작업을 해주는 함수


public MessageListView getMessageList(int pageNumber) throws ServiceException,SQLException {


Connection conn = null;

int currentPageNumber = pageNumber;

try {

// 컨넥션 풀로 부터 컨넥션 객체를 할당 받는다

conn = ConnectionProvider.getConnection();

MessageDao messageDao = MessageDaoProvider.getInstance()

.getMessageDao();

int messageTotalCount = messageDao.selectCount(conn);

List<Message> messageList = null;

int firstRow = 0;

int endRow = 0;

if (messageTotalCount > 0) {

firstRow = (pageNumber - 1) * MESSAGE_COUNT_PERPAGE;

endRow = firstRow + MESSAGE_COUNT_PERPAGE ;

messageList = messageDao.selectList(conn, firstRow, endRow);

} else {

currentPageNumber = 0;

messageList = Collections.emptyList();

}

return new MessageListView(messageList, messageTotalCount,

currentPageNumber, MESSAGE_COUNT_PERPAGE, firstRow, endRow);


} catch (Exception e) {

throw new ServiceException("메시지 목록 구하기 실패 "+ e.getMessage(),e);

}finally{

jdbcUtil.close(conn);

}

}


}





ServiceException.java

package myjsp.guest.service;


public class ServiceException extends Exception {


public ServiceException(String message, Exception cause)

{

super(message, cause);

}

public ServiceException(String message)

{

super(message);

}

}




WriteMessageService.java


package myjsp.guest.service;


import java.sql.Connection;

import java.sql.SQLException;


import myjsp.guest.dao.MessageDao;

import myjsp.guest.dao.MessageDaoProvider;

import myjsp.guest.model.Message;

import myjsp.jdbc.jdbcUtil;

import myjsp.jdbc.connection.ConnectionProvider;


public class WriteMessageService {

private static WriteMessageService instance = new WriteMessageService();

private WriteMessageService()

{

}

public static WriteMessageService getInstance()

{

return instance;

}

public void write(Message message) throws SQLException,ServiceException

{

Connection conn = null;

try{

conn = ConnectionProvider.getConnection();

MessageDao messageDao = MessageDaoProvider.getInstance().getMessageDao();

//message객체를 db에 저장 

messageDao.insert(conn, message);

}

catch(Exception e)

{

throw new ServiceException("메시지 등록 실패 "+e.getMessage(),e);

}

finally

{

jdbcUtil.close(conn);

}

}

}




DeleteMessageService.java

package myjsp.guest.service;


import java.sql.Connection;

import java.sql.SQLException;


import myjsp.guest.dao.MessageDao;

import myjsp.guest.dao.MessageDaoProvider;

import myjsp.guest.model.Message;

import myjsp.jdbc.jdbcUtil;

import myjsp.jdbc.connection.ConnectionProvider;


public class DeleteMessageService {

private static DeleteMessageService instance = new DeleteMessageService();

private DeleteMessageService()

{

}

public static DeleteMessageService getInstance()

{

return instance;

}

public void delete(int messageid,String password) throws SQLException,ServiceException,MessageNotFoundException,InvalidMessagePasswordException 

{

Connection conn = null;

try{

conn = ConnectionProvider.getConnection();

conn.setAutoCommit(false);

MessageDao messageDao = MessageDaoProvider.getInstance().getMessageDao();

Message message = messageDao.select(conn, messageid);

if(message == null)

{

throw new MessageNotFoundException("메세지가 존재 하지 않습니다 ");

}

if(!message.hasPassword())

{

throw new InvalidMessagePasswordException("페스워드 없다 ");

}

if(!message.getPassword().equals(password))

{

throw new InvalidMessagePasswordException("페스워드 다르다  ");

}

messageDao.delete(conn, messageid);

conn.commit();

}

catch(SQLException e)

{

jdbcUtil.rollback(conn);

throw e;

}

finally

{

if(conn != null)

{

try{

conn.setAutoCommit(false);

}catch(SQLException e)

{

}

}

jdbcUtil.close(conn);

}

}


}


InvalidMessagePasswordException .java

package myjsp.guest.service;


public class InvalidMessagePasswordException extends Exception {


public InvalidMessagePasswordException(String msg)

{

super(msg);

}

}


MessageNotFoundException .java

package myjsp.guest.service;


public class MessageNotFoundException extends Exception {

public MessageNotFoundException(String msg)

{

super(msg);

}

}



DBCPInit.java

package myjsp.jdbc;


import java.util.StringTokenizer;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;


public class DBCPInit extends HttpServlet {


public void init(ServletConfig config) throws ServletException {

try {

String drivers = config.getInitParameter("jdbcdriver");

StringTokenizer st = new StringTokenizer(drivers,",");

while(st.hasMoreTokens())

{

String jdbcDriver = st.nextToken();

Class.forName(jdbcDriver);

}

//컨넥션 풀링 사용하기 위한 드라이드 로딩 

Class.forName("org.apache.commons.dbcp.PoolingDriver");

} catch (Exception e) {

throw new ServletException(e);

}

}


}




///jsp페이지 



list.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

    <%@ page import="myjsp.guest.model.*" %>

    <%@ page import="myjsp.guest.service.*" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>방명록 목록 </title>

</head>

<body>

<%

String pageNumberStr = request.getParameter("page");

int pageNumber = 1;

if(pageNumberStr!=null)

{

pageNumber= Integer.parseInt(pageNumberStr);

}

GetMessageListService messageListService = GetMessageListService.getInstance();

MessageListView viewData =  messageListService.getMessageList(pageNumber);

%>


<form action="writeMessage.jsp" method="post">

이름 :<input type="text" name="guestName"/><br>

암호 :<input type="password" name="password"/><br>

메시지 :<textarea rows="3" cols="30" name="message"></textarea><br>

<input type="submit" value="메시지남김"/>

</form>

<hr>

<% if(viewData==null){%>

등록된 메시지가 없습니다.

<%}else { %>

<table bolder="1">

<%

for(Message message:viewData.getMessagelist())

{

%>


<tr>

<td>

메시지 번호:<%=message.getId() %><br>

이름:<%=message.getGuestName() %><br>

메세지:<%=message.getMessage() %><br>

<a href="comfirmDeletion.jsp?messageId=<%=message.getId() %>">삭제</a>

</td>

</tr>

<%

}

%>

</table>

<%

for(int i = 1 ; i <= viewData.getPageTotalCount(); i ++)

{

%>

<a href="list.jsp?page=<%=i %>">[<%=i %>]</a>

<%

}

%>


<%} %>




</body>

</html>




writeMessage.jsp

<%@page import="myjsp.guest.service.WriteMessageService"%>

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>방명록 작서 ㅇ</title>

</head>

<body>

<%


request.setCharacterEncoding("euc-kr");


%>

<jsp:useBean id="messageClassName" class="myjsp.guest.model.Message">

<jsp:setProperty name="messageClassName" property="*"/>

</jsp:useBean>


<%

WriteMessageService writeService = WriteMessageService.getInstance();


writeService.write(messageClassName);

%>

방명록 메시지 남김

<br>

<a href="list.jsp">목록보기</a>

</body>

</html>



deleteMessage.jsp

<%@page import="myjsp.guest.service.InvalidMessagePasswordException"%>

<%@page import="myjsp.guest.service.DeleteMessageService"%>

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>


<%

int messageId = Integer.parseInt(request.getParameter("messageid"));

String password = request.getParameter("pwd");

boolean sw = false;

System.out.println("messageId "+messageId +" password  "+password);

try

{

DeleteMessageService deleteService = DeleteMessageService.getInstance();

deleteService.delete(messageId,password);

}catch(InvalidMessagePasswordException e)

{

sw = true;

}

%>

<% if(!sw) {%>

메시지 삭제 완료 <br>

<%} else {%>

메시지 삭제 실패 <br> 

<%} %>

<a href="list.jsp">돌아가기 </a>

</body>

</html>



comfirmDeletion.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>메시지 삭제 </title>

</head>

<body>

<form action ="deleteMessage.jsp" method="post">

<input type="hidden" name="messageid" value="<%=request.getParameter("messageId") %>"/>

메시지를 삭제하려면 암호를 입력<br>

암호:<input type="password" name="pwd"/><br>

<input type="submit" value="삭제"/>

</form>

</body>

</html>



'JAVA' 카테고리의 다른 글

JAVA FTP 업데이트  (0) 2015.10.08
이클립스 워크 스페이스 삭제후 에러 발생  (0) 2014.12.03
서버 확인후 메시지 보내기  (0) 2014.10.20
java 이미지 바이트 조합  (0) 2014.01.09
자바 정렬  (0) 2011.12.01
posted by 욱이다
2014. 12. 3. 17:34 JAVA

이클립스 워크 스페이스 삭제후 에러 발생 

delete eclipse workspace 




an error has occurred .metadata .log



/Users/son/Documents/workspace/.metadata/.plugins/org.eclipse.core.resources


.snap파일 제거 


rm .snap


'JAVA' 카테고리의 다른 글

JAVA FTP 업데이트  (0) 2015.10.08
jsp  (0) 2015.04.04
서버 확인후 메시지 보내기  (0) 2014.10.20
java 이미지 바이트 조합  (0) 2014.01.09
자바 정렬  (0) 2011.12.01
posted by 욱이다
2014. 10. 20. 17:05 JAVA

서버 죽었는지 확인하고 

죽었으면 메시지 보내기 

한시간에 한번 이상 안보내게 했다 

한번 문자 메시지 오면 내가 확인해볼꺼니깐 굳이 계속 적인 문자 메시지는 필요없다 



import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

import java.sql.Date;

import java.text.SimpleDateFormat;

import java.util.Timer;

import java.util.TimerTask;


public class TomcatListenerS {

Long CheckSmsTime;


public static final void main(String args[]) {

System.out.println("TomcatListenerS");

TomcatListenerS lTomCat = new TomcatListenerS();

lTomCat.setTimer();


}

int delay = 60;

public TomcatListenerS()

{

CheckSmsTime = System.currentTimeMillis() + 1000 * 60 * (delay-10);

}

public void setTimer() {

Timer t = new Timer();

t.schedule(new CheckTimer(), 0, 1000 * 60 * 5);

}

public void sendSms()

{

if (CheckSmsTime + 1000 * 60 * delay < System.currentTimeMillis()) {

try {

System.out.println(getDate() + "sendSms Start - 문자 메시지 보내기");

URL obj = new URL(

"메시지 보내는 주소에 전화번호와 메시지 실어 보낸다 우린 뿌리오 쓴다");


HttpURLConnection con = (HttpURLConnection) obj

.openConnection();

BufferedReader in = new BufferedReader(new InputStreamReader(

con.getInputStream()));

String inputLine;

StringBuffer response = new StringBuffer();


while ((inputLine = in.readLine()) != null) {

response.append(inputLine);

}

in.close();

System.out.println(response.toString());


CheckSmsTime = System.currentTimeMillis();

} catch (Exception e) {

System.out.println("TomcatListenerS " + e.toString());


}

System.out.println(getDate() + "sendSms End ");

}

}

public boolean checkServer() {

try {

System.out.println(getDate() + "checkServer Start - 서버 확인 ");


URL obj = new URL(

"서버 접속하고 디비 접속 가능 한지 테스트 해보는 페이지 접속 한다 /connection_check.jsp");


HttpURLConnection con = (HttpURLConnection) obj.openConnection();

BufferedReader in = new BufferedReader(new InputStreamReader(

con.getInputStream()));

String inputLine;

StringBuffer response = new StringBuffer();


while ((inputLine = in.readLine()) != null) {

response.append(inputLine);

}

in.close();


System.out.println(response.toString());


if (response.toString().contains("true")) {

System.out.println(getDate() + "checkServer End True ");

return true;

}


} catch (Exception e) {

System.out.println("TomcatListenerS " + e.toString());


}

System.out.println(getDate() + "checkServer End False ");

return false;

}


public void callBat(String CallBat) {

try {


System.out.println(getDate() + "callBat Start - 톰캣 서버 작업 "+CallBat);

//톰캣  shotdown.bat과  startup.bat을 사용 한다 톰캣 설치 할때 bin폴더에 없으면 tomcat zip파일 다운받아 bin폴더를 설치한데다 덮어 써라 

Runtime.getRuntime().exec("cmd /c start "+ CallBat );

} catch (Exception e) {


}

System.out.println(getDate() + "callBat End ");

}


class CheckTimer extends TimerTask {

@Override

public void run() {

// TODO Auto-generated method stub


System.out.println(getDate() + "CheckTimer Start - 서버 살았나 죽었나 확인후 서버 껏다 키고 문자 보내는 실행 파일");

if (checkServer()) {

CheckSmsTime = 0L;

} else {

sendSms();

//일단 셧다운 호출해서 tomcat끄고 

callBat(".\\bin\\shutdown.bat");

try {

Thread.sleep(1000 * 10);

} catch (Exception e) {


}

//스타트 시킨다 

callBat(".\\bin\\startup.bat");

}

System.out.println(getDate() + "CheckTimer End ");

}


}


public String getDate() {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

Date result = new Date(System.currentTimeMillis());

return "[" + sdf.format(result) + "]";

}

}



'JAVA' 카테고리의 다른 글

jsp  (0) 2015.04.04
이클립스 워크 스페이스 삭제후 에러 발생  (0) 2014.12.03
java 이미지 바이트 조합  (0) 2014.01.09
자바 정렬  (0) 2011.12.01
자바 한글 있나 확인하기 (java string 한글 영어 구분)  (0) 2011.12.01
posted by 욱이다
2014. 1. 9. 22:57 JAVA

이미지 가꼬가서 쓰는거 아닌가 해서 바로 못보게 해야겠는데 ...

뭐 딱히 방법도 없고 해서 .... 걍 섞어 보자 해서 



import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;


public class ChangerManager {

final int jumpsize[] = { 1, 3, 2, 0, 4 };


/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stu

ChangerManager cm = new ChangerManager(

"/Users/s/Documents/project_android/ImageChanger/img",

"/Users/s/Documents/project_android/ImageChanger/img_");

}


public ChangerManager(String getPath, String setPath) {

File fget = new File(getPath);

File fset = new File(setPath);


String strGetList[] = fget.list();

for (int i = 0; i < strGetList.length; i++) {

byte buffer[] = getFileByte(new File(getPath + "/" + strGetList[i]));


int len = buffer.length / jumpsize.length;

///////////////////////////////////////이건 썩어서 저장

byte buf[] = new byte[buffer.length];

System.arraycopy(buffer, 0, buf, 0, buffer.length);

for (int j = 0; j < jumpsize.length; j++) {

int offset = jumpsize[j] / jumpsize.length;

System.arraycopy(buffer, len * j, buf, len * jumpsize[j], len);

}

setFileByte(buf, new File(setPath + "/" + strGetList[i]));

///////////////////////////////////////이건 썩은걸 다시 원상 복구 해본거

byte buf2[] = new byte[buf.length];

System.arraycopy(buf, 0, buf2, 0, buf.length);

for (int j = 0; j < jumpsize.length; j++) {

int offset = jumpsize[j] / jumpsize.length;

System.arraycopy(buf, len * jumpsize[j], buf2, len * j, len);

}

setFileByte(buf2, new File(setPath + "/_" + strGetList[i]));

}


}


public void getFileCheck(byte buff[], File f)

{

}

public void setFileByte(byte buff[], File f) {

FileOutputStream fos = null;

try {

fos = new FileOutputStream(f);

fos.write(buff);

} catch (Exception e) {


} finally {

try {

if (fos != null)

fos.close();

} catch (Exception e) {


}

}

}


public byte[] getFileByte(File f) {

long length = f.length();

byte buffer[] = new byte[(int) length];

FileInputStream fis = null;

try {

fis = new FileInputStream(f);

fis.read(buffer);

} catch (Exception e) {


} finally {

try {

if (fis != null)

fis.close();

} catch (Exception e) {


}

}

return buffer;

}

}

posted by 욱이다
2011. 12. 1. 17:50 JAVA

방법1
Arrays.sort(UrlData.URLSName, new Comparator<Object>() {
 
public int compare(Object o1, Object o2) {
 
String t1 = (String) o1;

String t2 = (String) o2;

int re = t1.compareTo(t2);
 
return re;

}

});


방법2
ArrayList<String> alurlname = new ArrayList<String>();

Collections.sort(alurlname);//정렬

Collections.reverse(alurlname);//반대로 정렬

 
방법3

static void bubbleSort(String[] p_array) throws Exception {

boolean anyCellSorted;

int length = p_array.length;

String tmp;

for (int i = length; --i >= 0;) {

anyCellSorted = false;

for (int j = 0; j < i; j++) {

if (p_array[j].compareTo(p_array[j + 1]) > 0) {

tmp = p_array[j];

p_array[j] = p_array[j + 1];

p_array[j + 1] = tmp;

anyCellSorted = true;

}

}

if (anyCellSorted == false) {

return;

}

}





for문 돌려서 순서대로 비교할 일은 없을꺼 같네  

posted by 욱이다
2011. 12. 1. 17:42 JAVA

String temp11 ="한글입니다확인해보세요  show me the money";

String digitRegEx = ".*[ㄱ-ㅎㅏ-ㅣ가-힣]+.*"; // 스트링에 한글이 들어있는지 확인 가능하다 

//String digitRegEx = "[ㄱ-ㅎㅏ-ㅣ가-힣]+.*"; //처음 시작이 한글인가 구분 할수있게 된다 

Pattern pattern = Pattern.compile(digitRegEx);

// "compile"=지정된 정규 표현을 패턴에 컴파일 합니다.

Matcher matcher = pattern.matcher(temp11);

// matcher=지정된 정규 표현을 컴파일 해, 지정된 입력과 그 정규 표현을 매치 합니다

String imsi = "";

Log.i("aa", "start");

while (matcher.find()) {

Log.i("aa", "찾은 것: " + matcher.group());

imsi += matcher.group();

Log.i("aa", "시작: " + matcher.start());

Log.i("aa", "끝: " + matcher.end());


}

Log.i("aa", imsi);




정규식 관련 참고 자료 
http://kio.zc.bz/Lecture/regexp.html
http://www.sitepoint.com/article/java-regex-api-explained/ 

여기서 찾았어요 
http://ohgyun.tistory.com/132 
http://blog.naver.com/PostView.nhn?blogId=eoqufryghl&logNo=111323316&viewDate=&currentPage=1&listtype=0 

'JAVA' 카테고리의 다른 글

java 이미지 바이트 조합  (0) 2014.01.09
자바 정렬  (0) 2011.12.01
extra operand `/nologo' 에러  (0) 2011.07.15
java 폴더 파일 명과 디렉토리 명 뽑아오기  (0) 2011.06.24
MFC CBUTTON에 단축키 설정하기  (0) 2011.01.21
posted by 욱이다
2011. 7. 15. 11:28 JAVA
ktf wipi1.2 컴파일중
j2x86bin 을 실행중에

원래는 line.exe가 vc 꺼 패스 잡아서 써야되는데

cygwin의 link.exe나
gnuWin32의 link.exe가 잡힐 경우가있다

그래서 급한데로 설치된 파일 경로 c:\cygwin 을 c:\cygwin_ 으로 수정하고 gnuWin32도 동일하게 수정했다



j2x86bin 실행중 step 2 에서 에러 날때 보면 dll파일을 접근 할 수없다고하는데 다른 곳에 포함된 dll파일을 path잡으면된다
나는 이곳을 패스 잡았다 C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE


posted by 욱이다
2011. 6. 24. 17:13 JAVA

cls
javac srcList.java
java srcList
PAUSE


import java.io.*;
import java.util.*;
import java.lang.*;
import java.text.*;

/*
 * java srcList D:\KTF_WIPIC\Pipe\src skt
 * java srcList D:\KTF_WIPIC\Pipe\src lgt
 * skt일때는 파일 명만 lgt일때는 경로 까지 포함한다
 * 파일을 리스트를 뽑아내 텍스트 파일을 만든다
 */
public class srcList
{
    boolean DEBUG = false;
    int cursor = 0, cursor2 = 0;
    String szFileNameSKT[] = new String[128];
    String szFileNameLGT[] = new String[128];
    String szSKTName = "srcList2_skt.txt";
    String szLGTName = "srcList2_lgt.txt";
    String szFileNameSKTFolder[] = new String[128];
    String szSKTFolderName = "srcList2_sktfolder.txt";

    public static void main(String args[])
    {
        srcList mix = new srcList();
        String dir = System.getProperty("user.dir");
        mix.filterFile(dir);
        mix.writeFile(dir);
    }

    public void writeFile(String _curPath){
        String _szSKT = "", _szLGT = "", _szSKTFolder = "";
        for(int i =0; i < cursor; i++){
        //    if(DEBUG)System.out.println("["+i+"]"+szFileNameSKT[i]);
            _szSKT += szFileNameSKT[i]+"\\\n";
            _szLGT += szFileNameLGT[i]+"\\\n";
        }


        for(int i =0; i < cursor2; i++){
        //    if(DEBUG)System.out.println("["+i+"]"+szFileNameSKTFolder[i]);
            _szSKTFolder += szFileNameSKTFolder[i]+"\\\n";
        }

        _szSKT = _szSKT.substring(0, _szSKT.length() - 2);
        _szLGT = _szLGT.substring(0, _szLGT.length() - 2);

        _szSKT += "#";
        _szLGT += "#";

    //    if(DEBUG)System.out.println("SKT:"+_szSKT);
    //    if(DEBUG)System.out.println("LGT:"+_szLGT);

        byte bufNames[] = _szSKT.getBytes();
        save(_curPath, szSKTName, bufNames);

        bufNames = _szLGT.getBytes();
        save(_curPath, szLGTName, bufNames);

        bufNames = _szSKTFolder.getBytes();
        save(_curPath, szSKTFolderName, bufNames);
    }


    public void filterFile(String _curPath)
    {
        if(DEBUG)System.out.println("_curPath:" + _curPath);
        File _fileList = new File(_curPath);
        String _fileNameList[] = _fileList.list();
        String _fullPathFile;
        File _curFile;
        int _len, _idx;
        for(int i = 0 ; i < _fileNameList.length; i ++){
            _fullPathFile = _curPath+"\\"+_fileNameList[i];
            _curFile = new File(_fullPathFile);
            if(DEBUG)System.out.println("["+i+"]:"+_curFile);

            if(_curFile.isFile()){
                _len = _fileNameList[i].length();
                _idx = _fileNameList[i].indexOf(".c");
                if(_idx > 0 && _idx == _len - 2 ){
                    //if(DEBUG)System.out.println(" > 파일:" + _fileNameList[i]);
                    pushName(_curPath, _fileNameList[i]);
                }else{
                    //if(DEBUG)System.out.println(" > 일반파일이라서 패스:" + _fileNameList[i]);
                }
            }else{
            //    if(DEBUG)System.out.println(" > 디렉토리:" + _curFile);
            //    if(DEBUG)System.out.println(" > 디렉토리:" + _curFile.getName());
                pushFolderName(_fullPathFile);
                filterFile(_fullPathFile);
            }
        }
    }

    public void pushName(String _szParentPath, String _szFileName){
        szFileNameSKT[cursor] = _szFileName;
       
       
        int i ;
        int length = _szParentPath.length();
       
        byte dirbuf[]  = new byte[length];
        dirbuf = _szParentPath.getBytes();
        for(i = 0;i< length; i ++)
        {
            if(dirbuf[i]=='\\')
                dirbuf[i] = '/';
        }
        String szParentPath = new String(dirbuf);           
       
        szFileNameLGT[cursor] = szParentPath +"/"+ _szFileName;
                   
        cursor++;
    }


    public void pushFolderName(String _fullPathFile){
        szFileNameSKTFolder[cursor2] = _fullPathFile;
        cursor2++;
    }

    public void save(String directory, String fileName, byte data[]){
        FileOutputStream out = null;
        File file = new File(directory,fileName);
        try{
            out = new FileOutputStream(file);
            out.write(data);
        }catch(Exception e){
            if(DEBUG)System.out.println(fileName+"이 쓰다 오류:"+e);
        }

    }

}

'JAVA' 카테고리의 다른 글

자바 한글 있나 확인하기 (java string 한글 영어 구분)  (0) 2011.12.01
extra operand `/nologo' 에러  (0) 2011.07.15
MFC CBUTTON에 단축키 설정하기  (0) 2011.01.21
java파일 압축하기  (0) 2010.08.23
에러 수정방법  (0) 2010.08.20
posted by 욱이다
2011. 1. 21. 13:11 JAVA


다이얼로그 프로그램에 버튼을 설정했을때 그 버튼에다가 단축키를 설정한다
일단 다이얼 배치를 보자


추가와 삽입 삭제 수정에다가 단축키를 설정하려고한다
리소스에있는 IDR_MAINFRAME 클릭하면 왼쪽의 화면이 나온다  여기서
IDC_BUTTON_ADD_AC 부터 아래 까지가 내가 설정한 단축키 값이다
원래 IDC_BUTTON_ADD가 있는데 뒤에_AC를 붙여서 새로운 아이디를 만든거다 (그냥 왼쪽 화면에다가 쳐넣으면된다)

나는 CDialogForm에다가 넣을꺼다 클래스 목록에서 CDialogForm에커서를 두고 함수처리기 이름에 원하는 이름을 넣는다

CDialogForm 을 선택하면 이렇함수 넣을 수있는 창이있는데 여기다가 OnInitDialog 와 PreTranslateMessage를 선택한다

이건 소스 부분인데 이게 다다 CDialogForm에서 이전 작업을 하면서 새로생성된 소스들이다
CDialogForm.h에
HACCEL m_hAccel; 이걸 변수로 추가해주고 위와 같이 작업하면 된다 ~

'JAVA' 카테고리의 다른 글

extra operand `/nologo' 에러  (0) 2011.07.15
java 폴더 파일 명과 디렉토리 명 뽑아오기  (0) 2011.06.24
java파일 압축하기  (0) 2010.08.23
에러 수정방법  (0) 2010.08.20
JAVA SAMPLE 사이트  (0) 2010.08.17
posted by 욱이다
prev 1 2 next