Struts meets Swing 1 (번역)

원문:
http://javaboutique.internet.com/tutorials/Swing/index.html
1. 프로필: 
   Jakarta Struts 는 MVC 모드 를 기반 으로 servlet 프로그램 을 만 드 는 프레임 워 크 입 니 다.대부분의 Struts 응용 프로그램 은 브 라 우 저 를 클 라 이언 트 로 사용 합 니 다. 실제로 Struts 는 다른 클 라 이언 트 모드 를 사용 할 수 있 습 니 다.여기 서 저 는 'Coding your second Jakarta Struts Application' 이라는 글 에서 브 라 우 저 애플 리 케 이 션 인 스 턴 스 를 Swing 클 라 이언 트 모드 로 바 꿀 것 입 니 다. 코드 를 조금 만 수정 하면 됩 니 다.
   이 글 은 이미 존재 하 는 Servlet 응용 프로그램 에 Swing 클 라 이언 트 를 사용 하 는 방법 을 소개 한다.자바 애플 리 케 이 션 을 개발 하려 면 브 라 우 저 를 사용 하여 클 라 이언 트 를 만 들 수도 있 고 스윙 으로 클 라 이언 트 를 만 들 수도 있 습 니 다. EJB 나 웹 서 비 스 는 간단 한 인 터 페 이 스 를 제공 합 니 다.
2. Struts 구조
   우리 가 시작 하기 전에 브 라 우 저가 Struts 와 어떻게 통신 하 는 지 먼저 봅 시다.이것 은 우리 의 스윙 응용 프로그램 에 나타 날 것 이다.
   *Struts 응용 프로그램 은 servlet 에서 GET 나 POST 요청 을 받 아들 여 시작 합 니 다.
   *servlet 은 URL 에서 정 보 를 얻 을 수 있 는 "action" 을 호출 할 지 결정 합 니 다.
   *Action 을 실현 한 자바 류 는 struts - config. xml 에서 설정 되 어 있 습 니 다.
   * Struts 의 출력 은 jsp 로 표시 되 며, jsp 의 이름 도 struts - config. xml 파일 에서 지정 되 어 있 습 니 다.
   따라서 첫 번 째 비 브 라 우 저 애플 리 케 이 션 은 servlet 에 요청 을 보 내 고 jsp 페이지 에서 응답 할 수 있어 야 합 니 다.
3.The URLConnection class
    URLConnection 클래스 를 사용 하면 자바 로 servlet 요청 코드 를 간단하게 작성 할 수 있 습 니 다.이 종 류 는 이상 한 디자인 이 있 기 때문에 매우 재미있다.만약 당신 이 그것 의 실현 을 보고 싶다 면, 나 는 "Dodge the traps hiding in the URLConnection class" 를 읽 어 보 는 것 을 권장 합 니 다.
    "list" action 이 있 는 요청 을 보 내 고 인쇄 응답 을 받 으 려 면 코드 를 이렇게 써 야 합 니 다.
URL url = new URL("http://myserver/project/list.do");
    URLConnection conn = url.openConnection();
    
    BufferedReader in = 
       new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String line;  
    while ((line = in.readLine()) != null) {
       System.out.println(line);
    }

    일반적으로 요청 과 동시에 데 이 터 를 보 내야 합 니 다. 양식 을 제출 하 는 것 처럼.이 데 이 터 는 응답 을 읽 기 전에 보 내야 합 니 다.
URL url = new URL("http://myserver/project/list.do");
    URLConnection conn = url.openConnection();
    conn.setDoOutput(true);
    conn.setRequestProperty("user-agent","SWING");  
    
    BufferedWriter out =
       new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
    out.write("name1=value1&name2=value2");
    out.flush();
    out.close();
    
    String c = conn.getHeaderField("Set-Cookie");
    BufferedReader in = 
       new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String line;  
    while ((line = in.readLine()) != null) {
       System.out.println(line);
    }

    이 예 는 HTTP 헤더 정 보 를 읽 고 쓰 는 방법 도 보 여 준다.
    첫 번 째 예 는 GET 방법 으로 HTTP 와 통신 하고 두 번 째 예 는 POST 방법 으로 통신 한다.servlet 에 데 이 터 를 전송 하려 면 GET 방법 을 사용 할 수 있 지만 URL 에 데 이 터 를 추가 해 야 합 니 다. 이렇게:
URL url = new URL("http://myserver/project/list.do?name1=value1&name2=value2");

4.Identifying the client
    이제 우 리 는 데 이 터 를 어떻게 보 내 고 요청 하 는 지 알 게 되 었 지만, 우 리 는 데 이 터 를 어떻게 받 아들 입 니까?응답 이 브 라 우 저 에 있다 면 응답 에는 HTML 이나 자바 스 크 립 트 와 스타일 이 포함 되 어 있 습 니 다.우리 의 스윙 클 라 이언 트 에 대해 우 리 는 데이터 만 필요 합 니 다.이것 은 새로운 문 제 를 가 져 올 것 입 니 다. Struts 응용 프로그램 은 어떻게 클 라 이언 트 가 브 라 우 저 인지, Swing 인지, 아니면 다른 무엇 인지 식별 할 수 있 습 니까?
    하나의 해결 방법 은 모든 요청 에 파 라 메 터 를 추가 할 때 어떤 클 라 이언 트 인지 감별 할 수 있 는 것 이다.나 는 두 번 째 예 에서 user - agent 라 는 헤드 정 보 를 사용 하여 스윙 클 라 이언 트 임 을 식별 했다.
    Struts 응용 프로그램 이 클 라 이언 트 에 게 데 이 터 를 되 돌려 줄 준비 가 되 어 있 을 때 user - agent 의 값 을 감지 한 다음 클 라 이언 트 에 적합 한 jsp 페이지 를 선택 합 니 다.이것 은 Struts Action 류 가 설정 한 점프 정 보 를 대체 할 것 입 니 다.
String client = (String)request.getHeader("user-agent");
    // Forward control to the list page
    if (client.equals("SWING")) 
     return (mapping.findForward("swinglist"));
    else return (mapping.findForward("list"));

     "list" 와 "swinglist" 는 Struts 설정 파일 에서 정의 합 니 다:
<forward name="list" path="/list.jsp"/>
    <forward name="swinglist" path="/swinglist.jsp"/>

    list. jsp 는 브 라 우 저 에 표시 되 고 swinglist. jsp 는 Swing 에 표 시 됩 니 다.
    swinglist. jsp 를 만 들 기 전에 예 프로그램 을 보고 프로그램 을 바 꾸 면 글 에서 언급 한 방법 을 사용 합 니 다.
   
The DVD application
    이 프로그램 은 xml 파일 에서 DVD 를 관리 합 니 다.모든 DVD 를 목록 으로 표시 하고 자세 한 페이지 에 DVD 를 추가 하거나 수정 하거나 삭제 할 수 있 습 니 다.
    
그림
    DVD 관리 자 는 DVD 정 보 를 JDom 의 트 리 구조 로 저장 합 니 다.DVDManager 는 xml 파일 에서 DVD 정 보 를 읽 고 이 정 보 를 xml 파일 에 저장 할 수 있 습 니 다.xml 형식 은 스윙 프로그램 에 데 이 터 를 되 돌려 주 는 선택 임 이 분명 합 니 다.
Returning XML data to the client
    이 는 swinglist. jsp 가 Swing 클 라 이언 트 에 데 이 터 를 되 돌려 주 려 면 DVD 를 xml 로 저장 해 야 한 다 는 뜻 이다.JDom 은 트 리 구 조 를 PRint Writer 로 변환 할 수 있 는 방법 이 있 습 니 다. 이 출력 흐름 을 간단하게 가 져 와 Swing 클 라 이언 트 에 보 내 면 됩 니 다.DVD 관리자 의 첫 번 째 방법 은:
public void outList(PrintWriter out) {
      XMLOutputter outputter = new XMLOutputter("",false);
      // NB: the outputter does not accept XML headers:  
      outputter.setOmitDeclaration(true); 
      try {
        outputter.output(doc, out);
      } catch (IOException e) {
        e.printStackTrace();
      }    
    }

이 방법 은 swinglist. jsp 에서 호출 됩 니 다:
<%@ page language="java" %>
    <%@ page import="java.io.*" %>
    
    <jsp:useBean id="dvds" 
      class="hansen.playground.DVDManager" scope="session"/>
     
    <%
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        dvds.outList(pw); 
        pw.flush();
        out.print(sw.toString());
    %>

비슷 한 방법 으로 swingdetail. jsp 페이지 를 만 듭 니 다. 이 페이지 는 하나의 xml 파일 을 되 돌려 줍 니 다. 하나의 DVD 정 보 를 포함 합 니 다.
<%@ page language="java" %>
    <%@ page import="java.io.*" %>
    
    <jsp:useBean id="dvds" 
      class="hansen.playground.DVDManager" scope="session"/>
    
    <%
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        dvds.outListElement(pw); 
        pw.flush();
        out.print(sw.toString());
    %>

    우 리 는 JDOM 의 XMLoutputter 류 를 사용 하지 않 고 xml 응답 을 직접 수 동 으로 인 코딩 할 수 있 습 니 다.예 를 들 어 DVD 의 이름 만 되 돌려 주 고 싶다 면 이런 jsp 페이지 를 만 들 수 있 습 니 다.
    
<%@ page language="java" %>
    <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
    <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
    
    <jsp:useBean id="dvds" 
      class="hansen.playground.DVDManager" scope="session"/>
    
    <collection>
    <logic:iterate id="dvd" indexId="i" name="dvds" property="dvds">
    <% 
    // Transfer the iteration index to the DVDManager 
    dvds.setIndex(i.intValue()); 
    %>
    <dvd>
    <title><bean:write name="dvds" property="title"/></title>
    </dvd>
    </logic:iterate>
    </collection>

이 페이지 가 실행 되면 이러한 출력 이 생 길 것 입 니 다.
<collection>
      <dvd>
        <title>Amadeus</title>
      </dvd>
      <dvd>
        <title>Lord of the Rings: The Fellowship of the Ring</title>
      </dvd>
      <dvd>
        <title>The Matrix</title>
      </dvd>
    </collection>

Testing the Swing jsp-pages
    오류 페이지 를 제외 하고 DVD 프로그램 은 swinglist. jsp 와 swingdetail. jsp 만 사 용 했 기 때문에 DemoRequest 로 두 jsp 페이지 를 테스트 해 봅 시다.
    servlet 에 요청 을 보 내 고 응답 을 System. out 에 출력 할 수 있 는 request 방법 을 포함 합 니 다.요청 한 user - agent 를 'SWING' 으로 설정 하 는 방법 에 주의 하 십시오.만약 우리 가 이렇게 요구한다 면:
DemoRequest dr = new DemoRequest("http://localhost:8080/dvdapp2/list.do");
    dr.request();

    우 리 는 출력 을 받 았 습 니 다:
<collection>
      <dvd id="C">
        <title>Amadeus</title>
        <length>158</length>
        <actor>F. Murray Abraham</actor>
        <actor>Tom Hulce</actor>
        <actor>Elizabeth Berridge</actor>
      </dvd>
      <dvd id="A">
        <title>Lord of the Rings: The Fellowship of the Ring</title>
        <length>178</length>
        <actor>Ian Holm</actor>
        <actor>Elijah Wood</actor>
        <actor>Ian McKellen</actor>
      </dvd>
      <dvd id="B">
        <title>The Matrix</title>
        <length>136</length>
        <actor>Keanu Reeves</actor>
        <actor>Laurence Fishburne</actor>
      </dvd>
    </collection>

    세 번 째 코드 와 비교 하면 그들 이 매우 닮 았 다 는 것 을 알 게 될 것 이다.첫 번 째 DVD 에 대한 자세 한 정 보 를 요청 하 는 요청 을 보 냅 시다.
DemoRequest dr = new DemoRequest("http://localhost:8080/dvdapp2/list.do");
    dr.request();  
    dr = new DemoRequest("http://localhost:8080/dvdapp2/detail.do");
    dr.setData("index=0");  
    dr.request(); 

    결 과 는 우리 가 바 라 는 것 이 아니다.우 리 는 정확 한 DVD 목록 을 얻 었 지만 출력 은 이 렇 습 니 다.
<html>
    <head>
    <title>System Error</title>
    </head>
    <body>
    <h2>System Error</h2>
    
    No DVD information available
    
    </body>
    </html>

    이것 은 error. jsp 페이지 에서 되 돌아 온 것 입 니 다. Detail 페이지 를 처리 하 는 Struts Action 류 가 session 범위 내 에서 DVD 목록 정 보 를 찾 지 못 했 음 을 알려 줍 니 다.
Maintaining the Session
    이런 잘못 은 네가 몇 시간 을 써 서 확정 해 야 할 지도 모른다.단번에 원인 을 찾 았 거나.여기 가 이유 야.
    서비스 가 브 라 우 저 사용자 에 게 서 비 스 를 제공 할 때 저 희 는 session 상태 가 모든 사용자 에 게 쿠키 를 만 들 고 쿠키 를 통 해 사용 자 를 식별 하 는 것 을 잊 어 버 립 니 다.우리 가 처음으로 응용 프로그램 에 방 문 했 을 때 쿠키 는 우리 기계 에 전 송 될 것 이다.우리 가 다음 요청 을 할 때, 우 리 는 쿠키 를 서버 에 돌려 주어 야 한다. 그러면 서버 에서 session 을 식별 할 수 있다. 테스트 프로그램 에서 우 리 는 이것 을 하지 않 았 기 때문에, 지금 우 리 는 코드 를 수정 하여 되 돌아 오 는 쿠키 를 저장 하고, 이후 의 요청 에서 쿠키 를 돌려 보 내야 한다.DemoRequestCookie 라 는 새로운 종 류 를 보 세 요. 여기 보 세 요.
     새로운 요청 은 이렇게:
DemoRequestCookie dr = 
       new DemoRequestCookie("http://localhost:8080/dvdapp2/list.do");
    dr.request();  
    String cookie = dr.getCookie();
    dr = new DemoRequestCookie("http://localhost:8080/dvdapp2/detail.do");
    dr.setData("index=0");  
    dr.setCookie(cookie);
    dr.request();  

    이번 수출 은 기대 와 일치한다.

. . . (list of all DVDs) . . .
    <dvd id="C">
        <title>Amadeus</title>
        <length>158</length>
        <actor>F. Murray Abraham</actor>
        <actor>Tom Hulce</actor>
        <actor>Elizabeth Berridge</actor>
    </dvd>

Updating the Struts configuration file
    struts - config. xml 에 앞의 방법 을 설정 해 야 합 니 다.모든 정의 에는 jsp 파일 이 포함 되 어야 하 며, 이 파일 은 Swing - counterpart 가 필요 합 니 다.프로필 비교 해 봐.
section
name
refers to
global-forwards
error
error.jsp
  list
list.jsp
  detail
detail.jsp
action-mappings
create
detail.jsp
  update
detail.jsp
  delete
list.jsp
  cancel
list.jsp
우 리 는 새로운 노드 를 추가 합 니 다.
section
name
refers to
global-forwards
swingerror
swingerror.jsp
  swinglist
swinglist.jsp
  swingdetail
swingdetail.jsp
action-mappings
swingcreate
empty.jsp
  swingupdate
empty.jsp
  swingdelete
empty.jsp
  swingcancel
empty.jsp
보시 다시 피 action mappings 의 empty. jsp 노드 는 다음 과 같은 내용 이 있 습 니 다.

   이것 은 단독 xml 요 소 를 포함 하기 때문에 유효한 xml 파일 입 니 다.이상 하 게 도 만 들 고 삭제 하고 지 울 때 어떤 정보 도 되 돌려 주지 않 아 도 되 지만 그 이 유 는 간단 하 다.Swing 클 라 이언 트 는 뚱뚱 한 클 라 이언 트 이 고 브 라 우 저 는 마른 클 라 이언 트 입 니 다.뚱뚱 한 클 라 이언 트 는 현재 DVD 의 데이터 와 가능 한 모든 DVD 의 목록 을 저장 할 수 있 습 니 다.
    따라서 뚱뚱 한 클 라 이언 트 는 서버 에서 DVD 목록 을 한 번 만 가 져 오 면 되 고 그 후에 데 이 터 를 로 컬 에 저장 합 니 다.DVD 목록 이 모든 DVD 데 이 터 를 부 르 지 않 으 면 DVD 를 선택 할 때 서버 에서 가 져 옵 니 다.이것 이 바로 swingdetail action 이 swingdetail. jsp 호출 을 중단 한 이유 입 니 다.
    지적 할 점 이 있 습 니 다.다음 버 전의 Struts (1.1) 에는 하나의 프로필 만 포 함 됩 니 다.저 에 게 준 초보적인 설명 을 읽 고 Swing actions 는 다른 프로필 에 넣 을 수 있 습 니 다. 이것 은 코드 를 깨끗하게 하 는 해결 방법 일 수도 있 습 니 다.
Coding the Swing client
   우 리 는 Swing 클 라 이언 트 의 코드 를 완성 했다.
    URLConnection 과 Session cookies 를 통 해 servlet 를 어떻게 호출 하 는 지 알 게 되 었 습 니 다.우 리 는 xml 응답 을 어떻게 포맷 하 는 지 알 게 되 었 다.
    다음 글 에서 저 는 Swing 클 라 이언 트 를 만 드 는 방법 을 설명 하고 xml 응답 을 분석 하고 표시 하 며 오 류 를 어떻게 찾 는 지 보 겠 습 니 다.

좋은 웹페이지 즐겨찾기