예를들어 Bean 클래스를 만들었는데 toString 메소드를 만들어서 출력하게 하고싶다고 치자 어떻게 해야할까?

뭐 가장 쉬운 방법은 get 메소드를 하나하나 호출해서 붙혀서 알맞게 출력하는 방법이겠지만, 그게 답이라면 이글을 쓸필요도 없겠다.

정말 간단한 답이 있었다.
일단 아파치 자카르타 프로젝트의 Commons Lang 에서 제공하는 API 를 이용하여 메소드들을 쉽게 구현할수 있다.
이 라이브러리는 toString 말고도 equals,hashCode 도 쉽게 만드는 방법을 제공한다.

BaseObject 라는 클래스를 아래와같이 만들어서 모든 Bean 클래스에 적용해 주면된다.



- BaseObject.java

[code]package dic.model;

import java.io.Serializable;

import org.apache.commons.lang.builder.*;

@SuppressWarnings("serial")
public class BaseObject implements Serializable {
 public String toString() {
  return ToStringBuilder.reflectionToString(this,ToStringStyle.MULTI_LINE_STYLE);
 }
  public boolean equals(Object o) {
  return EqualsBuilder.reflectionEquals(this, o);
 }
 
 public int hashCode() {
  return HashCodeBuilder.reflectionHashCode(this);
 }
}[/code]

- Member.java

[code]package dic.model;

import java.util.Date;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

import dic.member.MemberManager;

public class Member extends BaseObject implements HttpSessionBindingListener{
 private String id;
 private String password;
 private String name;
 private String auth_id_list;
 private String file_id_list;
 private Date reg_date;

 public String getId() {
  return id;
 }
 public void setId(String s) {
  id = s;
 }
 
 public String getPassword() {
  return password;
 }
 public void setPassword(String s) {
  password = s;
 }
 
 public String getName() {
  return name;
 }
 public void setName(String s) {
  name = s;
 }
 
 public String getAuthIdList() {
  return auth_id_list;
 }
 public void setAuthIdList(String s) {
  auth_id_list = s;
 }
 
 public String getFileIdList() {
  return file_id_list;
 }
 public void setFileIdList(String s) {
  file_id_list = s;
 }
 
 public Date getRegDate() {
  return reg_date;
 }
 public void setRegDate(Date d) {
  reg_date = d;
 }
 
 // 세션에 입력될때
 public void valueBound(HttpSessionBindingEvent event) {
  MemberManager.getInstance().doLogin(this);
 }
 // 세션에서 제거될때
 public void valueUnbound(HttpSessionBindingEvent event) {
  MemberManager.getInstance().doLogout(this);
 }
 
 public static void main(String args[]) {
  Member m = new Member();
  m.setId("cranix");
  m.setPassword("1234");
  m.setName("크래닉스");
  System.out.println(m);
 }
}[/code]


 - 실행결과

dic.model.Member@8813f2[
  id=cranix
  password=1234
  name=크래닉스
  auth_id_list=<null>
  file_id_list=<null>
  reg_date=<null>
]


' > Spring' 카테고리의 다른 글

Spring jsp 예외처리 전략  (20) 2007.05.30
Spring 의 exception 처리 전략  (26) 2007.05.29
클래스의 toString 및 equals 메소드 자동으로 만들어주기.  (47) 2007.05.26
기본 Controller 지정하기.  (23) 2007.05.24
SPRING  (25) 2007.02.28
JSTL 사용하기  (28) 2007.02.28
by cranix 2007.05.26 01:10

- springapp-servlet.xml

[code]<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<!--  - Application context definition for "springapp" DispatcherServlet.  -->
<beans>
 <bean id="defaultController" class="dic.controllers.DefaultController"/>
    <bean id="helloController" class="dic.controllers.HelloController"/>
   
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">           
             <props>
              <prop key="**/*.do">defaultController</prop>
              <prop key="/hello.do">helloController</prop>
             </props>
            </property>
    </bean>
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>[/code]


- DefaultController.java

[code]package dic.controllers;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;

public class DefaultController extends DicSuperController {

 @Override
 ModelAndView dicHandleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
  String contextPath = request.getContextPath();
  String uri = request.getRequestURI();
  String viewName = uri.substring(contextPath.length()+1,uri.lastIndexOf("."));

  return new ModelAndView(viewName);
 }

}[/code]



위와같이 셋팅하면 지정되지 않은 Controller 는 기본으로 DefaultController 로 지정되어 처리되게 된다.

' > Spring' 카테고리의 다른 글

Spring 의 exception 처리 전략  (26) 2007.05.29
클래스의 toString 및 equals 메소드 자동으로 만들어주기.  (47) 2007.05.26
기본 Controller 지정하기.  (23) 2007.05.24
SPRING  (25) 2007.02.28
JSTL 사용하기  (28) 2007.02.28
hello spring 테스트  (19) 2007.02.27
by cranix 2007.05.24 22:22

- url 을 바꾸지않고 jsp 경로 변경하기
  - springapp-servlet.xml 파일에 아래와같이 추가하면 jsp 가 불러질때(컨트롤러에서) 앞과 뒤에 자동으로 붙어서 넘어가게 설정할수 있다.

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>
        <property name="prefix"><value>/jsp/</value></property>
        <property name="suffix"><value>.jsp</value></property>
    </bean>

  - 이와같이 설정하면 Controller 에서도 아래와같이 변경해 줘야한다.


package cranix.framework;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class SpringappController implements Controller {
 public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
  // TODO Auto-generated method stub
  String now = (new java.util.Date()).toString();
  return new ModelAndView("hello","now",now);
 }
}

 - 원래는 hello.jsp 였으나 앞과 뒤에 /jsp/ , .jsp 가 각각 붙기때문에 그냥 hello 만 써주어도 된다.

  --> 처음에는 beans 에 선언되어있는 빈 들이 독립적으로 쓰이는 것인줄 알았으나 해보니 서로의 기능이 병합되어서 프로그램에 반영되는것을 알았다. 일종의 플러그인 같은걸로 이해하면 되겠다.
 


- 간단한 모델 사용하기
  - 테스트를위해 아래 두 클래스를 만든다.
    - Product.java

package cranix.framework;
import java.io.Serializable;
public class Product implements Serializable {
 private String description;
 private Double price;
 public void setDescription(String s) {
  description = s;
 }
 public String getDescription() {
  return description;
 }
 public void setPrice(Double d) {
  price = d;
 }
 public Double getPrice() {
  return price;
 }
}

    - ProductManager.java

package cranix.framework;
import java.io.Serializable;
import java.util.List;
public class ProductManager implements Serializable {
 private List products;
 public void setProducts(List p) {
  products = p;
 }
 public List getProducts() {
  return products;
 }
}

  - 컨트롤러를 아래와같이 변경한다.


package cranix.framework;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class SpringappController implements Controller {
 private ProductManager pm =null;
 
 public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
  // TODO Auto-generated method stub
  String now = (new java.util.Date()).toString();
  Map myModel = new HashMap();
  myModel.put("now", now);
  myModel.put("products", getProductManager().getProducts());
 
  return new ModelAndView("hello","model",myModel);

 }
 
 public void setProductManager(ProductManager pm) {
  this.pm = pm;
 }
 public ProductManager getProductManager() {
  return this.pm;
 }
}

    --> ModelAndView 클래스의 이름이 왜 모델과 뷰 인지 이제야 이해가 간다.


  - springapp-servlet.xml 파일을 아래와같이 변경한다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<!--  - Application context definition for "springapp" DispatcherServlet.  -->
<beans>
    <bean id="springappController" class="cranix.framework.SpringappController">
     <property name="productManager">
      <ref bean="prodMan"/>
     </property>
    </bean>
    <bean id="prodMan" class="cranix.framework.ProductManager">
     <property name="products">
      <list>
       <ref bean="product1"/>
       <ref bean="product2"/>
       <ref bean="product3"/>
      </list>
     </property>
    </bean>
    <bean id="product1" class="cranix.framework.Product">
     <property name="description"><value>Lamp</value></property>
     <property name="price"><value>12.34</value></property>
    </bean>
    <bean id="product2" class="cranix.framework.Product">
     <property name="description"><value>테스트</value></property>
     <property name="price"><value>22.12</value></property>
    </bean>
    <bean id="product3" class="cranix.framework.Product">
     <property name="description"><value>ABC</value></property>
     <property name="price"><value>234.22</value></property>
    </bean>

    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">           
             <props>               
              <prop key="/hello.sdo">springappController</prop>           
             </props>       
            </property>   
    </bean>
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>
        <property name="prefix"><value>/jsp/</value></property>
        <property name="suffix"><value>.jsp</value></property>
    </bean>
</beans>

  - 설정파일에서 직접 파라메터를 셋팅하는 화면이다.
     클래스의 set 메소드들을 property 태그로 셋팅할수 있다.


 참조 : http://www.springframework.org/docs/MVC-step-by-step/Spring-MVC-step-by-step-Part-2.html

' > Spring' 카테고리의 다른 글

클래스의 toString 및 equals 메소드 자동으로 만들어주기.  (47) 2007.05.26
기본 Controller 지정하기.  (23) 2007.05.24
SPRING  (25) 2007.02.28
JSTL 사용하기  (28) 2007.02.28
hello spring 테스트  (19) 2007.02.27
스프링 프레임워크 공식 홈페이지  (16) 2007.02.26
by cranix 2007.02.28 10:57
el, JSP, jstl
JSTL ( JSP Tag Library )

일반적으로 사용하는 JSP 태그를 표준화 시킨건데 아래 것들이 많이 사용된다.

CORE  ::  http://java.sun.com/jstl/core   ::  c
XML    ::  http://java.sun.com/jstl/xml    ::  x
I18N     ::  http://java.sun.com/jstl/fmt     :: fmt
SQL     ::  http://java.sun.com/jstl/sql     ::  sql

예) <%@ taglib prefix="c"  uri="http://java.sun.com/jstl/core"  %>

위와같이 JSP 파일에 선언해주면 되는데 하기전에 라이브러리 파일과 tld 파일을 설치해 줘야한다.

- JSTL 설치하기

1. JSTL 다운로드

JSTL 은 아래 두사이트에서 다운로드 할수있다.
  --> 여기서 다운로드를 해봤는데 모든 툴들이 하나로 통합되어 진거 같다.
        JSTL 만 따로 받고싶은 나로선 별로 내키진 않았다.

2) http://apache.org 
  --> 여기서는 jakarta-taglibs-standard-1.1.2.zip 파일을 받으면 된다.


2. 설치
  - WEB-INF/lib 디렉토리에 jstl.jar 와 standard.jar 파일을넣는다.
  - WEB-INF/tld 에다가 tld 폴더를 복사한다.

3. WEB.XML 설정
  --> 처음에 uri="http://java.sun.com/jstl/core" 라고 쓰는걸 보고 sun 에서 해당 url 을 지원해 주는줄 알았으나 그게 아니고 WEB.xml 파일에 아래와같이 설정해 줘야지 쓸수 있는것이다.

             <taglib>
                           <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
                           <taglib-location>/WEB-INF/tld/c.tld</taglib-location>
             </taglib>
 
             <taglib>
                          <taglib-uri>http://java.sun.com/jstl/xml</taglib-uri>
                          <taglib-location>/WEB-INF/tld/x.tld</taglib-location>
             </taglib>
 
             <taglib>
                           <taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
                          <taglib-location>/WEB-INF/tld/fmt.tld</taglib-location>
             </taglib>

4. JSP 선언
  --> 위에서 말한것처럼 JSP 파일에는 아래와같이 선언해주면 된다.
<%@ taglib prefix="c"  uri="http://java.sun.com/jstl/core"  %>



- EL(expression language) 내장객체
 
pageScope  ::  page 범위에 포함된 속성 값에 접근
requestScope  ::  request 범위에 포함된 속성값에 접근
sessionScope ::  session 범위에 포함된 속성값에 접근
applicationScope  ::  application 범위에 포함된 속성값에 접근
param  ::  request.getParameter("aa")와 동일한 기능. 사용은  $(param.aa)
paramValues  ::  request.getParameterValues의 기능. $(paramValues.aa)
header  ::  request.getHeader('aa") 와 동일.  $(header.aa)
headerValues  ::  request.getHeaderValues("aa")와 동일 $(headerValues.aa)
initParam  ::  컨텍스트의 초기화 파라미터값
cookie  ::  쿠키 정보에 접근
pageContext  :: PageContext 객체


참조 : http://blog.empas.com/zeroscience/17279705

' > Spring' 카테고리의 다른 글

기본 Controller 지정하기.  (23) 2007.05.24
SPRING  (25) 2007.02.28
JSTL 사용하기  (28) 2007.02.28
hello spring 테스트  (19) 2007.02.27
스프링 프레임워크 공식 홈페이지  (16) 2007.02.26
Spring 프레임 워크북  (17) 2007.02.26
by cranix 2007.02.28 10:36

HELLO SPRING 테스트


1. SPRING 을 위한 환경설정
  - WEB-INF/lib 디렉토리를 만들고 dist/spring.jar 파일을 넣는다.
    --> Hello Spring 만을 찍기위함 이기때문에 딴건 다 필요없고 spring.jar 파일만 있으면 된다.

2. SPRING 의 WEB.XML 파일설정
  - web.xml 파일에 추가


    <servlet>
        <servlet-name>springapp</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springapp</servlet-name>
        <url-pattern>*.sdo</url-pattern>
    </servlet-mapping>

    --> 위와같이 설정법은 스트러츠의 그것과 동일하다.


3. SPRING 의 설정파일
  - springapp-servlet.xml 파일


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<!--  - Application context definition for "springapp" DispatcherServlet.  -->
<beans>
    <bean id="springappController" class="cranix.framework.SpringappController"/>
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">           
             <props>               
              <prop key="/hello.sdo">springappController</prop>           
             </props>       
            </property>   
    </bean>
</beans>


    --> 1에서 servlet-name 이 springapp 로 되어있다면 설정파일은 WEB-INF/springapp-servlet.xml 이된다.
    --> 이런형태면 각 맵핑마다 컨트롤러를 따로 지정할수 있을꺼같다.
    --> API 를 잠깐 확인해봤을때 기본 컨트롤러 들이 있었는데 그런것들을 좀더 공부해봐야겠다.

4. 실행
  - http://localhost:8080/appname/hello.sdo 실행
    --> 만약 실행했는데 dtd 파일을 못찾는다고 오류가나면 2번의 설정파일에서 "http://www.springframework.org/dtd/spring-beans-2.0.dtd" 로 바꾼후 실행한다.


참고 : http://www.springframework.org/docs/MVC-step-by-step/Spring-MVC-step-by-step-Part-1.html

' > Spring' 카테고리의 다른 글

SPRING  (25) 2007.02.28
JSTL 사용하기  (28) 2007.02.28
hello spring 테스트  (19) 2007.02.27
스프링 프레임워크 공식 홈페이지  (16) 2007.02.26
Spring 프레임 워크북  (17) 2007.02.26
Spring Framework 레퍼런스  (23) 2007.02.26
by cranix 2007.02.27 14:08
스프링 프레임워크 공식 홈페이지

http://www.springframework.org/

' > Spring' 카테고리의 다른 글

SPRING  (25) 2007.02.28
JSTL 사용하기  (28) 2007.02.28
hello spring 테스트  (19) 2007.02.27
스프링 프레임워크 공식 홈페이지  (16) 2007.02.26
Spring 프레임 워크북  (17) 2007.02.26
Spring Framework 레퍼런스  (23) 2007.02.26
by cranix 2007.02.26 15:42
박재성 | 한빛미디어 | 2006년 01월 31일
책소개 무거운 EJB 아키텍처에서 벗어나 가벼운 Spring의 세계로 빠져보자!Spring은 EJB 아키텍처를 대신할 수 있는 강력한 프레임워크이지만, EJB처럼 개발자를 머리 아프게 할 정도로 무겁지 않다. 엔터프라이즈급 개...

Craig Walls,Ryan Breidenbach | Independent Pub Group | 2004년 12월 31일



스프링 인 액션 책은 어디서 구해야할라나...

' > Spring' 카테고리의 다른 글

SPRING  (25) 2007.02.28
JSTL 사용하기  (28) 2007.02.28
hello spring 테스트  (19) 2007.02.27
스프링 프레임워크 공식 홈페이지  (16) 2007.02.26
Spring 프레임 워크북  (17) 2007.02.26
Spring Framework 레퍼런스  (23) 2007.02.26
by cranix 2007.02.26 15:14

스프링 프레임워크 레퍼런스

http://openframework.or.kr/framework_reference/spring/ver1.2.2/html_single/#introduction

' > Spring' 카테고리의 다른 글

SPRING  (25) 2007.02.28
JSTL 사용하기  (28) 2007.02.28
hello spring 테스트  (19) 2007.02.27
스프링 프레임워크 공식 홈페이지  (16) 2007.02.26
Spring 프레임 워크북  (17) 2007.02.26
Spring Framework 레퍼런스  (23) 2007.02.26
by cranix 2007.02.26 15:12
| 1 2 |