Vitual host에 alias를 붙이니 오류가 났다..

virtual host이기 때문에 서버 설정을 바꾸는게 아니라 가상 호스트 설정만 바꾸어야 한다. (보안상..)

httpd-vhosts.conf 에서
Alias /yeory "D:/yeory/webapp1"  # Alias 설정.

<Directory "D:/yeory/webapp1">
     Options FollowSymLinks
     AllowOverride None
     Order deny,allow
     Allow from all
</Directory>


만약 가상호스팅을 하지 않고 단독으로 사용한다면 별수없이 서버 설정을 바꾸는게 맞다.
즉 httpd.conf의

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>
적색 부분을 Allow from all 바꿔주면 된다.

그리고 자신의 WebRoot로 이동했을때 기본 페이지인 index.jsp, default.jsp 등이 보여지지 않으면 서버 설정을 수정하여야 한다.

<IfModule dir_module>
    DirectoryIndex index.html index.jsp default.jsp
</IfModule>

적색 부분 처럼 자신이 작성한 기본 페이지를 추가해주면 되는 것..

'Web' 카테고리의 다른 글

Tomcat console encoding.  (0) 2010.09.01
[Script] 특수문자 강제 치환.  (0) 2010.07.23
Apache error : client denied by server configuration  (0) 2010.03.31
DWR 간단 테스트  (0) 2010.03.29
JSP 에러 모음  (0) 2010.03.29
브라우저 구분하기.  (0) 2010.03.29


Eclipse에서 Web Project 생성.

Project Name : DWR-Test

dwr.jar 파일을 Project내의 WEB-INF/lib에 넣어준다.


web.xml에 아래 내용 추가.

     dwr-invoker                  org.directwebremoting.servlet.DwrServlet                        debug               true                 dwr-invoker         /dwr/* 


중간 파란색 부분은 dwr 버전이 1.x라면 uk.ltd로 시작하는것을 servlet-class로 적어주어야만 한다. 무조건.


dwr.xml 만들기.

                                                      

<dwr> 위에 아래 docType을 추가한다. (코드 하이라이터에서 docType을 빼버려서..)
 <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">

creator에 new라는 것은 객체를 만들어서 사용한다는 것이고.. HelloTest는 jsp나 html에서 객체의 이름으로 사용할 것을 적는당.
param의 class란 java파일이므로 class라 한 것이고... value의 dwr.test.SimpleText는 java파일의 경로를 적은 것.
hello란 것은 SimpleText Class의 메소드로 hello가 있다는 것을 정의해준 것.(그냥 쓸거 정의하면 됨..)

SimpleText.java 만들기

src 아래에 패키지 만들기를 통해 dwr.test를 만든 후 test 아래에 SimpleText class를 만든다.

package dwr.test;    public class SimpleText {            public String hello(String value){                   return "Hello ~ "+value;            } }

hello는 dwr.xml에서 정의한 것(자신이 쓸 메소드)과 일치시켜주면 된다.

이제 톰캣에 Project를 올리고 서버를 실행시킨후에
http://localhost:{your_port}/{your_app}/dwr/
위 주소로 들어가게 되면 dwr.xml에 정의했던 Class 목록이 나오게 된다.

위와 똑같이 했다면 이런 화면....

그리고 HelloTest를 눌러보면은.. 아래와 같이 나오게 된다..

위 그림에서 보면 script 구문이 3줄이 있다.
DWR이 알아서 저걸 만들어 준다는 것이다.
그리고 그 아래에는 Test를 할 수 있는 부분이 있다.

WebContent/index.jsp 만들기.


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


send를 클릭하게 되면 JavaScript의 test() function이 호출이 된다.
test에서는 demo에 적혀진 text를 value로 저장해 DWR에서  정의한 객체(HelloTest)의 메소드(hello)를 호출한다.
그런데 hello 메서드를 보게 되면 매개변수가 하나 였는데 script내에서는 2개이다..

why? 

이를 callback function이라 하는데, return값이 있다면 return 값을 처리하는 함수이다.
왜 저렇게 쓰냐고 하면... 그냥 간단히 하기 위해서??
왜 복잡한지 궁금하다면..

function test(){     var value = dwr.util.getValue("demo");     HelloTest.hello(value, cb_function);}function cb_function(data){     dwr.util.setValue("here", data);}


이렇게 사용하느니 그냥 줄여서 사용한다 이거다. 

위 예제는 정말 간단하게 DWR 설명이 가능한 예제이다..
jsp -> Java로 가는 대부분의 과정을 DWR이 처리해주고 있다..

무분별한 사용은 금지..
데이터가 많을 경우 메모리 급상승 최악에는 서버가 죽어버린다..

아래 링크에서 확인할 수 있다.
http://javaora.tistory.com/109



'Web' 카테고리의 다른 글

Tomcat console encoding.  (0) 2010.09.01
[Script] 특수문자 강제 치환.  (0) 2010.07.23
Apache error : client denied by server configuration  (0) 2010.03.31
DWR 간단 테스트  (0) 2010.03.29
JSP 에러 모음  (0) 2010.03.29
브라우저 구분하기.  (0) 2010.03.29

jQuery('#grid_selector').jqGrid( options )

 options에 해당하는 속성들.

Property Description
url

tells us where to get the data. Typically this is a server-side function with a connection to a database which returns the appropriate information to be filled into the Body layer in the grid

- 데이터를 가지고 와야할 url을 지정하는 곳. DB연결 동시에 적합한 정보를 body부분의 grid에 채워주는 server-side 기능이다.

datatype

this tells jqGrid the type of information being returned so it can construct the grid. In this case we tell the grid that we expect xml data to be returned from the server, but other formats are possible. For a list of all available datatypes refer to API Methods

- grid가 생성될때 리턴된 정보의 타입을 적는 곳. 이 경우 서버로부터 xml 데이터를 가져와 처리가능하고 다른 형식(타입)도 가능하다. 자세한 것은 API 메소드 보고 알아서 하라.

mtype

tells us how to make the ajax call: either 'GET' or 'POST'. In this case we will use the GET method to retrieve data from the server

- GET 방식으로 호출할지 POST로 호출할지를 적는 곳. 대부분 GET으로 이용한다.

colNames

an array in which we place the names of the columns. This is the text that appears in the head of the grid (Header layer). The names are separated with commas

- 컬럼의 이름을 지정하는 곳. Header Layer에 표시된다.

colModel an array that describes the model of the columns. This is the most important part of the grid. Here I explain only the options used above. For the complete list of options see colModel API:
name
the name of the column. This name does not have to be the name from database table, but later we will see how we can use this when we have different data formats

- 컬럼의 이름. 이름은 DB Table의 이름이 될 수 없으며, 추후 서로 다른 타입의 데이터 타입의 정보를 가지고 있을때 어떻게 사용할 수 있는지 볼 수 있다.

index
the name passed to the server on which to sort the data (note that we could pass column numbers instead). Typically this is the name (or names) from database -- this is server-side sorting, so what you pass depends on what your server expects to receive

- 데이터 정렬을 위한 인덱스. (DB의 테이블의 컬럼명을 따른다.)

width
the width of the column, in pixels
align
the alignment of the column
sortable
specifies if the data in the grid can be sorted on this column; if false, clicking on the header has no effect
pager

defines that we want to use a pager bar to navigate through the records. This must be a valid html element; in our example we gave the div the id of "pager", but any name is acceptable. Note that the Navigation layer (the "pager" div) can be positioned anywhere you want, determined by your html; in our example we specified that the pager will appear after the Body layer.

- 여러 데이터를 페이지 bar 하기 위해 선언하는 것. 반드시 유효한 element 여야 한다.

Navigation layer( Div : pager ) 를 이용하여 원할때 어디서든지 사용 가능하다.

rowNum

sets how many records we want to view in the grid. This parameter is passed to the url for use by the server routine retrieving the data

- grid에 몇개의 데이터를 보여 줄 것인지 지정 하는 것.

rowList

an array to construct a select box element in the pager in which we can change the number of the visible rows. When changed during the execution, this parameter replaces the rowNum parameter that is passed to the url

- pager의 select box가 생성될때 배열로 볼수 있는 데이터의 수를 지정한다. 갯수가 바뀌어 실행이 되면 rowNum 파라미터가 자동적으로 바뀌게 되어 url로 전송이 되어 다시 데이터를 가져온다.

sortname

sets the initial sorting column. Can be a name or number. This parameter is added to the url for use by the server routine

- 초기화 될때 sort할 컬럼을 지정한다. 숫자 or 컬럼 이름일 수 있고, 서버 루틴 사용을 위한 파라미터에 추가되는 것(?)

sortorder

sets the sorting order. This parameter is added to the url

- 정렬 방법 (desc | asc)

viewrecords

defines whether we want to display the number of total records from the query in the pager bar

- 총 레코드 수를 pager bar에 표시할 것 인지 지정하는 것.

imgpath

the path to the images needed for the grid. The path should not end with '/'

- 생략

caption

sets the caption for the grid. If this parameter is not set the Caption layer will be not visible

- Grid의 제목을 설정하는 것. 이 부분이 없으면 제목은 보여지지 않는다.




* HTTP Status Code
  사용자가 HTTP나 파일 전송 프로토콜(FTP: File Transfer Protocol)을 통해  인터넷 정보 서비스(IIS: Internet Information Server를 실행하는 서버의  콘텐츠에 액세스 하려고 하면 IIs에서는 요청 상태를 나타대는 숫자 코드를  반환한다. 이 상태 코드는 IIS로그에 기록되고 웹 브라우저나 FTP 클라이  언트에도 표시될 수 있고 요청이 실패한 정확한 이유도 표시할 수 있다.


* 1xx - 정보 전달용
 이 상태 코드는 임시 응답을 나타낸다.
 클라이언트가 정식 응답을 받으려면
 하나 이상의 1xx 응답을 받을 준비가 되어 있어야 한다.

 100 : Continue 계속 작업한다.
 101 : Switching protocols 프로토콜을 전환한다.

 

* 2xx - 성공
 상태 코드의 이 클래스는 서버가 클라이언트 요정을 받아들였음을 나타냄.
 200 : OK, 에러없이 전송 성공
 201 : Created, POST 명령 실행 및 성공
 202 : Accepted, 서버가 클라이언트 명령을 받음
 203 : Non-authoritative information, 서버가 클라이언트 요구 중 일부만  전송. 권한이 없는 정보이다.
 204 : No content, 클라언트 요구을 처리했으나 전송할 데이터가 없음
 205 : Reset content 내용을 다시 설정한다.
 206 : Partial content  일부 내용

 

* 3xx - 경로 변경
 클라이언트 브라우저는 요청을 처리하기 위해 좀더 조치를 취해야 한다.
 예를 들어, 브라우저는 서버에서 다른 페이지를 요청해야 하거나
 프록시 서버를 사용하여 요청을 반복해야 할 수 있다.

 300 : Multiple choices, 최근에 옮겨진 데이터를 요청
 301 : Moved permanently, 요구한 데이터를 변경된 임시 URL에서 찾았음
 302 : Moved temporarily, 요구한 데이터가 변경된 URL에 있음을 명시개체 이동
 303 : See other, 요구한 데이터를 변경하지 않았기 때문에 문제가 있음
 304 : Not modified 웹페이지에서 요청만하고 자신의 브라우저의 캐쉬를 사용하는 경우 수정되지 않았다.
 305 : Use proxy
 307 : 임시 리디렉션

 

* 4xx - 클라이언트 오류
 오류가 발생하고 클라이언트에 문제가 있는 것으로 나타난다.
 예를 들어, 클라이언트가 존재하지 않은 페이지를 요청하거나 올바른 인증 정보를 제공하지 않을 수도 있다.
 400 : Bad request, 클라이언트의 잘못된 요청으로 처리할 수 없음
 401 : Unauthorized, 클라이언트의 인증 실패  엑세스가 거부되었다
  IIS는 오류의 원인을 보다 구체적으로 나타내는  여러 다른 401 오류를 정의한다.
  이러한 특정 오류 코드는 브라우저에 표시되지만 IIS 로드에는 표시되지  않는다.
  401.1 : 로그온하지 못했다.
  401.2 : 서버 구성으로 인해 로그온하지 못했다.
  401.3 : 리소스의 ACL(Access Control List)에 의해 엑세스가 거부됨.
  401.4 : 필터에 의해 권한을 부여하지 못했다.
  401.5 : ISAPI/CGI 응용 프로그램에 의해 권한을 부여하지 못했다.
  401.7 : 웹 서버의 URL 인증 정책에 의해 엑세스가 거부되었다.   이 오류 코드는 IIS 6.0만 해당된다.
 402 : Payment required, 예약됨
 403 : Forbidden, 접근이 거부된 문서를 요청함
  IIS는 오류의 원인을 보다 구체적으로 나타내는 여러 다른 403 오류를  정의한다.
  403.1 : 실행 엑세스 금지
  403.2 : 읽기 엑세스 금지
  403.3 : 쓰기 엑세스 금지
  403.4 : SSL
 404 : Not found, 문서를 찾을 수 없음
 405 : Method not allowed, 리소스를 허용안함
 406 : Not acceptable, 허용할 수 없음
 407 : Proxy authentication required, 프록시 인증 필요
 408 : Request timeout, 요청시간이 지남
 409 : Conflict
 410 : Gone, 영구적으로 사용할 수 없음
 411 : Length required
 412 : Precondition failed, 전체조건 실패
 413 : Request entity too large,
 414 : Request-URI too long, URL이 너무 김
 415 : Unsupported media type

 

* 5xx - 서버 오류 - servlet이나 JSP의 요청을 서버가 처리 하지 못함
 500 : Internal server error, 내부서버 오류(잘못된 스크립트 실행시)
 501 : Not implemented, 클라이언트에서 서버가 수행할 수 없는 행동을   요구함
 502 : Bad gateway, 서버의 과부하 상태
 503 : Service unavailable, 외부 서비스가 죽었거나 현재 멈춤 상태
 504 : Gateway timeout
 505 : HTTP version not supported

 

 

퍼갓땐 댓글을 남기시기 바랍니다.

최소한의 예의겠지요..

 


'Web' 카테고리의 다른 글

Tomcat console encoding.  (0) 2010.09.01
[Script] 특수문자 강제 치환.  (0) 2010.07.23
Apache error : client denied by server configuration  (0) 2010.03.31
DWR 간단 테스트  (0) 2010.03.29
JSP 에러 모음  (0) 2010.03.29
브라우저 구분하기.  (0) 2010.03.29

오늘 FireFox와 IE에서 Date 객체의 getYear()의 결과가 다른걸 발견했다.

FireFox는 3.6 IE는 8.0


FireFox에서 나온 결과인데 getYear()의 결과는 110이다.







IE에서의 결과인데 getYear()는 2010이다.
이넘이 왜 1900을 자동으로 더해버리는지는 모르겠지만....
이는 IE 7.0에서도 마찬가지 결과를 확인했다..





파폭인지 IE인지 구분해주어야해서 소스를 추가했는데 document.all 이다.
all element는 IE에서만 존재하는 것이므로 IE일 경우는 1이된다.
var temp = now.getYear();
var year = temp;
var ie = (document.all)?1:0;
if( ie == 0) year += 1900;



'Web' 카테고리의 다른 글

Tomcat console encoding.  (0) 2010.09.01
[Script] 특수문자 강제 치환.  (0) 2010.07.23
Apache error : client denied by server configuration  (0) 2010.03.31
DWR 간단 테스트  (0) 2010.03.29
JSP 에러 모음  (0) 2010.03.29
브라우저 구분하기.  (0) 2010.03.29


위와 같은 그림이 있는데 -
직장/집 을 선택하면 주소를 넣어야하고, 수신거부를 선택하면 패스되는 유효성 검사를 해보려하는데 -

html을 이용한 for문을 사용한 것, jQuery를 이용하는 것 2가지를 비교해보면..

if(frm.p_addressGubun.length > 0){
	var b = 0; 
	for(var i=0; i<frm.p_addressGubun.length; i++){
		// 직장-집 일 경우
		if(frm.p_addressGubun[i].checked && frm.p_addressGubun[i].value != '3'){
			b = 1; break;
		// 수신거부일 경우
		}else if(frm.p_addressGubun[i].checked && frm.p_addressGubun[i].value == '3'){
			b = 2; break;
		}
	}
	if(b == 0){
		alert("주소 구분을 선택해 주세요. 주소가 없는 경우 수신거부를 선택하십시오.");
		 return false;
	}else if(b == 1 && frm.p_zipCode.value == ""){
		 alert("주소를 입력하세요. 주소가 없는 경우 수신거부를 선택하십시오.");
		 return false;
	}
	return true;
}


위 코드를 jQuery 코드로 바꾸면.. 아래와 같다..
if(frm.p_addressGubun.length > 0){
	if($j(':radio[name="p_addressGubun"]:checked').length < 1){
		alert("주소 구분을 선택해 주세요. 주소가 없는 경우 수신거부를 선택하십시오.");
		return false;
	}
	}else if($(':radio[name="p_addressGubun"]:checked').val() != 3 && frm.p_zipCode.value == ""){
		 alert("주소를 입력하세요. 주소가 없는 경우 수신거부를 선택하십시오.");
		 return false;
	}
	return true;
}


정말 간단해 진다..
:radio -> elements 중 radio 버튼 들
[name="elements_name"] -> elements_name 을 가진
합치면 :radio[name="p_addressGubun"] -> p_addressGubun 이름을 가진 radio 버튼을 선택한다.
:checked 선택된 것만.



왜 제네릭이 안되었는지 이제 알았다. 확실히...

먼저 제네릭이 안되었을때의 하이버네이트와 매핑한 bean을 살펴보면

 @Id
 @GeneratedValue(strategy=GenerationType.AUTO)
 public Integer getUserSeq() {
     return userSeq;
 }

오류난 로그

2010-01-09 23:06 [DEBUG] opened session at timestamp: 12630460153
2010-01-09 23:06 [DEBUG] about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
2010-01-09 23:06 [DEBUG] opening JDBC connection
2010-01-09 23:06 [DEBUG] select this_.userSeq as userSeq2_0_, this_.ANSWER as ANSWER2_0_, this_.BIRTH_DAY as BIRTH3_2_0_, this_.CREATE_DATE as CREATE4_2_0_, this_.DISABLE as DISABLE2_0_, this_.DOMAIN as DOMAIN2_0_, this_.E_MAIL as E7_2_0_, this_.EMAIL_DENY as EMAIL8_2_0_, this_.masterCodes as masterCo9_2_0_, this_.QUESTION as QUESTION2_0_, this_.RELATION_GROUP_SEQ as RELATION11_2_0_, this_.RELATION_SEQ as RELATION12_2_0_, this_.UPDATE_DATE as UPDATE13_2_0_, this_.USER_ID as USER14_2_0_, this_.USER_NAME as USER15_2_0_, this_.USER_NICK as USER16_2_0_, this_.USER_PW as USER17_2_0_, this_.USER_STATUS as USER18_2_0_ from MEMBER this_ where this_.USER_ID=? and this_.USER_PW=?
2010-01-09 23:06 [DEBUG] preparing statement
2010-01-09 23:06 [DEBUG] binding 'agnes0417' to parameter: 1
2010-01-09 23:06 [DEBUG] binding '~~~~~~~' to parameter: 2
2010-01-09 23:06 [DEBUG] about to open ResultSet (open ResultSets: 0, globally: 0)
2010-01-09 23:06 [DEBUG] processing result set
2010-01-09 23:06 [DEBUG] result set row: 0
2010-01-09 23:06 [DEBUG] returning null as column: userSeq2_0_
      -> primary key 가 null인게 있을리 없다..

2010-01-09 23:06 [DEBUG] result row: null
2010-01-09 23:06 [DEBUG] done processing result set (1 rows)
2010-01-09 23:06 [DEBUG] about to close ResultSet (open ResultSets: 1, globally: 1)
2010-01-09 23:06 [DEBUG] about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
2010-01-09 23:06 [DEBUG] closing statement



@Column을 명시하지 않았기에 하이버네이트가 매핑된 이름 그대로 컬럼을 찾는다.
DB의 컬럼명은 USER_SEQ인데.. 만약 DB 컬럼명이 USERSEQ였다면 제네릭이 되었을테지만..

아래처럼 고쳐주었다..

 @Id
 @GeneratedValue(strategy=GenerationType.AUTO)
 @Column(name="USER_SEQ")
 public Integer getUserSeq() {
      return userSeq;
 }

제대로 돌아간 로그 기록..

2010-01-09 23:01 [DEBUG] opened session at timestamp: 12630457058
2010-01-09 23:01 [DEBUG] about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
2010-01-09 23:01 [DEBUG] opening JDBC connection
2010-01-09 23:01 [DEBUG] select this_.USER_SEQ as USER1_2_0_, this_.ANSWER as ANSWER2_0_, this_.BIRTH_DAY as BIRTH3_2_0_, this_.CREATE_DATE as CREATE4_2_0_, this_.DISABLE as DISABLE2_0_, this_.DOMAIN as DOMAIN2_0_, this_.E_MAIL as E7_2_0_, this_.EMAIL_DENY as EMAIL8_2_0_, this_.masterCodes as masterCo9_2_0_, this_.QUESTION as QUESTION2_0_, this_.RELATION_GROUP_SEQ as RELATION11_2_0_, this_.RELATION_SEQ as RELATION12_2_0_, this_.UPDATE_DATE as UPDATE13_2_0_, this_.USER_ID as USER14_2_0_, this_.USER_NAME as USER15_2_0_, this_.USER_NICK as USER16_2_0_, this_.USER_PW as USER17_2_0_, this_.USER_STATUS as USER18_2_0_ from MEMBER this_ where this_.USER_ID=? and this_.USER_PW=?
2010-01-09 23:01 [DEBUG] preparing statement
2010-01-09 23:01 [DEBUG] binding 'agnes0417' to parameter: 1
2010-01-09 23:01 [DEBUG] binding '~~~~~' to parameter: 2
2010-01-09 23:01 [DEBUG] about to open ResultSet (open ResultSets: 0, globally: 0)
2010-01-09 23:01 [DEBUG] processing result set
2010-01-09 23:01 [DEBUG] result set row: 0
2010-01-09 23:01 [DEBUG] returning '2' as column: USER1_2_0_
2010-01-09 23:01 [DEBUG] result row: EntityKey[com.jaeyeollee.model.join.Member#2]
2010-01-09 23:01 [DEBUG] Initializing object from ResultSet: [com.jaeyeollee.model.join.Member#2]
2010-01-09 23:01 [DEBUG] Hydrating entity: [com.jaeyeollee.model.join.Member#2]

2010-01-09 23:01 [DEBUG] returning null as column: DISABLE2_0_
2010-01-09 23:01 [DEBUG] returning '@naver.com' as column: DOMAIN2_0_
2010-01-09 23:01 [DEBUG] returning 'leepcs' as column: E7_2_0_
2010-01-09 23:01 [DEBUG] returning null as column: EMAIL8_2_0_
2010-01-09 23:01 [DEBUG] returning null as column: masterCo9_2_0_
2010-01-09 23:01 [DEBUG] returning '어머니 성함' as column: QUESTION2_0_
2010-01-09 23:01 [DEBUG] returning 'CG0000' as column: RELATION11_2_0_
2010-01-09 23:01 [DEBUG] returning 'CS0000' as column: RELATION12_2_0_
2010-01-09 23:01 [DEBUG] returning null as column: UPDATE13_2_0_
2010-01-09 23:01 [DEBUG] returning 'agnes0417' as column: USER14_2_0_
2010-01-09 23:01 [DEBUG] returning 'Hibernate' as column: USER16_2_0_
2010-01-09 23:01 [DEBUG] returning null as column: USER18_2_0_
2010-01-09 23:01 [DEBUG] done processing result set (1 rows)
2010-01-09 23:01 [DEBUG] about to close ResultSet (open ResultSets: 1, globally: 1)
2010-01-09 23:01 [DEBUG] about to close PreparedStatement (open PreparedStatements: 1, globally: 1)

2010-01-09 23:01 [DEBUG] closing statement





그러니.. 제네릭이 된다.. 하하하;;;

아.. 볍신 인증했네...

난 Collection을 사용할때 항상 Generic 타입으로 객체를 생성하려한다.
이유야 generic을 사용하면 좀 간편해지니 (캐스팅을 할 필요도 없고..)

이유야 어쨋든 하이버 네이트에서도 제네릭을 붙여보았는데 ..


  1. Session session = getHibernateTemplate().getSessionFactory().openSession();
  2.  
  3. Criteria crit = session.createCriteria(Member.class);
  4. crit.add(Expression.eq("userId", member.getUserId()));
  5. crit.add(Expression.eq("userPw", member.getUserPw()));
  6.  
  7. List<Member> list = crit.list();

난 이게 될 줄 알았다. 정말 진짜...
심심풀이 만들어보고 있는데 이상하게 유저가 존재하는데도 session을 생성하려고하면 null을 뱉어내니 환장하는 수 밖에..

별 수단 다 써보다가 설마 싶어서 <Member>를 지우고 찍어보니.. 객체 주소가 찍히네...

그래서 도달한 결론은 7번 라인처럼 generic을 이용하여도 -
crit.list()를 하게 되면 return 되는 값들은 Object 형이므로 무조건 class Casting을 하여야 한다.

Membe rmember = (Member) list.get(0);

이렇게...  하면 틀린거고;;

http://yeory.tistory.com/46 여기를 참고하세요..

이글은 무식 인증 글임 ㅋ

1. sqljdbc.jar - JDBC4.0 미만

2. sqljdbc4.jar - JDBC 4.0 이상


sqljdbc.jar sqljdbc4.jar


현재 JRE 1.6 이상에서는 JDBC 4.0을 지원한는 lib를 써야 한다. 


JDBC 4.0을 이용한 성능 향상 : http://www.javaworld.com/javaworld/jw-05-2006/jw-0501-jdbc.html?page=1

무엇이 달려졌을까.. : http://today.java.net/pub/a/today/2007/04/10/whats-new-in-jdbc-40.html

MSDN 공식 문서 : http://msdn.microsoft.com/ko-kr/library/ms378422.aspx


그냥 sqljdbc4.jar 쓰면 되겠다...


'DB > MSSQL' 카테고리의 다른 글

SELECT 후 UPDATE  (0) 2010.06.08
MS-SQL JDBC Library  (0) 2009.12.09

+ Recent posts