[펌] ibatis

프로그래밍/Framework 2007. 11. 28. 10:08 Posted by galad
출처 블로그 > Java 넌 누구냐!
원본 http://blog.naver.com/junglani00/50010371697
 <form > 태그를 사용하지 않고, 태그 라이브러리를 쓰면 상관없는데요. 굳이 <form>태
그를 사용하실 분만 보시기 바랍니다.
(태그 라이브러리 사용하는 건 "중복처리" 로 검색하면 많이 나옵니다.)

일단 입력폼을 생성하는 action 에서
....
saveToken(request);
...
는 똑같습니다. 이것의 역할이 아마 token을 생성해서 session 에 집어 넣는거 까지
求?거 같습니다.
saveToken 하고나서 session을 살펴보면, "org.apache.struts.action.TOKEN" 에 토큰
값이 들어가 있는 것을 보실 수 있습니다.

그다음 form 입력 jsp에서,
<form name .....>
<input type=hidden name="org.apache.struts.taglib.html.TOKEN" value="<%=session.
getAttribute("org.apache.struts.action.TOKEN")%>">
를 추가해 줍니다.

원래 태그 라이브러리를 사용하면 자동으로 생성시켜 주는데요.
일반 form을 쓰기위해 사용자가 hidden 에 세팅하는 겁니다.

여기서 name 은 org.apache.struts.taglib.html.TOKEN, value 는 session.getAttribut
e("org.apache.struts.action.TOKEN") 을 넣어줍니다.

그리고 입력 처리측은 태그 라이브러리 사용시와 같습니다.

중복처리 로직이 뭔고 했더니, saveToken 에서 session 에 세팅해 놓은 토큰값(org.ap
ache.struts.action.TOKEN) 을 request 로 받아온 토큰값 (org.apache.struts.taglib.
html.TOKEN) 과 비교해서 같으면 정상, 틀리면 중복 으로 처리 하는 거 같습니다.


쓰다보니 정리가 안되는데요. -_-;

결론적으로 말씀드리자면, jsp에
<form name = "boardForm" method = "post" >

<input type=hidden name="org.apache.struts.taglib.html.TOKEN" value="<%=session.
getAttribute("org.apache.struts.action.TOKEN")%>">
만 추가해 주면 된다는 말입니다.

혹시 이문제로 고민하셨던 분은 보면 아실겁니다. ^^

'프로그래밍 > Framework' 카테고리의 다른 글

[펌] Hibernate 3.02 Reference Document 한글 버전  (0) 2007.11.28
[펌] ibatis  (0) 2007.11.28
[펌] saveToken 사용방법  (0) 2007.11.28
[펌] saveToken/ resetToken  (0) 2007.11.28
[펌] 스트럿츠에서의 파일 업로드  (0) 2007.11.28

[펌] saveToken 사용방법

프로그래밍/Framework 2007. 11. 28. 10:07 Posted by galad
출처 블로그 > ★일휘소탕 혈염산하!™ ★
원본 http://blog.naver.com/daks0540/110011969505

원리..... 

일단 모델이   beforeAction => JSP =>afterAction

형태로 사용된다.


beforeAction에서 saveToken메서드를 실행시키면 requestScope과 sessionScope에 랜덤으로  ID 를 만들어 각각 저장한다.


sessionScope에 장장된 ID는 당연히 보장 될 것이고....


requestScope에 저장된 ID는 JSP페이지에 Hidden 형식의 태그를 생성하여 atterAction까지 이어진다.


******** hidden타입이 생긱기 위해서 <form>을 사용하면 안돼고 struts-html의  사용자 정의 태크인 <html:form>을 반듯이 이용해야 한다.


afterAction에서 두 스콥의 ID를 비교하여 일치하면 true를 아니면 false를 반환한다...


-----------------------

간단 코드로 살펴보면



*** beforeAction


 saveToken(request);

코드를 삽입  토근생성한다.


****JSP

<html:form>

을 작성...

<input type="hidden" name="org.apache.struts.taglib.html.TOKEN"
  value="랜덤함 키값">

위와 같은 hidden이 자동 생성된다.


*** afterAction


if (!isTokenValid(request)) { 
     //일치 여부 검증 틀렸을 경우 여기 실행... 조건문 앞에 ! 있다는 사실....



resetToken(request);  //일치할 경우 토근을 지운다.


// 일치할 경우 실행된 액션




saveToken() 사용법  10/14 09:55 

http://blog.naver.com/maydeen/100000321529

음, 혹 saveToken()에 대한 사용법에 대해 궁금해 하는 이들이 있을까 하여, 샘플 코드를 추가하였다. 사용법은 매우 간단하다.



1. 어떤 폼으로 보내는 Action

public class FindInvoiceAction extends BaseAction
{
  public ActionForward execute(ActionMapping mapping,
                                            ActionForm form,
                                            HttpServletRequest request,
                                            HttpServletResponse response)
  throws IOException, ServletException
  {
      ...
      saveToken(request); // 이것만 추가하면 됨
      return mapping.findForward(“saveInvoicePage”);
    }
}





2. 폼 전송을 처리하는 액션

public class SaveInvoiceAction extends BaseAction
{
    public ActionForward execute(ActionMapping mapping,
                                              ActionForm form,
                                              HttpServletRequest request,
                                              HttpServletResponse response)
    throws Exception {

      //token 체크. 현재 세션에 있는 token과 일치하지 않으면 더블 체킹 된 것이거나 유효하지 않은 요청이다.
        if (!isTokenValid(request)) {
          postGlobalError(Constants.DUPLICATE_FORM_ERROR, request);
          return mapping.findForward(“saveInvoicePage”);
        }
        ...
        //여기까기 온다면 모든게 잘 된 것이고, 새로운 토큰을 생성!!    또는 리셋
        saveToken(request); // resetToken(request);
        return mapping.findForward(“confirmInvoicePage”);
    }
}


saveToken()은 포워드방식으로 등록처리나 수정처리시 새로고침으로 인한 중복으로 값을

등록이나 수정하는 것을 방지 하기위해 쓰인다

[펌] saveToken/ resetToken

프로그래밍/Framework 2007. 11. 28. 10:07 Posted by galad

펌: http://wiki.javajigi.net/pages/viewpage.action?pageId=77

Jakarta Struts 강좌 5 - RequestDispatcher를 이용할 경우 문제점과 해결방법

Summary : 지금까지 스트러츠의 전체적인 부분에 대하여 다루어왔다. 이번 강좌부터는 스트러츠의 세부항목들에 대하여 살펴보면서 스트러츠를 좀 더 효율적으로 활용해보도록 한다. 이번 강좌에서는 HttpServletResponse의 sendRedirect와 RequestDispatcher의 차이점에 대하여 살펴본다. RequestDispatcher를 사용할 경우 장점도 있지만 발생하는 문제점이 있다. 스트러츠를 활용하여 RequestDispatcher을 이용할 경우 발생하는 문제점을 해결하는 방법에 대하여 살펴본다.

HttpServletResponse의 sendRedirect와 RequestDispatcher의 차이점

JSP를 이용하여 프로그램할 경우 특정작업을 완료한 후 다음 페이지로 이동할 때 흔히 HttpServletResponse의 sendRedirect()를 이용한다. HttpServletResponse의 sendRedirect()는 두번의 Request를 통해 하나의 작업을 완료하는 방식이다. 즉, 첫번째 요청이 서버에서 처리된 다음 서버는 이동할 다음 페이지의 경로를 클라이언트에서 응답하면 클라이언트의 브라우저는 서버에게 새로운 페이지를 다시 요청하여 이동하는 방식이다. 이와 같이 할 경우 두번의 네크? Traffic이 발생하기 때문에 실행속도에 늦어질 수 밖에 없다. 또한 새로운 요청을 하기 때문에 요청하는 페이지에 객체를 전달하기 힘들다는 문제점이 있다.

이 같은 문제점을 해결하기 위하여 RequestDispatcher가 탄생하게 되었다. RequestDispatcher는 일련의 작업이 완료된 후 다음페이지로 이동할 경우 클라이언트에 응답을 한 후 다시 요청하도록 하는 방식이 아니라 서버에서 서버로 페이지를 요청하여 실행한 후 응답을 하도록 한다. 이럴 경우 네트? Traffic이 한번 발생하게 되며, 서버에서 서버로 페이지를 요청하기 때문에 String만이 아닌 객체의 전달도 가능하다.

다음 두개의 그림을 보면 두가지 방식의 차이점을 명확히 알 수 있을 것이다.

RequestDispatcher를 이용할 경우 한번의 요청으로 인해 모든 작업이 서버에서 처리되기 때문에 실행속도는 Response의 sendRedirect를 사용할 때보다 빠르다. 또한 Response의 sendRedirect을 이용할 경우에는 String밖에 전달 할 수 없다. 즉, 객체를 다른 페이지에 전달하는 것이 힘들다. 물론 세션을 이용하면 가능하지만 세션 또한 시스템의 메모리를 차지하기 때문에 매번 세션을 이용하는 것은 좋은 방법은 아니다.

이에 대한 대안으로 RequestDispatcher를 이용하면 된다. RequestDispatcher를 이용하면 서버에서 모든 작업이 처리되기 때문에 서버상에서의 객체의 전달이 가능하다. 하지만 RequestDispatcher를 이용할 경우 문제점이 있다. RequestDispatcher를 이용할 경우 응답이 이루어진 후의 URL이 처음 클라이언트가 요청한 URL로 지정되어 있기 때문에 문제가 되는 경우가 있다.

한가지 예로 사용자의 정보를 가져오거나 사용자의 정보를 볼 경우에는 문제가 되지 않는다. 하지만 사용자가 회원가입을 할 경우 똑같은 정보가 같은 페이지에 요청되기 때문에 같은 정보가 저장되는 경우가 있다.

개발자들이 게시판을 이용할 때 요청속도가 느려 Refresh를 계속해서 누를 경우 똑같은 글이 계속해서 저장되는 것을 경험한 적이 있을 것이다. RequestDispatcher를 이용할 경우에는 같은 문제가 발생하는 경우가 많다.

따라서 스트러츠에서는 이 문제점을 해결하기 위하여 자체적으로 해결방법을 제공하고 있다. 스트러츠에서 이 문제를 해결하는 방법에 대하여 살펴보자.

스트러츠 프레임워크에서 RequestDispatcher의 문제점 해결하는 방법.

RequestDispatcher의 문제점을 해결하기 위해서 스트러츠에서는 해결점을 제공하고 있다. Action클래스의 saveToken()과 resetToken()을 이용하여 요청(Request)이 한번만 실행할 수 있도록 지원하고 있다. 간단하게 요약하면 saveToken()을 이용하여 요청이 실행될 때 하나의 Token을 생성한다. 만약 앞에서 생성한 똑같은 Token의 요청이 실행되면 스트러츠에서는 에러를 발생시켜 요청이 실행되지 않도록 한다.

지난번 강좌에 이어 스트러츠를 이용하여 사용자를 관리하는 예제를 완성하면서 RequestDispatcher에서 발생하는 문제점을 해결하는 방법에 대하여 살펴본다. 단 데이터베이스를 사용하지 않고 예제를 단순화하기 위하여 콜렉션을 Static으로 선언하여 데이터베이스의 역할을 하도록 했다.

지금부터 스트러츠를 이용하여 사용자 관리를 하는 방법에 대하여 살펴보도록 하겠다.

package net.javajigi.mall.user;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class UserDatabase {
	//데이터베이스 대신 사용자 정보를 저장하고 있는 콜렉션을 선언하는 부분이다.
	protected static List users = new ArrayList();
	
	public static List getUsers() {
		return users;
	}
	
	public static UserVO getUser(String id) {
		Iterator userIter = users.iterator();
		
		while ( userIter.hasNext() ) {
			UserVO user = (UserVO)userIter.next();
			
			if ( id.equals(user.getId()) ) {
				return user;
			}
			
		}
		
		return null;
	}
}

데이터베이스 대신 사용자 정보를 저장하는 역할을 하는 클래스이다. 콜렉션을 Static으로 선언하여 메모리상에 사용자 정보를 저장하고 있다. 예제를 단순화하기 위하여 이처럼 처리했다. 다음 강좌에서는 이 부분을 데이터베이스를 이용하여 처리하도록 변경될 것이다.

다음에 보게될 클래스들은 MVC에서 model에 해당하는 부분을 처리하게 될 클래스들이다. 데이터베이스로 변경되더라도 다음 클래스만 변경하면 다른 부분에 대한 변경은 없어도 된다.

package net.javajigi.mall.user;

public class UserTO {
	private String id = null;
	private String password = null;
	private String name = null;
	private String email = null;
	
	public String getEmail() {
		return email;
	}

	public String getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	public String getPassword() {
		return password;
	}

	public void setEmail(String email) {
		this.email = email;
	}

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

	public void setName(String name) {
		this.name = name;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}
package net.javajigi.mall.user;

public class UserVO {
	private String id = null;
	private String password = null;
	private String name = null;
	private String email = null;
	
	public UserVO(String id, String password, String name, String email){
		this.id = id;
		this.password = password;
		this.name = name;
		this.email = email;
	}
	
	public String getId() {
		return id;
	}

	public String getPassword() {
		return password;
	}

	public String getEmail() {
		return email;
	}

	public String getName() {
		return name;
	}

	public boolean equals(Object userVO) {
		return this.equals(userVO);
	}

	public String toString() {		
		return getId();
	}
}
package net.javajigi.mall.user;

import java.util.ArrayList;
import java.util.List;

public class UserList {
	private List users = null;
	
	public UserList() {
		users = new ArrayList();
	}

	public void addUser(UserVO userVO) {
		users.add(userVO);
	}
	
	public List getUsers() {
		return users;
	}	
}
package net.javajigi.mall.user;

import java.util.List;

public class UserDAO {

	public static UserVO getUser(String id) {
		/*
		데이터베이스에 접속하여 해당하는 User의 정보를 가져오는 코드가
		실제 Application에서는 있을 것이다.
		User의 정보를 가져와 User Value Object에 해당 정보를 저장하여 반환하는
		역할을 한다.
		
		이번 예제에서는 스트러츠에 집중하기 위하여 데이터베이스에 접속하여 데이터를
		가져오는 부분은 생략했다.
		
		id가 javajigi일 경우 UserVO를 생성하고, 
		그렇지 않을 경우 존재하지 않는 아이디로 간주하여 null을 반환하도록 
		구현했다.
		*/

		return UserDatabase.getUser(id);
	}

	public static int addUser(UserTO userTO) {
		UserVO userVO =
			new UserVO(
				userTO.getId(),
				userTO.getPassword(),
				userTO.getName(),
				userTO.getEmail());
		UserDatabase.users.add(userVO);
		
		return 1;
	}	
	
	public static List getUsers() {
		return UserDatabase.getUsers();
	}
	
	public static int updateUser(UserTO userTO) {
		UserVO userVO = getUser(userTO.getId());
		
		if ( userVO != null ) {
			int removeCount = removeUser(userTO.getId());
			
			if ( removeCount == 1) {
				return addUser(userTO);
			}		
		}
		
		return 0;
	}
	
	public static int removeUser(String id) {
		UserVO userVO = getUser(id);
		
		if ( userVO != null ) {
			UserDatabase.users.remove(userVO);
			
			return 1;
		}
		
		return 0;
	}	
}

지금까지 사용자 관리에서 Model에 해당되는 부분에 대하여 살펴보았다. 다음은 사용자 관리의 View와 Controller에 해당하는 부분에 대하여 살펴보자. 각 소스에서 설명이 필요한 부분은 주석으로 처리하였다.

메모리상에 저장된 사용자 정보가 없기 때문에 /user/login.jsp에서 회원가입을 한다. 회원가입을 하는 과정에서 RequestDispatcher에서 발생하는 문제점을 해결하는 방법에 대하여 살펴본다.

위 화면은 사용자가 로그인 하기 위한 화면이다. URL이 http://localhost:8080/zigimall/user/login.jsp임을 확인해 보기 바란다. 현재 메모리 상에 저장된 사용자가 없기 때문에 회원가입을 한 후에 로그인 과정을 진행하도록 한다.

<%@ page language="java" %>
<% response.setContentType("text/html"); %>

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%> 
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%> 

<html:html locale="true">
<head>
    <title><bean:message key="login.title" /></title>
    <html:base/>
</head>
<body>
<html:errors />
<html:form action="/useradd">
    <bean:message key="prompt.id" />
    <html:text property="id" />
    <br />
    <bean:message key="prompt.password" />
    <html:password property="password" />
    <br />
    <bean:message key="prompt.name" />
    <html:text property="name" />
    <br />

    <bean:message key="prompt.email" />
    <html:text property="email" />
    <br />

	<html:submit/>
	
    <html:link page="/user/login.jsp">
        <bean:message key="useradd.cancel" />
    </html:link>  	
</html:form>
<body>
</html:html>
package net.javajigi.mall.user.action;

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

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class UseraddformAction extends Action {

 	public ActionForward execute(
		ActionMapping mapping,
		ActionForm form,
		HttpServletRequest request,
		HttpServletResponse response)
		throws Exception {
			
		//회원가입 Form으로 이동할 때 request에 새로운 Token을 생성하여 저장한다.
		//여기서 생성된 Token은 회원가입을 완료할 때 요청한 Request가 처음 요청한 Request인지
		//같은 Request가 요청되었는지를 확인하는데 사용된다.
		saveToken(request);
		
		return (mapping.findForward("useraddForm"));
	}
}
package net.javajigi.mall.user.action;

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

import net.javajigi.mall.user.form.UserAddForm;
import net.javajigi.mall.user.UserDAO;
import net.javajigi.mall.user.UserTO;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class UserAddAction extends Action {
	public ActionForward execute(
		ActionMapping mapping,
		ActionForm form,
		HttpServletRequest request,
		HttpServletResponse response)
		throws Exception {
		UserAddForm useraddForm = (UserAddForm) form;

		ActionErrors errors = new ActionErrors();
		
		//요청된 Request의 Token이 유효한지를 처리하는 부분이다.
		//Token이 유효하지 않을 경우 ActionErrors에 에러를 저장한다.
		//따라서 같은 요청이 재요청될 경우 에러를 발생시키기 때문에 같은 요청이 
		//두번 반복해서 처리되지는 않는다.
        if (!isTokenValid(request)) {
            errors.add(ActionErrors.GLOBAL_ERROR,
                       new ActionError("error.transaction.token"));
        }
       	resetToken(request);		
		        
		if (!errors.isEmpty()) {
		    saveErrors(request, errors);
 	        saveToken(request);

	        return (mapping.getInputForward());
		}

		UserTO userTO = new UserTO();
		userTO.setId(useraddForm.getId());
		userTO.setPassword(useraddForm.getPassword());
		userTO.setName(useraddForm.getName());
		userTO.setEmail(useraddForm.getEmail());
				
		UserDAO.addUser(userTO);
		
		useraddForm.reset(mapping, request);
		
		return(mapping.findForward("loginForm"));
	}
}

회원가입이 완료된 후에 나타나는 로그인 화면이다. 앞의 login.jsp화면과 달라진 부분은 URL이 달라졌음을 알 수 있다. 이 URL은 사용자가 회원가입을 완료하기 위하여 요청한 URL이다. 즉, RequestDispatcher를 이용할 경우 첫번째 요청에 대한 URL이 바뀌지 않는다는 문제점이 있다. 따라서 여기서 위 화면에서 새로고침을 할 경우 똑같은 요청이 재요청된다는 문제점이 있다.

스트러츠에서 RequestDispatcher을 이용하기 위해서는 struts-config.xml에서 설정하면 된다.

struts-config.xml의 forward태그에 redirect attribute를 이용하면 된다. redirect의 Default값은 false이다. 따라서 만약 Response의 sendRedirect를 이용하고자 한다면 redirect를 true로 설정해 주어야 한다.

회원가입의 forward에서 와 같이 설정하였기 때문에 RequestDispatcher를 이용하고 있다.

위 화면에서 새로고침을 계속해서 누른다면 같은 사용자가 계속해서 저장되는 문제점이 있다. 하지만 위와 같이 처리할 경우 다음 화면과 같이 에러화면을 처리하면서 새로운 요청이 처리되지 않음을 볼 수 있다.

// Created by Xslt generator for Eclipse.
// XSL :  not found (java.io.FileNotFoundException:  (지정된 경로를 찾을 수 없습니다))
// Default XSL used : easystruts.jar$org.easystruts.xslgen.JavaClass.xsl

package net.javajigi.mall.user.action;

import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.javajigi.mall.user.UserDAO;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class UserListAction extends Action {

	public ActionForward execute(
		ActionMapping mapping,
		ActionForm form,
		HttpServletRequest request,
		HttpServletResponse response)
		throws Exception {

		List users = UserDAO.getUsers();
		
		//사용자의 정보를 얻어와 사용자의 정보를 담은 객체를 
		//request에 저장하여 전달하고 있다.
		//이것이 가능한 이유는 RequestDispatcher를 이용하기 때문이다.
		request.setAttribute("listuser", users);	
		
		return mapping.findForward("userlist");
	}
}
<%@ page language="java" %>
<% response.setContentType("text/html"); %>

<%@ page import="java.util.*"%>
<%@ page import="net.javajigi.mall.user.*"%>

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

<html:html locale="true">
<head>
    <title>사용자 리스트</title>
    <html:base/>
</head>

<body>
<form>
	<html:errors />
	<br/>
	<table border="1">
		<tr>
			<td><bean:message key="prompt.id" /></td>
			<td><bean:message key="prompt.name" /></td>
			<td><bean:message key="prompt.email" /></td>			
		</tr>
<%
	//UserListAction에서 전달한 List객체를 이용하여 사용자의 목록을 보여주는 부분
	List users = (List)request.getAttribute("listuser");

	for (int i=0; i < users.size(); i++) {
		UserVO userVO = (UserVO)users.get(i);
%>
		<tr>
			<td><%= userVO.getId() %></td>
			<td><%= userVO.getName() %></td>
			<td><%= userVO.getEmail() %></td>			
		</tr>
<%
	}
%>		
	</table>

    <html:link page="/useraddform.do">
        <bean:message key="user.useradd" />
    </html:link>
<form>
</body>
</html:html>

http://blog.naver.com/galad/140030871620

출처 블로그 > julymorning4님의 블로그
원본 http://blog.naver.com/julymorning4/100018922422
스트럿츠에서의 파일 업로드

작성자 : 김길재


스트럿츠의 폼에서 File을 인식하기 못하기 때문에

org.apache.struts.upload.FormFile 클래스를 사용하여야 합니다.

제가 작업하던중 스트럿츠의 파일 업로드에 사용한 소스입니다.

궁금하신 점은 답글 남겨주시거나 메일 보내주시면 대답해 드리겠습니다. ^^


///////////////// image_insert.jsp/////////////////////////////////////


<%@ page contentType="text/html;charset=EUC-KR" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>


<html:form action="/ImageInsert" enctype="multipart/form-data" >
  <table>
    <TR bgcolor=FFFFFF>
                      <TD height="30" bgcolor='#E6EBF0'>* 이미지(대)</TD>
                      <TD colspan="2">
                        <html:file property="image_path[0]" size="30"/>        
                      </TD>
                    </TR>
                    <TR bgcolor=FFFFFF>
                      <TD height="30" bgcolor='#E6EBF0'>* 이미지(중)</TD>
                      <TD colspan="2">
                        <html:file property="image_path[1]" size="30"/>                
                      </TD>
                    </TR>
                    <TR bgcolor=FFFFFF>
                      <TD height="30" bgcolor='#E6EBF0'>* 이미지(소)</TD>
                      <TD colspan="2">
                        <html:file property="image_path[2]" size="30"/>                
                      </TD>
                    </TR>
  </table>
</form:html>

///////////////////struts-config.xml///////////////////////////////////

<form-beans>
  <form-bean name="imageinsertForm" type="ImageInsertForm"/>
</form-beans>

<action-mappings>
  <action          
                path="/ImageInsert"
                type="ImageInsertAction"
            name="imageinsertForm"                        
            validate="false"
            input="/image_insert.jsp"
        />

///////////////////ImageInsertForm.java///////////////////////////////

import org.apache.struts.upload.FormFile;
public class ImageInsertForm  extends ActionForm
{

    private FormFile[] image_path = new FormFile[3];
   
    public FormFile[] getImage_path() {
                return image_path;
        }
        /**
         * @param image_path The image_path to set.
         */
        public void setImage_path(FormFile[] image_path) {
                this.image_path = image_path;
        }
}        

////////////////////ImageInsertAction.java/////////////////////////////

import org.apache.struts.upload.FormFile;

public class GoodsInsertAction extends BaseAction
{
        public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)
        {
                   FormFile image_path[] = ((ImageInsertForm)form).getImage_path();
                   ImageDAO imageDAO = new ImageDAO();
                   imageDAO.imageInsert( image_path );
                  
                   return (mapping.findForward( "image_insert_success" ));
        }
}

/////////////////////////// GoodsFile.java////////////////////////////
/**
* @author Administrator
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class GoodsFile
{
        private String fileName = null;
        private String tempFileName = null;

        public String getFileName() {
                return fileName;
        }
       
       
        public String getTempFileName() {
                return tempFileName;
        }
       


        public void setFileName(String fileName) {
                this.fileName = fileName;
        }



        public void setTempFileName(String tempFileName) {
                this.tempFileName = tempFileName;
        }
}

////////////////////ImageDAO.java///////////////////////////////////

import org.apache.struts.upload.FormFile;

public class ImageDAO
{

    public  void imageInsert( FormFile[] image_path )
    {
        Connection con=null;
        PreparedStatement pstmt=null;
        ResultSet rs = null;
        String sql = "";
        GoodsFile goodsFile[] = new GoodsFile[ 3 ];
        String path = "D:\\upload";

        try
        {
                 for( int i = 0 ; i < 3 ; i++ )
                {
                        goodsFile[ i ] = FileUploadUtil.doFileUpload( image_path[ i ] , gcode , Integer.toString( ( i + 1 ) ) );
                }

                con = DriverManager.getConnection(ConnectionPoolManager.URL_PREFIX+"oraclejava");
               
                sql = "INSERT INTO IMAGES( IMAGE_PATH1 , IMAGE_PATH2 , IMAGE_PATH3 ) VALUES(  :IMAGE_PATH1 , :IMAGE_PATH2 , :IMAGE_PATH3 );
                pstmt = con.prepareStatement(sql);
                pstmt.setString( 1 , goodsFile[ 1 ].getFileName()  );
                    pstmt.setString( 2 , goodsFile[ 2 ].getFileName() );
                    pstmt.setString( 3 , goodsFile[ 3 ].getFileName() );
                pstmt.executeUpdate();
 
                }
        catch( Exception e )
        {
                return null;
        }
        finally
        {
                     try
                {

                    if ( rs != null )
                        rs.close();
                    if ( pstmt != null )
                        pstmt.close();
                    if ( con != null )
                        con.close();
                }
                catch ( Exception ignore )
                {
               
        }         
    }
}


///////////////////////FileUploadUtil.java/////////////////////////////
ublic class FileUploadUtil
{
        public static GoodsFile doFileUpload(FormFile fileList  )
        throws FileNotFoundException, IOException
        {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                InputStream stream = fileList.getInputStream();

                               

                //파일을 업로드할 절대 경로를 지정해야 한다.
                String path = "D:\\upload\\";
                OutputStream bos = new FileOutputStream( path + fileList.getFileName()  );
                int bytesRead = 0;
                byte[] buffer = new byte[8192];
                while ((bytesRead = stream.read(buffer, 0, 8192)) != -1)
                {
                        bos.write(buffer, 0, bytesRead);
                }
                bos.close();
                stream.close();

        GoodsFile boardFile = new GoodsFile();
        boardFile.setFileName(fileList.getFileName());
        boardFile.setTempFileName(fileList.getFileName() );

        return boardFile;
}
}

06 XML 마지막날.

프로그래밍/ETC 2007. 11. 28. 09:44 Posted by galad

 XML -> 정보 전달 수단, 문서 작성, HTML을 보완(대체가 아니다)


① Well-Formed XML

② Valid XML

  Well-Formed XML + DTD(or Schema)


DTD의 단점

- XML 문법과 다르다.

- 표현할 수 있는 데이터 종류가 적다. 풍부한 표현이 불가.


-> 최근에는 스키마가 많이 쓰이지만, 아직도 혼용되고 있다.


Schema

- 풍부한 표현이 가능. 사용자 정의 타입도 만들 수 있다.


=> DOM, SAX 등의 api를 이용해서 JAVA에서 XML을 다룰 수 있어야 한다.

JSP에서 배움.

'프로그래밍 > ETC' 카테고리의 다른 글

[XPath] String으로 InputSource 생성하기  (0) 2009.03.02
[에러] javax.xml.xpath.XPathFactory 사용 시, newInstance() 생성이 안될 때  (0) 2009.03.02
05 스키마...  (0) 2007.11.28
04 DTD...  (0) 2007.11.28
03 엘리먼트 내용  (0) 2007.11.28

05 스키마...

프로그래밍/ETC 2007. 11. 28. 09:44 Posted by galad

<<< memberlist2.xsd >>>


<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <!-- 주석 -->
    <xsd:annotation>
        <xsd:appinfo source="memberlist2.xml">
            memberlist2.xml
        </xsd:appinfo>
        <xsd:documentation source="memberlist2.xml" xml:lang="ko">
            dtd로 만든 memberlist를 xml schema로 바꾼다.
        </xsd:documentation>
    </xsd:annotation>
   
    <!-- 루트 엘리먼트 선언 -->
    <xsd:element name="MemberList">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="Member" type="ctMember" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
   
    <!-- 글로벌 컴플렉스 타입 정의 -->
    <xsd:complexType name="ctMember">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="age" type="xsd:int"/>
            <xsd:element name="sex" type="ctSex"/>           
            <xsd:element name="job" type="ctJob"/>
            <xsd:element name="address" type="xsd:string"/>
            <xsd:element name="tel" type="xsd:string"/>
        </xsd:sequence>
       
        <!-- 속성 선언 -->
        <xsd:attribute name="kind" type="stMemberKind" use="required"/>
        <xsd:attribute name="id" type="xsd:ID" use="required"/>
    </xsd:complexType>
   
    <xsd:complexType name="ctJob">
        <xsd:sequence>
            <xsd:element name="company_name" type="xsd:string"/>
            <xsd:element name="company_tel" type="ctCompanyTel"/>
            <xsd:element name="company_address" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
   
    <xsd:complexType name="ctSex">
        <xsd:simpleContent>
            <xsd:extension base="xsd:string">
                <xsd:attribute name="s" type="stSex" use="required"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
   
    <xsd:complexType name="ctCompanyTel">
        <xsd:simpleContent>
            <xsd:extension base="xsd:string">
                <xsd:attribute name="com_tel" type="stCompanyTel" use="required"/>
            </xsd:extension>           
        </xsd:simpleContent>
    </xsd:complexType>
   
    <!-- 사용자 정의 심플 타입 정의 -->
    <xsd:simpleType name="stMemberKind">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="유료"/>
            <xsd:enumeration value="무료"/>
        </xsd:restriction>
    </xsd:simpleType>
   
    <xsd:simpleType name="stSex">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="man"/>
            <xsd:enumeration value="woman"/>
        </xsd:restriction>
    </xsd:simpleType>
   
    <xsd:simpleType name="stCompanyTel">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="fax"/>
            <xsd:enumeration value="H.P."/>
            <xsd:enumeration value="tel"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>



<<< memberlist2.xml >>>


<?xml version="1.0" encoding="UTF-8"?>
<MemberList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="memberlist2.xsd">
    <Member kind="무료" id="askjdfkd">
        <name>김종식</name>
        <age>28</age>
        <sex s="woman">여자</sex>
        <job>
            <company_name>itea</company_name>
            <company_tel com_tel="H.P.">001</company_tel>
            <company_address>서소문</company_address>
        </job>
        <address>안산?</address>
        <tel>000</tel>
    </Member>   
</MemberList>

'프로그래밍 > ETC' 카테고리의 다른 글

[에러] javax.xml.xpath.XPathFactory 사용 시, newInstance() 생성이 안될 때  (0) 2009.03.02
06 XML 마지막날.  (0) 2007.11.28
04 DTD...  (0) 2007.11.28
03 엘리먼트 내용  (0) 2007.11.28
02 xml 복습 및 2일째  (0) 2007.11.28