[eclipse] short key

– 이클립스 자주쓰는 단축키 –

Ctrl + / : 주석 처리 – 한 라인/블록에 대해 주석 처리 (추가 및 제거)

Ctrl + L : 특정 라인으로 이동

Ctrl + F6 : Editor 창간의 이동

Ctrl + F7 : View 이동 메뉴

Ctrl + F8 : Prespectives 이동 메뉴

Ctrl + D : 한라인 삭제 – 커서가 위치한 라인 전체를 삭제 한다.

Ctrl + J : Incremental find 이클립스 하단 상태 표시줄에 Incremental find 라고 표시되어 한 글자자씩 누를 때 마다 코드내의 일치하는 문자열로 이동 , 다시 Ctrl + J 를 누르면 그 문자열과 일치 하는 부분을 위/아래 방향키로 탐색이 가능하다.

Ctrl + N : 새로운 파일 / 프로젝트 생성

Ctrl + 1 (빠른교정) – 문 맥에 맞게 소스 교정을 도와 준다. 변수를 선언하지 않고 썼을경우 빨간색 에러 표시되는데 이 단축키를 적용하면 변수에 맞는 선언이 추가 되도록 메뉴가 나타난다.

Ctrl + 0 : 클래스 구조를 트리로 보기

Ctrl + Space :  Cotent Assist – 소스 구문에서 사용 가능한 메소드, 멤버들의 리스트 메뉴를 보여준다.

Ctrl + PageUp , Ctrl + PageDown : Edit 창 좌우 이동 – Edit 창이 여러개 띄워져 있을경우 Edit 창간의 이동 한다.

Ctrl + Shift + Down : 클래스 내에서 다음 멤버로 이동

Ctrl + Shift + M : 해당 객체의 Import 문을 자동 생성 – import 추가 할 객체에 커서를 위치 시키고 단축키를 누르면 자동적으로 import 문이 생성

Ctrl + Shift + O : import 문을 자동 생성 – 전체 소스 구문에서 import 안된 클래스의 import 문을 생성해 준다.

Ctrl + Shift + G : 해당 메서드 / 필드를 쓰이는 곳을 표시 – View 영역에 Search 탭에 해당 메서드 / 필드를 사용하는 클래스를 표시 해준다.

Alt + Shift + R : Refactoring (이름변경) – Refactoing 으로 전체 소스에서 이름변경에 의한 참조 정보를 변경해 준다.

F3 : 선언 위치로 이동

F11 : 디버깅 시작

F8 : 디버깅 계속

F6 : 디버깅 한줄씩 실행(step over)

F5 : 디버깅 한줄씩 실행 함수 내부로 들어감 (step into)

F12 : Editor 창으로 이동 (Debugging 등 자동적으로 포커스가 이동 됐을경우 편리)

Alt + Up , Alt + Down : 줄 바꿈 – 해당 라인을 위 / 아래로 이동 시킨다.

Alt + Shift + S : Source Menu – 소스메뉴 (Import 추가 , Comment 추가 , 각종 Generator 메뉴) 가 나타난다.

Alt + Shift + Up : 블록설정 – 소스 코드를 블록 단위로 설정해 준다.

Alt + Shift + Down : 블록해제 – 소스 코드를 블록 단위로 해제한다.

Alt + Shift + J : 주석 생성 – 해당 메서드/클래스에 대한 주석을 템플릿을 생성해 준다.

sysout + (Ctrl + Space) : System.out.println() 문장 삽입 – 코드 템플릿을 이용해서 소스 구문을 추가

(Windows -> Preferences -> JAVA -> Editor -> Templates 에서 자주 쓰는 소스 구문을 추가시키면 <템플릿 이름> + (Ctrl + Space) 로 소스 문장을 완성 시킬 수 있다.)

Alt + Shift + Z : Surround With 메뉴 – try / catch 문이나 for , do , while 등을 해당 블록에 감싸주는 메뉴가 나타난다.

Ctrl + Shift + F : 코드 포맷팅 – 코드 내용을 문법 템플릿에 맞게 포맷팅(들여쓰기) 해준다.

Ctrl + Alt + Down: 한줄 복사후 아래에 복사 넣기 – Copy&Paste 대체하는 단축키. 커서가 위치한 라인을 복사해 밑줄에 생성해 준다.

Ctrl + Shift +X : 대문자로 변환

Ctrl + Shift + Y : 소문자로 변환

Ctrl + Shift + L : 모든 단축키의 내용을 표시해준다.

Ctrl + Shift + B : 현재 커서 라인에 Break point 설정

Ctrl + Shift + T : 클래스 찾기

 

 

– Eclipse 자주 쓰는 단축키 –

—– 실행 —–

Ctrl + F11 : 바로 전에 실행했던 클래스 실행

—– 소스 네비게이션 —–

Ctrl + 마우스커서(혹은 F3) : 클래스나 메소드 혹은 멤버를 상세하게 검색하고자 할때

Alt + Left, Alt + Right : 이후, 이전

Ctrl + O : 해당 소스의 메소드 리스트를 확인하려 할때

F4 : 클래스명을 선택하고 누르면 해당 클래스의 Hierarchy 를 볼 수 있다.

Alt + <-(->) : 이전(다음) 작업 화면

—– 문자열 찾기 —–

Ctrl + K : 찾고자 하는 문자열을 블럭으로 설정한 후 키를 누른다.

Ctrl + Shift + K : 역으로 찾고자 하는 문자열을 찾아감.

Ctrl + J : 입력하면서 찾을 수 있음.

Ctrl + Shift + J : 입력하면서 거꾸로 찾아갈 수 있음.

Ctrl + F : 기본적으로 찾기

—– 소스 편집 —–

Ctrl + Space : 입력 보조장치(Content Assistance) 강제 호출 => 입력하는 도중엔 언제라도 강제 호출 가능하다.

F2 : 컴파일 에러의 빨간줄에 커서를 갖져다가 이 키를 누르면 에러의 원인에 대한 힌트를 제공한다.

Ctrl + L : 원하는 소스 라인으로 이동

로컬 히스토리 기능을 이용하면 이전에 편집했던 내용으로 변환이 가능하다.

Ctrl + Shift + Space : 메소드의 가로안에 커서를 놓고 이 키를 누르면 파라미터 타입 힌트를 볼 수 있다.

Ctrl + D : 한줄 삭제

Ctrl + W : 파일 닫기

Ctrl + I : 들여쓰기 자동 수정

Ctrl + Shift + / : 블록 주석(/* */)

Ctrl + Shift + \ : 블록 주석 제거

Ctrl + / : 여러줄이 한꺼번에 주석처리됨. 주석 해제하려면 반대로 하면 된다.

Alt + Up(Down) : 위(아래)줄과 바꾸기

Alt + Shift + 방향키 : 블록 선택하기

Ctrl + Shift + Space : 메소드의 파라메터 목록 보기

Ctrl + Shift + O : 자동으로 import 하기

Ctrl + Shift + F4 : 열린 파일 모두 닫기

Ctrl + M : 전체화면 토글

Ctrl + Alt + Up(Down) : 한줄(블럭) 복사

Ctrl + , or . : 다음 annotation(에러, 워닝, 북마크 가능)으로 점프

Ctrl + 1 : 퀵 픽스

F3 : 선언된 변수로 이동, 메소드 정의부로 이동

Ctrl + T : 하이어라키 �b업 창 띄우기(인터페이스 구현 클래스간 이동시 편리)

Ctrl + O : 메소드나 필드 이동하기

Ctrl + F6 : 창간 전환, UltraEdit 나 Editplus 의 Ctrl + Tab 과 같은 기능

—– 템플릿 사용 —–

sysout 입력한 후 Ctrl + Space 하면 System.out.println(); 으로 바뀐다.

try 입력한 후 Ctrl + Space 하면 try-catch 문이 완성된다.

for 입력한 후 Ctrl + Space 하면 여러가지 for 문을 완성할 수 있다.

템플릿을 수정하거나 추가하려면 환경설정/자바/편집기/템플릿 에서 할 수 있다.

—– 메소드 쉽게 생성하기 —–

클래스의 멤버를 일단 먼저 생성한다.

override 메소드를 구현하려면, 소스->메소드대체/구현 에서 해당 메소드를 체크한다.

기타 클래스의 멤버가 클래스의 오브젝트라면, 소스->위임메소드 생성에서 메소드를 선택한다.

—– organize import —–

자바파일을 여러개 선택한 후 소스->가져오기 체계화 해주면 모두 적용된다.

—– 소스 코드 형식 및 공통 주석 설정 —–

환경설정 -> 자바 -> 코드 스타일 -> 코드 포멧터 -> 가져오기 -> 프로파일.xml 을 불러다가 쓰면 된다.

또한 다수의 자바파일에 프로파일을 적용하려면 패키지 탐색기에서 패키지를 선택한 후 소스 -> 형식화를 선택하면 된다.

환경설정 -> 자바 -> 코드 스타일 -> 코드 템플리트 -> 가져오기 -> 템플리트.xml 을 불러다가 쓰면 된다.

—– 에디터 변환 —–

에디터가 여러 파일을 열어서 작업중일때 Ctrl + F6 키를 누르면 여러파일명이 나오고 F6키를 계속 누르면 아래로

Ctrl + Shift + F6 키를 누르면 위로 커서가 움직인다.

Ctrl + F7 : 뷰간 전환

Ctrl + F8 : 퍼스펙티브간 전환

F12 : 에디터로 포커스 위치

 

 

Advertisements

[eclipse] book mark plugin

막강한 Eclipse의 플러그인

그래서 찾아 보았는데, 역시 이클립스의 플러그인은 대단하군요. 아래와 같이 플러그인을 설치해 주면 Ctrl-B로 북마크를 지정할 수 있고, Ctrl-P와 Ctrl-N으로 이동, 뿐만 아니라 Alt-숫자 키보드로 원하는 위치로의 이동이 가능합니다. 제가 사용하는 Eclipse가 Indigo 최신 버전이므로 아주 오래된 버전이 아니라면 대부분 사용할 수 있을 것으로 생각됩니다.

(1) Work with : 에 http://eclipse.etc.to/updates/ 라고 입력하고 엔터키를 누릅니다. (2) “Group items by category” 체크를 없애면 (3) Eclipse Quick Bookmarks 항목이 출력됩니다. 이 항목을 체크하고 [Next] 버튼을 클릭합니다.

이후에는 [Next] 버튼을 계속 누르고 동의서가 나오면 동의를 하면서 설치를 완료합니다.

이렇게 좋은 것을

이제 Ctrl-B를 누르면 북마크가 간단히 생성됩니다. 아우~ 시원합니다. ^^

 

참고 사이트:  http://jwmx.tistory.com/2226

[Spring] RestTemplate

Spring 3.0부터는 REST client를 쉽게 구현케 할 수 있는 RestTemplate이 도입되었다.

Main Method

HTTP method RestTemplate methods
DELETE delete(java.lang.String, java.lang.Object...)
GET getForObject(java.lang.String, java.lang.Class, java.lang.Object...)
getForEntity(java.lang.String, java.lang.Class, java.lang.Object...)
HEAD headForHeaders(java.lang.String, java.lang.Object...)
OPTIONS optionsForAllow(java.lang.String, java.lang.Object...)
POST postForLocation(java.lang.String, java.lang.Object, java.lang.Object...)
postForObject(java.lang.String, java.lang.Object, java.lang.Class, java.lang.Object...)
PUT put(java.lang.String, java.lang.Object, java.lang.Object...)
any exchange(java.lang.String, org.springframework.http.HttpMethod, org.springframework.http.HttpEntity, java.lang.Class, java.lang.Object...)
execute(java.lang.String, org.springframework.http.HttpMethod, org.springframework.web.client.RequestCallback, org.springframework.web.client.ResponseExtractor, java.lang.Object...)

Get Method

String result = restTemplate.getForObject("http://example.com/hotels/{hotel}/bookings/{booking}", 
String.class,"42", "21");

Post Method

String postUrl = url + “/login”;
MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add(“username”, user);
map.add(“password”, password);
String result = restTemplate.postForObject(postUrl, map, String.class);

Post Method – how to  modify header and body

String reqUrl = Url + “/search”;

HttpHeaders headers = new HttpHeaders();
headers.add(“Authorization”, sessionKey);

MultiValueMap<String, String> postParams = new LinkedMultiValueMap<String, String>();
postParams.add(“search”, searchKey);  //body 조작

HttpEntity<MultiValueMap<String, String>> requestEntity
= new HttpEntity<MultiValueMap<String, String>>(postParams, headers);

result = restTemplate.exchange(reqUrl , HttpMethod.POST, requestEntity,    String.class).getBody();

Async Post

using execute – implement third parameter- RequestCallback, 4th – ResponseExtractor

then, called ResponseExtractor’s extractData method asynclonously.

//RequestCallback – doWithRequest  implemementation

static class RestRequestCallBack implements RequestCallback {

private String sessionKey;
private String searchKey;

private RestRequestCallBack(String sessionKey, String searchKey){
this.sessionKey = sessionKey;
this.searchKey = searchKey;

}
public void doWithRequest(ClientHttpRequest clientHttpRequest) throws IOException {
HttpHeaders request = clientHttpRequest.getHeaders();

request.add(“Authorization”, sessionKey);

request.add( “Accept”, “application/json” );

String search = “search=”+ searchKey;
byte searchbyte[] = search.getBytes();
clientHttpRequest.getBody().write(searchbyte, 0, searchbyte.length);
}
}
//ResponseExtractor -extractData  implemementation
private static class FileResponseExtractor implements ResponseExtractor<Object>
{
private final File file;
private       File file () { return this.file; }

private FileResponseExtractor ( File file )
{
this.file = file;
}

@Override
public Object extractData ( ClientHttpResponse response ) throws IOException
{
InputStream  is = response.getBody();
OutputStream os = new BufferedOutputStream( new FileOutputStream( file()));

IOUtils.copyLarge( is, os );
IOUtils.closeQuietly( is );
IOUtils.closeQuietly( os );

return null;
}
}

public String searchAsync(String sessionKey, String searchKey) {

Object result = null;

String reqUrl = Url + “/search”;

String downloadDir = “D:\\”;
String fileName = “mysearch.log”;
try {
result = restTemplate.execute(reqUrl,
HttpMethod.POST,
new RestRequestCallBack(sessionKey, searchKey),
new FileResponseExtractor( new File( downloadDir, fileName )));

} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();

}

return null;
}

—— execute test code async code——-
searchKey = “http 80”;
sessionKey = client.getSession(user, password);
client.searchAsync(sessionKey, searchKey);

HTTP method RestTemplate methods
DELETE delete(java.lang.String, java.lang.Object...)
GET getForObject(java.lang.String, java.lang.Class, java.lang.Object...)
getForEntity(java.lang.String, java.lang.Class, java.lang.Object...)
HEAD headForHeaders(java.lang.String, java.lang.Object...)
OPTIONS optionsForAllow(java.lang.String, java.lang.Object...)
POST postForLocation(java.lang.String, java.lang.Object, java.lang.Object...)
postForObject(java.lang.String, java.lang.Object, java.lang.Class, java.lang.Object...)
PUT put(java.lang.String, java.lang.Object, java.lang.Object...)
any exchange(java.lang.String, org.springframework.http.HttpMethod, org.springframework.http.HttpEntity, java.lang.Class, java.lang.Object...)
execute(java.lang.String, org.springframework.http.HttpMethod, org.springframework.web.client.RequestCallback, org.springframework.web.client.ResponseExtractor, java.lang.Object...)

 

[Spring] Start Spring

class작성, bean 작성 법에 대해 친절히 나와 있다.

아래 사이트를 참고한다.

http://wiki.dev.daewoobrenic.co.kr/mediawiki/index.php/EDU_USER_DEV

 

개발 화면

사용자 등록 사용자 수정 사용자 상세보기 사용자 목록보기

[편집] 개발 순서

[편집] MODEL

  • MODEL 클래스 작성, JavaBeans 스펙에 맞게 getter/setter 작성.

[편집] SQL(SQLMAP XML)

  • SQL 문이 담긴 XML 파일 작성하고, SQL CONFIG XML(sqlmap-config.xml) 파일에 정의

[편집] DAO

  • XML에 있는 statement 호출하는 DAO 클래스 작성
  • JCF의 BaseSqlMapClientDao 상속받도록 작성.
  • executeQueryForObject / executeQueryForList / executeUpdate
  • Spring Context XML에 DAO 모듈 정의.(SqlMapClient를 프라퍼티로 가지도록 함.)

[편집] SERVICE

  • Service 클래스 작성하여 비즈니스 로직 구현
  • 호출하는 DAO 모듈을 맴버 프라퍼티로 두고 setter 메소드 구현.
  • Spring Context XML에 작성된 SERVICE 모듈 정의.(DAO 모듈을 프라퍼티로 가지도록 함.)

[편집] ACTION

  • Action 클래스 작성
  • 호출하는 SERVICE 모듈을 맴버 프라퍼티로 두고 setter 메소드 구현.
  • STRUTS XML(struts.xml) 파일에 액션 정의.

[편집] JSP

  • 화면 작성.(< s:property>, < s:iterator>, < s:textfield>, < s:select>)

 

[편집] 테이블 스키마

  • 사용자 아이디와 이름, 주소 값을 가지는 테이블 작성(오라클 기준, HSQLDB는 VARCHAR2를 VARCHAR로 변경.)
CREATE TABLE USERS(
	ID VARCHAR2(20) PRIMARY KEY,
	NAME VARCHAR2(20),
	ADDRESS VARCHAR2(50)
)

[편집] 모델의 작성

  • 모델 클래스를 만들고 attribute 선언(attribute는 private 변수 선언)
  • getter/setter 메소드를 구현(JavaBeans 스펙 기준)
public class User {
	private String id;
	private String name;
	private String address;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

[편집] SQL작성(SQL MAP XML)

  • User.XML 파일 생성하고 ibatis의 statement를 작성.
  • < typeAlias /> 를 사용하여 모델클래스의 별칭으로 사용(선택사항).
  • < resultMap /> 을 사용하여 DB 컬럼과 모델클래스 프라퍼티간의 이름 및 타입 매핑(선택사항).
  • QUERY의 파라미터로 전달된 값은 #를 사용하여 참조(예 : #name# ).
<sqlMap namespace="user">			
	<typeAlias alias="user" type="sample.user.model.User"/>

	<resultMap id="user-resultMap" class="user" >
		<result property="id" column="id"/>
		<result property="name" column="name"/>
    		<result property="address" column="address"/>	
	</resultMap>	

	<statement id="createUser" parameterClass="user" >
		INSERT INTO USERS( id, name, address) VALUES(#id#, #name#, #address#)
	</statement>

	<statement id="findUser" parameterClass="string" resultMap="user-resultMap" >
		SELECT id, name, address FROM USERS WHERE id = #id#
	</statement>

	<statement id="findUsers" resultMap="user-resultMap" >
		SELECT  id, name, address FROM USERS
	</statement>	

	<statement id="updateUser" parameterClass="user">
		UPDATE USERS SET name = #name#, address =#address# WHERE id = #id#
	</statement>

	<statement id="deleteUser" parameterClass="string">
		DELETE FROM USERS WHERE id = #id#
	</statement>		
</sqlMap>
  • 작성된 SQLMAP XML 파일은 SQLMAP CONFIG XML 파일에 정의해준다.
<sqlMapConfig>
	<settings cacheModelsEnabled="true" />

	<sqlMap resource="sample/user/dao/sqlmap/User.xml" />
</sqlMapConfig>

[편집] DAO 작성

  • jcf.dao.ibatis.BaseSqlMapClientDAO 상속(인터페이스 구현은 선택).
  • executeUpdate(String statementId, Object param)
    • INSERT/UPDATE/DELETE 등 DML 문 QUERY에 사용
    • statementId는 SQLMAP에 작성된 statment의 ID를 지칭하며, 실행항 QUERY를 지정.
    • param은 생행할 QUERY에서 사용할 파라미터(없는 경우 null을 넘겨준다).
  • executeQueryForObject(String statementId, Object param)
    • SELECT 문 실행시 사용하며, 한건의 결과만 가져올 때 사용.
  • executeQueryForObject(String statementId, Object param)
    • SELECT 문 실행시 사용하며, 한건 이상의 결과를 가져올 때 사용.
public class UserDaoImpl extends BaseSqlMapClientDAO implements UserDao {

	public void createUser(User user) {
		executeUpdate("createUser", user);
	}

	public User findUser(String id) {
		User user = (User) executeQueryForObject("findUser", id);
		return user;
	}

	public List findUsers() {
		List usecaseList = executeQueryForList("findUsers", null);
		return usecaseList;
	}

	public void updateUser(User user) {
		executeUpdate("updateUser", user);
	}

	public void deleteUser(String id) {
		executeUpdate("deleteUser", id);
	}

	public List findUsers(HashMap searchCondition) {
		List list = executeQueryForList("findUsers", null);
		return list;
	}
}
  • 작성된 DAO 클래스는 Spring 프레임워크에 빈정의를 해둔다.(applicationContext-user.xml)
  • 이때 SQLMAP CLIENT(sqlMapClient)를 프라퍼티로 가지도록 설정한다.
<beans ..>
	<bean id="userDao" class="sample.user.dao.UserDaoImpl">
		<property name="sqlMapClient" ref="sqlMapClient" />
	</bean>
</beans>

[편집] SERVICE 개발

  • 서비스 클래스를 만들고, 비즈니스 메소드를 구현한다.
  • 호출할 USER DAO를 맴버 프라퍼티로 선언하고 setter 메소드를 구현한다.
public class UserServiceImpl implements UserService {

	private UserDao userDao;

	public void setUserDao(UserDao dao) { this.userDao = dao; }

	public void createUser(User user) {
		userDao.createUser(user);
	}

	public List findUsers() {
		return userDao.findUsers();
	}

	public User findUser(String userId) {
		User user = userDao.findUser(userId);
		return user;
	}

	public void deleteUser(String userId) {
		userDao.deleteUser(userId);
	}

	public void updateUser(User user) {
		userDao.updateUser(user);
	}
}
  • 작성된 SERVICE 클래스는 Spring 프레임워크에 빈정의를 추가한다.(applicationContext-user.xml)
  • 이때 DI(Dependency Injection)할 dao(UserDao)를 프라퍼티로 가지도록 설정한다.
  • < property 태그의 name 속성은 SERVICE 클래스의 맴버 변수이름이고, ref는 참조할 dao 클래스 빈 정의의 id(혹은 name)이다.
<beans ..>
	<bean id="userService" class="sample.user.service.UserServiceImpl">
		<property name="userDao" ref="userDao" />
	</bean>

	<bean id="userDao" class="sample.user.dao.UserDaoImpl">
		<property name="sqlMapClient" ref="sqlMapClient" />
	</bean>
</beans>

[편집] ACTION 작성

  • jcf.web.struts2.action.BaseAction을 상속한다.
  • UI로 부터 파라미터로 받거나, UI로 전달할 객체들을 맴버 프라퍼티로 선언하고 getter/setter를 만든다.
  • 호출할 SERVICE 클래스들을 맴버 프라퍼티로 선언하고 setter 메소드를 만든다.
public class UserAction extends BaseAction {
	/* ******************************** PROPERTIES ******************************* */
	private User user;
	private List userList;

	private UserService userService;

	/* ******************************** ACTION METHODS ******************************* */
	public String addUser() {
		return SUCCESS;
	}

	public String saveUser() {
		User checkUser = userService.findUser(user.getId());
		if (checkUser == null)
			userService.createUser(user);
		else
			userService.updateUser(user);

		return SUCCESS;
	}

	public String findUser() {
		user = userService.findUser(user.getId());
		return SUCCESS;
	}

	public String findUsers() {
		userList = userService.findUsers();
		return SUCCESS;
	}

	public String deleteUser() {
		userService.deleteUser(user.getId());
		return SUCCESS;
	}

	/* ******************************** GETTER & SETTER ******************************* */
	public User getUser() {return user;}

	public void setUser(User user) {this.user = user;}

	public List getUserList() {return userList;}

	public void setUserList(List userList) {this.userList = userList;}

	public UserService getUserService() {return userService;}

	public void setUserService(UserService userService) {this.userService = userService;}
  • 작성된 액션 클래스의 액션 메소드에 대한 STRUTS XML 파일을 작성한다.(struts-user.xml)
  • 패키지의 이름/상속/네임스페이스를 조심해서 작성한다.
    • 패키지 명은 유일해야 한다.
    • 기본적으로 srtust-default를 상속하도록 한다.
    • 네임스페이스는 유일할 필요는 없지만, 액션 호출 URL에 영향을 미치므로 기본적으로 패키지 명과 동일하게 준다.
<struts>
	<package name="user" extends="struts-default" namespace="/user">
		<action name="addUser" class="sample.user.action.UserAction" method="addUser">
			<result>/public/user/editUser.jsp</result>
		</action>

		<action name="saveUser" class="sample.user.action.UserAction" method="saveUser">
			<result type="chain">findUsers</result>
		</action>

		<action name="findUser" class="sample.user.action.UserAction" method="findUser">
			<result>/public/user/findUser.jsp</result>
		</action>

		<action name="editUser" class="sample.user.action.UserAction" method="findUser">
			<result>/public/user/editUser.jsp</result>
		</action>

		<action name="findUsers" class="sample.user.action.UserAction" method="findUsers">
			<result>/public/user/findUsers.jsp</result>
		</action>

		<action name="deleteUser" class="sample.user.action.UserAction" method="deleteUser">
			<result type="redirect">/user/findUsers.action</result>
		</action>
	</package>

</struts>

[편집] JSP 작성

[편집] 작성/편집 화면(editUser.jsp)

  • 스트럿츠 2 태그를 사용하기 위해서 taglib 작성한다.
  • < s:property value=“변수”/> : 변수는 액션 클래스에서 맴버 프라퍼티로 가지고 있는 객체이다.
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<html>
<head>
<link rel='stylesheet' href='<%= request.getContextPath() %>/css/style.css'>
<s:head theme='simple' />
<SCRIPT language='JavaScript' type='text/javascript'>
	function submit()
	{
		document.userForm.submit();
		return; 
	}
	</SCRIPT>
</head>
<body>
<h1>사용자 생성/수정</h1>
<s:form name='userForm' action='saveUser' theme='simple'>
	<table cellpadding='3' cellspacing='0' border='1'>
		<tr>
			<td width='100' align='left'>아이디</td>
			<td width='200'><s:textfield name='user.id' /></td>
		</tr>
		<tr>
			<td width='100' align='left'>이름</td>
			<td width='200'><s:textfield name='user.name' /></td>
		</tr>
		<tr>
			<td width='100' align='left'>주소</td>
			<td width='200'><select name="user.address">
				<option value="seoul">SEOUL</option>
				<option value="inchen">INCHEN</option>
				<option value="pusan">PUSAN</option>
			</select></td>
		</tr>
	</table>
</s:form>
<a href='javascript:submit()'>저장</a>
<a href='<%= request.getContextPath() %>/user/findUsers.action'>목록</a>
</body>
</html>

[편집] 리스트 화면(findUsers.jsp)

  • 스트럿츠 2 태그를 사용하기 위해서 taglib 작성한다.
  • < s:iterator value=“리스트형 변수”/> : 리스트의 개수만큼 반복 처리.
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@taglib uri="/WEB-INF/tld/app.tld" prefix="app" %>
<html>
<head>
<link rel='stylesheet' href='<%= request.getContextPath() %>/css/style.css'>
</head>

<body>
<h1>사용자 조회</h1>
<table cellpadding="3" cellspacing="0" border="1" width="250">
    <tr>
        <td align="center">아이디</td>
        <td align="center">이름</td>
        <td align="center">주소</td>    
    </tr>

    <s:iterator value="userList">
        <tr>
            <td>
                <a href="<s:url action="findUser"><s:param name="user.id" value="id"/></s:url>">
                      <s:property value="id"/>
                </a>
            </td>
            <td><s:property value="name"/></td>  
       <td><s:property value="address"/></td>

        </tr>
    </s:iterator>
</table>
<br/>
<a href="<%= request.getContextPath() %>/user/addUser.action">등록</a>
</body>
</html>

[편집] 상세 조회 화면(findUser.jsp)

  • 스트럿츠 2 태그를 사용하기 위해서 taglib 작성한다.
  • < s:textfield name=“parameter 변수명”/>
    • 변수값이 있으면 자동으로 값을 뿌려주고 없는 경우 공란으로 처리
    • 이 값은 submit 되는 순간 해당 모델의 attribute에 동일 이름에 값을 set 하게 된다.
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<html>
<head><link rel='stylesheet' href='<%= request.getContextPath() %>/css/style.css'></head>

<body>
<h1>사용자 정보</h1>
<table cellpadding="3" cellspacing="0" border="1">
		<tr>
			<td width=100 align="left">아이디</td>
			<td width=200><s:property value="user.id"/></td>
		</tr>
		<tr>
			<td width=100 align="left">이름</td>
			<td width=200><s:property value="user.name"/></td>
		</tr>		  
		<tr>
			<td width=100 align="left">주소</td>
			<td width=200><s:property value="user.address"/></td>
		</tr>		
</table>
<br/>

<a href="<%= request.getContextPath() %>/user/editUser.action?user.id=${user.id}">
수정</a>&nbsp;&nbsp;&nbsp;
<a href="<%= request.getContextPath() %>/user/findUsers.action">목록</a>&nbsp;&nbsp;&nbsp;
<a href="<%= request.getContextPath() %>/user/deleteUser.action?user.id=${user.id}">삭제</a>
</body>
</html>

[초간단 이미지 파일 뷰어]

import javax.swing.*;

class Foo {
public static void main(String args[]) {

if (args.length == 0) {
System.err.println(“Input Image file name…”);
System.exit(1);
}

JFrame oJFrame        = new JFrame(“그림 보기 예제”);
ImageIcon oImageIcon  = new ImageIcon(args[0]);
JLabel oJLabel        = new JLabel(oImageIcon);

oJFrame.add(oJLabel);
oJFrame.pack();
oJFrame.setVisible(true);
oJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

실행방법

컴파일을 한 후, 도스창에서
java Foo photoshop_apples.jpg
이렇게 실행시킵니다. 그러면 GUI 창이 뜹니다.

만약 파일명에 공백이 있다면
java Foo “photoshop apples.jpg”

출처: http://mwultong.blogspot.com/2006/11/java-jpg-gif-png-image-file-viewer.html

[java 기초] create text file

import java.io.*;

public class TextWrite {
public static void main(String args[]) {

try {
////////////////////////////////////////////////////////////////
BufferedWriter out = new BufferedWriter(new FileWriter(“out.txt”));
String s = “출력 파일에 저장될 이런 저런 문자열입니다.”;

out.write(s); out.newLine();
out.write(s); out.newLine();

out.close();
////////////////////////////////////////////////////////////////
} catch (IOException e) {
System.err.println(e); // 에러가 있다면 메시지 출력
System.exit(1);
}

}
}

 

결과

생성된 out.txt 파일의 내용:
출력 파일에 저장될 이런 저런 문자열입니다.
출력 파일에 저장될 이런 저런 문자열입니다.

 

참고 http://mwultong.blogspot.com/2006/10/java-text-file-write.html