Ajax - Debug Console 만들기

Published on: 2009. 11. 13. 01:40 by louis.dev

보통 Ajax 코딩을 하다 보면 값이 제대로 넘어왔는지 넘어 갔는지를 확인 하기 위해서는 alert()창을 이용해서 찍어야 하는데 이러한 방식은 항상 확인 버튼을 눌러줘야 하기 때문에 불편하다.

그렇기 때문에 log를 만드는 js파일을 생성하고 페이지 마다 다음을 추가하여 로그를 페이지에 남기면 좋다.

<head>테그 사이에
<script type="text/javascript" scr="ajaxLog.js 파일의 경로"></script>
라고 써주고
<body>테그 사이에
<div id="debugConsole"></div>태그를 넣어준다. 항상 id는 debugConsole이라고 정의해야 한다..ㅎㅎ

그리고 자바스크립트 영역에서 log function을 불러다가 쓰면 된다..
ex) log("버그 시작");

출처: 최범균의 Ajax programing

Spring - get방식일때 한글 깨질때 해결 방법

Published on: 2009. 10. 26. 17:22 by louis.dev
web.xml 파일에 uri encoding 설정하는 부분이 있다. 이는 보통 post방식의 인코딩을 지원하지만 get방식은 지원하지 않는다.
이럴때는 톰캣의 server.xml파일을 수정하면 된다.

Connector(두개가 있다.) 부분에 attribute부분에 URIEncoding="EUC-KR" 추가 하면 get방식의 한글 깨짐 현상을 없앨 수 있다

예)
<Connector connectionTimeout="20000" port="8989" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="EUC-KR"/>
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="EUC-KR"/>

JSP - JSP 페이지의 캐시 영역 날리기

Published on: 2009. 9. 20. 00:35 by louis.dev


가끔 플렉스로 프로그램을 짜거나 JFreeChart plugin으로 프로그램을 짤때 변경된 사항이 그때그때 바뀌지 않는 경우가 있다.

이는 각 브라우져에 캐시기능이 있기 때문에 변경된 내용의 XML데이터나 이미지 정보를 불러오지 않고 기존에 정보들을 가지고 있음으로 플렉스 차트의 XML같은경우에 아무리 변경해도 값이 플렉스에 반영되지 않는다..

이럴때는 다음과 같은 코드로 캐시의 영역을 초기화 해주며 XML파일 위쪽에 다음과 같이 선언한다.

 String httpVersion = request.getProtocol();
 if(httpVersion.equals("HTTP/1.0")){
    response.setDateHeader("Expires", 0);
    response.setHeader("Pragma", "no-cache");
 }
 else if(httpVersion.equals("HTTP/1.1")){
    response.setHeader("Cache-Control", "no-cache");
 }

 

Spring - Spring의 Controller들. 3.MultiActionController

Published on: 2009. 9. 13. 17:15 by louis.dev
<역할>
MultiActionController는 하나의 Controller클래스에서 여러가지 기능을 하는 method를 구현해 놓고 파라미터 값으로 넘어오는 어떠한 값과 MultiActionController에 구현한 method와의 이름을 비교해서 실행을 시킨다.
이 MultiActionContorller는 주로 비슷한 기능을 가진 method끼리 모아 쓸데 없이 클래스를 많이 생성해서 생길수 있는 class overhead를 줄여주는 방법이다.

<적용방법>
1. 일단 구현할 클래스를 MultiActionController를 확장해서 구현한다. method는 overriding을 할 필요 없고 사용자가 원하는 이름으로 구현하면 된다.
보통 리턴값은 ModelAndView로 리턴값을 정하지만 다른 Map,String,void를 선택적으로 사용할 수 있다. 그리고 전달 parameter들은 HttpServletRequest,HttpServletResponse를 사용한다.
예)protected ModelAndView read(HttpServletRequest request,HttpServletResponse response);
package kr.co.springboard.controllers;

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

import kr.co.springboard.dto.BoardDTO;
import kr.co.springboard.service.BoardService;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

public class ReadDeleteMultiActionController extends MultiActionController{
    private BoardService boardService;
    public void setBoardService(BoardService boardService) {
        this.boardService = boardService;
    }

    public ModelAndView boardRead(HttpServletRequest request,
                                  HttpServletResponse response){
        ModelAndView mnv = new ModelAndView();
        int seq = Integer.valueOf(request.getParameter("seq"));
        this.boardService.boardUpdateReadCount(seq);
        BoardDTO boardDto = this.boardService.boardRead(seq);
        mnv.addObject("boardDto",boardDto);
        mnv.setViewName("boardRead");
        return mnv;
       
    }
   
    public ModelAndView boardDelete(HttpServletRequest request,
                                    HttpServletResponse response){
        ModelAndView mnv = new ModelAndView();
        int seq = Integer.valueOf(request.getParameter("seq"));
        this.boardService.boardDelete(seq);
        mnv.setViewName("boardDeleteSuccess");
        return mnv;
    }
}
2.DI를 구현한 부분에 ParameterMethodNameResolver 를 구현하고 이것을 통해서 DI를 설정한다.
<bean id="readDeleteMultiActionController"
          class="kr.co.springboard.controllers.ReadDeleteMultiActionController"
          p:boardService-ref="boardService"
          p:methodNameResolver-ref="boardReadDeleteNameResolver"/>
    

<bean id="boardReadDeleteNameResolver"
          class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
     <property name="paramName" value="mode"/>
</bean>

이렇게 세팅해 주면 된다.
이렇게 세팅하면 주소창에
http://localhost/springboard/board.do?mode=
이렇게 입력한 뒤에 mode뒤에 자기가 실행하고 싶은 method를 입력하면 된다. 클래스의 boardRead ()를 실행하고 싶으면 mode=boardRead, boardDelete를 실행하고 싶으면 mode=boardDelete를 실행 하면 된다.
mode는 ParameterMethodNameResolver에서 property로 선언한 paramName에서 세팅한 것과 동일 한 것이어야 한다.

Spring - Spring의 Controller들. 2.SimpleFormController

Published on: 2009. 9. 13. 16:52 by louis.dev

<역할>
Controller의 이름에서도 알수 있다 시피 SimpleFormController는 입력받는 Form을 간단하게 만들어 줄수 있는 Controller 이다.
즉 입력과 수정창, 예를 들면 게시판의 글쓰기와 글 수정 창을 따로따로 만들 필요 없이 http get 으로 들어오면 글쓰기 창을 보여주고 글 정보를 쓸때(글쓰기,글 수정) http post 방식으로 들어올때는 글을 디비에 입력하는 이런 따로따로인 기능을 하나의 클래스로 구현하는 것이다.
그렇기 때문에 수정form과 입력form을 두가지 따로따로 만들 필요가 없는 것이다.

<사용방법>
SimpleFormController를 사용하기 위해서는 이 클래스를 상속 받아서 써야 한다. SimpleFormController를 사용하게 되면 formBackingObject() method와 onSubmit() 메소드를 overriding 해서 사용할 수 있다.

게시판에서 예를 들어 보면
게시판에 글을 쓰는 폼을 보여주거나, 게시판의 글을 수정하는 폼을 보여주는 것을 simpleFormController로 구현한다고 하자.
글쓰기나 수정 둘다 form을 요청할때는 get 방식을 사용할 것이다.(왜냐 하면 URL을 통해 form에 접근하기 때문이다)
그리고 사용자로 부터 글을 쓴 정보, 혹은 수정한 정보들은 post 방식으로 컨트롤러에 접근할 것이다.
이때 formBackingObject() method 는 get방식으로 접근할때 실행 되고 onSubmit() method는 post방식으로 데이터가 넘어올때 실행이 된다.
그림으로 보면



다음과 같은 실행 루틴을 거친다.

1. 사용할 클래스에 SimpleFormController를 상속 받아 formBackingObject() 와 onSubmit()를 override 한다.
package kr.co.springboard.controllers;

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

import kr.co.springboard.dto.BoardDTO;
import kr.co.springboard.service.BoardService;

import org.springframework.validation.BindException;
import org.springframework.web.bind.ServletRequestUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;

public class WriteSimpleFormController extends SimpleFormController {
    private BoardService boardService;
    public void setBoardService(BoardService boardService) {
        this.boardService = boardService;
    }

   
   
    @Override
    protected Object formBackingObject(HttpServletRequest request)
                                       throws Exception {
        int seq = ServletRequestUtils.getIntParameter(request, "seq", 0);
        BoardDTO boardDto = null;
        if(seq == 0){
            boardDto = new BoardDTO();
        }else if(seq > 0){
            boardDto = this.boardService.boardRead(seq);
        }
        return boardDto;
    }



    @Override
    protected ModelAndView onSubmit(HttpServletRequest request,
                                    HttpServletResponse response,
                                    Object command, BindException errors)
                                    throws Exception {
        ModelAndView mnv = new ModelAndView();
        BoardDTO dto = (BoardDTO)command;
        if(dto.getSeq() == 0){
            boardService.boardInsert(dto);
        }else{
            boardService.boardUpdate(dto);
           
        }
        mnv.setViewName(getSuccessView());
       
        return mnv;
    }
   
}


2. DI설정부분에서 formView,successView,commandClass,commandName을 property로 설정한다.
<bean id="writeSimpleFormController" class="kr.co.springboard.controllers.WriteSimpleFormController">
        <property name="commandClass" value="kr.co.springboard.dto.BoardDTO"/>
        <property name="commandName" value="boardDto"/>
        <property name="formView" value="writeForm"/>
        <property name="successView" value="writeSuccess"/>
        <property name="boardService" ref="boardService"/>
</bean>

기본적으로 onSubmit()을 실행할때는 AbstractCommandController에서 command 객체를 통해 입력된 정보를 받아오는데 SimpleFormController의 onSubmit()도 이와 같은 방식을 채택하고 있다.
그렇기 때문에 commandClass와commandName을 통해 command객체를 생성해 준다.
또하나 아주 중요한 역할은 formBackingObject에서 boardDto를 리턴해 주는데 commandName에 설정한 이름으로 request 객체에 담기기 때문에 commandName을 세팅해 주지 않으면 절대로 form 페이지에서 정보를 받을 수가 없다
그리고 formView는 formBackingObject를 실행되었을때 자동적으로 ModelAndView 객체에 세팅이 됨으로 따로 세팅해주어야 할 필요는 없다.
successView는 성공하고 보여질 페이지를 세팅한다. SimpleFormController 안에 있는 getSuccessView method를 통해 값을 가져 올 수 있다.