초간단 방명록 시리즈~!-_-

예전에 포스팅한 Zend Amf사용후기- http://mudchobo.tomeii.com/tt/398
Zend Amf가 이번에 출시된 Flash Builder4 Beta에서 기능으로 포함되어있습니다. 사용하기도 더 편해졌구요. 설정 같은 것은 전혀 안해줘도 Flash Builder4가 알아서 다하네요.

우선 Flash Builder4 Beta를 설치해야합니다.(adobe.com 회원가입 후 받을 수 있음!)


New Flex Project -> Project Name은 FlexGuestBook, Application type은 Web, Server technology는 PHP!
Next하면 서버 셋팅을 해야하는데요. 우선 Apache와 Mysql깔려있다는 가정하에 진행!-_-
Server location에서 Web root는 htdocs위치, Root URL은 http://localhost.
Output folder는 냅둬도 돼요^^ 바로 Finish!

htdocs/FlexGuestBook-debug생기면 성공!

아...디비부터 만들어야겠군요.
[code]DROP TABLE IF EXISTS `mudchobo`.`guestbook`;
CREATE TABLE  `mudchobo`.`guestbook` (
  `idx` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `author` varchar(45) NOT NULL,
  `content` text NOT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY (`idx`)
);[/code]
그럼 PHP코딩해봅시다.
저같은 경우 NetBeans를 사용해서 하는데, 그게 정신건강에 좋아요-_- PHP는 NetBeans와 함께-_-
아까Web root에서 FlexGuestBook폴더를 만듭니다.
PhpClass파일을 하나 만듭니다.
GuestBookService.php
[code]<?php
class GuestBookService {
    private $connection;

    private function connect()
    {
        $this->connection = mysqli_connect("localhost", "root", "mudchobo", "mudchobo")
            or die(mysqli_connect_error());
    }

    public function getList()
    {
        $this->connect();
        $sql = "SELECT * FROM guestbook order by idx desc limit 0, 10";

        $result = mysqli_query($this->connection, $sql)
            or die("Query failed: " . mysqli_error($this->connection));

        $rows = array();
        while($row = mysqli_fetch_object($result))
        {
            $rows[] = $row;
        }

        mysqli_free_result($result);
        mysqli_close($this->connection);

        return $rows;
    }

    public function insert($author, $content)
    {
        $this->connect();
        $sql = "INSERT INTO guestbook (idx, author, content, date) VALUES (null, '" .
            $author . "', '" . $content . "', now())";

        $result = mysqli_query($this->connection, $sql)
            or die("Query failed: " . mysqli_error($this->connection));

        mysqli_close($this->connection);
    }
}
?>[/code]
클래스에 초간단 insert함수와 getList()함수가 있어요. 여기서 잠깐! NetBeans6.7의 새로운 기능-_-
쿼리문의 코드힌트가 가능해요!!! idx, author, content, date가 다보여요. guestbook 테이블명도 보이는군요.
사용자 삽입 이미지

Flash Builder설명하다 튀어나온 NetBeans...-_-

뭐어쨌든, 이제 진짜 FlashBuilder로 가는거임.
FlashBuilder에서 하단에 Data/Services가 있는데요. Connect Data/Service를 클릭하면 PHP가 있는데, 클릭하고, ServiceName은 GuestBookService로 하고, Php Location은 아까 작성한 GuestBookService.php를 선택합니다.
이 과정에서 Zend Amf가 설치가 안되어있으면 설치할꺼냐고 물어봅니다. 설치해야합니다^^
설치할 때 htdocs/ZendFramework폴더에 자동으로 설치됩니다.
Finish! 그려면 services.guestbookservice패키지에 뭔가 생겼을 겁니다.
그럼  getList와 insert가 보이는데요. 리턴타입을 설정해야해서 getList에 오른쪽버튼 누르면, Configure Return Type이 있는데, Create a new custom data type에서 GuestBook을 입력하고, Finish를 하면 모든 타입이 String으로 된 Bean같은 것을 만듭니다-_-(Bean마다 타입은 지정이 안되는데, 왜그런지 모르겠음 ㅠ)
insert는 기존에 있는 타입에서 void로 고르고!^^

그럼 이제 진짜 Flex로 와서 Design모드로 바꾸고, DataGrid를 넣어봅시다.
사용자 삽입 이미지

왜 한글로 나오지...한글화가 되다 말았네-_-

데이터그리드에 대고 오른쪽 버튼을 누르면 Bind To Data라는 메뉴가 생겼습니다. 누르면 아래와 같은 메뉴가 나옵니다.
사용자 삽입 이미지
OK누르면 자동으로 코드도 입력해주네요.
예전에는 Php로 Service랑 설정파일 작성하고 그랬는데, 그럴필요가 없어요. 알아서 다 만들어주거든요.
Insert하고 getList하는 것도 다 추가하면 아래와 같은 코드를 완성할 수 있어요.
[code]<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768" xmlns:guestbookservice="services.guestbookservice.*">
    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
            import mx.controls.Alert;

            protected function dataGrid_creationCompleteHandler(event:FlexEvent):void
            {
                getListResult.token = guestBookService.getList();
            }

            protected function btnWrite_clickHandler(event:MouseEvent):void
            {
                if (inputAuthor.text.length < 1)
                {
                    Alert.show("글쓴이를 입력하세요");
                    return;
                }
                if (taContent.text.length < 1)
                {
                    Alert.show("내용을 입력하세요");
                    return;
                }
               
                guestBookService.insert(inputAuthor.text, taContent.text);
                inputAuthor.text = "";
                taContent.text = "";
               
                getListResult.token = guestBookService.getList();
            }

        ]]>
    </fx:Script>
    <fx:Declarations>
        <s:CallResponder id="getListResult"/>
        <guestbookservice:GuestBookService id="guestBookService" destination="GuestBookService" endpoint="http://localhost/PhpFlexGuestBook/gateway.php" fault="Alert.show(event.fault.faultString)" showBusyCursor="true" source="GuestBookService"/>
    </fx:Declarations>
    <mx:DataGrid x="72" y="21" width="489" height="307" id="dataGrid" creationComplete="dataGrid_creationCompleteHandler(event)" dataProvider="{getListResult.lastResult}">
        <mx:columns>
            <mx:DataGridColumn headerText="content" dataField="content" showDataTips="true" dataTipField="content"/>
            <mx:DataGridColumn headerText="author" dataField="author" showDataTips="true" dataTipField="author"/>
            <mx:DataGridColumn headerText="idx" dataField="idx"/>
            <mx:DataGridColumn headerText="date" dataField="date"/>
        </mx:columns>
    </mx:DataGrid>
    <mx:Label x="70" y="370" text="내용 :"/>
    <s:TextArea id="taContent" x="111" y="369" width="447"/>
    <s:Button id="btnWrite" x="279" y="524" label="글쓰기" click="btnWrite_clickHandler(event)"/>
    <mx:Label x="59" y="344" text="글쓴이 :"/>
    <s:TextInput id="inputAuthor" x="112" y="343"/>
   
</s:Application>[/code]
사용자 삽입 이미지
위에 부분 댓글인줄 알고 낚이는 사람 있겠다-_-

참고자료 : http://sujitreddyg.wordpress.com/2009/06/01/building-flex-application-for-a-php-class-using-flash-builder-4/
 
Posted by 머드초보
,
 
SpringFramework가 되는지 삽질하던 중 데모에 있는 샘플을 하나잡아서 convert를 시켰습니다-_-
놀랍게도 잘 되네요. 하는 도중 약간의 혈압이 상승했지만요-_-

우선 샘플주소입니다.
http://springguestbook.appspot.com

소스코드 주소입니다. trunk/SpringGuestBook입니다^^
http://my-svn.assembla.com/svn/mudchobosample

마치...그냥 앱엔진에서 제공하는 샘플이랑 같아보여서 사기를 치는 것 같지만, Model2방식의 예제입니다ㅠ

우선 하면서 가장 처음에 겪는 문제점입니다.
Your Web Application Project must be configured to use a JDK in order to use JSPs.

JSP를 쓰려면 jdk를 설정해야한다는 뜻인데요. 보통 JDK를 깔고, 이클립스를 실행하면 디폴트로 JRE가 잡혀있어요. 이걸 JDK로 추가해서 바꿔주시면 돼요.

이클립스에서 Window -> Preferences -> Java -> Installed JREs선택.
Add -> Standard VM -> JRE home에서 Directory선택해서 JDK주소를 찾으세요.
디폴트로 설치하셨다면 C:\Program Files\Java\jdk1.6.0_12 여기에 있을겁니다.
폴더만 선택하고, Finsh를 누르면 추가가 되었습니다. 체크박스를 jdk로 옮겨주세요. 그러면 저 위에 에러 안날꺼에요.

그다음으로 겪는 문제점은....-_- 앱엔진에서 지원안하는 클래스를 쓰는 곳이 있는 것 같아요.
spring mvc를 사용하려면 spring.jar하고 spring-webmvc.jar 두개만 있으면 되는데요. 이거 두개 lib폴더에 넣어놓고 서버에 디플로이 시키면
exception is java.lang.NoClassDefFoundError: javax/naming/NamingException
App engine로그를 볼 수 있는데, 거기서 로그를 보면 클래스를 찾을 수 없다고 나와요. spring-orm.jar에서 쓰는 것 같더라구요. 어차피 구글앱엔진은 jdo만 지원해서 jdo only라이브러리가 있습니다-_- 그걸로 바꿔주시면 돼요.
전 라이브러리복사할 때
spring-beans.jar, spring-context-support.jar, spring-context.jar, spring-core.jar, spring-jdbc.jar, spring-orm-jdo-only-2.5.6.jar, spring-test.jar, spring-tx.jar, spring-web.jar, spring-webmvc.jar를 복사했네요.
여기서 spring-orm-jdo-only-2.5.6.jar는 저도 어디서 받은거라.....-_-
그러고 디플로이하면 잘 됩니다.

또 한가지 문제점은 eclipse에서 제공하는 dynamic web project에서는 WEB-INF/lib에 library파일을 복사하면 자동으로 클래스를 코드힌트로 쓸 수 있는데, 이놈은 코드힌트를 할 수 없어요-_- 그래서 수동으로 추가를 해줘야해요.
프로젝트 이름에 Properties를 선택하고, Java Build Path에서 Add JARs에서 추가한 spring파일 등을 선택해서 추가해줘야 에러가 안나네요^^(이건 뭐 다른 방법이 있을 지도.....-_-저에게 최선의 방법이였다는 ㅠ)

또 JDO라는 걸 전혀 몰라서 조금 고생했는데, Hibernate같은 orm이더군요. 사실 아직도 잘 모르겠습니다. 좀 더 알아봐야할 것 같네요. orm하면 Hibernate랑 JPA밖에 없는 줄 알았는데, 뭐 디게 많네요ㅠ

또.....-_- localhost에서 Datastore테스트를 하면 war/WEB-INF/appengine-generated라는 폴더가 생겨요. 디비가 저장되는 것 같은데, 저게 있는 상태에서 디플로이하면 안돼요. 지우고 하면 됩니다.

또 이런저런 문제가 있었는데, 기억이 안나네요. 그래도 정말 대단한 것 같습니다. 대세는 클라우드-_-

참고자료
http://peterbacklund.blogspot.com/2009/04/running-spring-on-google-app-engine.html
http://groups.google.com/group/google-appengine-java/browse_thread/thread/f1a541fe52e172dd

 
Posted by 머드초보
,
 

간단하게 DB에 있는 방명록 정보를 가져오는 정도를 해보겠습니다.

개발환경 : NetBeans6.0 + JDK6u3 + NetBeans내장Tomcat6.0 + iBATIS 2.3.0.677 + MySQL(버전모름-_-) + Spring Framework 2.5

우선 NetBeans6.0이 있어야겠고, Plugin으로 SpringFramework Support를 설치해야합니다.
메뉴에서 Tools -> Plugins클릭하면 Available Plugins를 선택하면 Spring Framework Support가 있는데 체크해서 설치를 하도록 합시다.

그런다음 프로젝트를 생성해봅시다.
File -> New Project선택 후 Web -> Web Application을 선택하고 Server는 Tomcat밖에 사용할 줄 모르니 Tomcat을 선택합니다(GlassFish사용할 줄 아는사람은 고거 선택하고^^)Next를 클릭하고
Project Name은 SpringIbatisExample 이라고 해봅시다. Next를 하면
Framework를 선택하라고 나옵니다. Spring Framework 2.5를 선택하고 Finish를 클릭합시다.

lib를 추가해야합니다. 따로 사용할 것은 iBATIS와 MySQL Connector입니다.
iBATIS는 www.ibatis.com 에서 받으면 되구요. MySQL Connector는 NetBeans에 내장되어있습니다.
프로젝트이름에 대고 오른쪽버튼 클릭 -> Properties -> Libraries -> Add Library 선택 후
MySQL JDBC Driver를 선택해서 추가합니다.
iBATIS는 아무 폴더에 설치 후에 Add JAR로 추가합시다.
넷빈즈에 Manage Libraries에 추가해서 사용하고 싶을 때 추가하게 할 수도 있습니다.

DB URL과 ID, PW를 설정해봅시다.
WEB-INF폴더 아래 jdbc.properties파일이 있는데 보면 어떤걸 설정해야할지 알껍니다.
driverClassName에는 com.mysql.jdbc.Driver를 넣고, url, id, pw를 넣으면 됩니다.

※DB구조입니다.
[code]CREATE TABLE `guestbook` (
  `no` int(11) NOT NULL auto_increment,
  `password` varchar(20) default NULL,
  `name` varchar(250) default NULL,
  `subject` varchar(2000) default NULL,
  `content` text,
  `ip` varchar(15) default NULL,
  `datetime` datetime default NULL,
  PRIMARY KEY  (`no`)
)[/code]

간단하게 F6을 눌러서 실행되는지 확인해봅시다.
this is the /WEB-INF/jsp/index.jsp 라고 뜨면 된 것입니다.

이제 설정을 해봅시다.
Configuration Files 밑에 applicationContext.xml파일을 열어봅시다.

applicationContext.xml
<!-- ADD PERSISTENCE SUPPORT HERE (jpa, hibernate, etc) --> 요고 밑에다가 작성해봅시다.
[code]<bean id="sqlMapClient"
       class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="/WEB-INF/SqlMapConfig.xml"/>
</bean>

<bean id="guestbookDao" class="com.phpschool.guestbook.db.GuestbookDaoImpl">
    <property name="sqlMapClient" ref="sqlMapClient" />
</bean>
   
<bean name="guestbookManager"
      class="com.phpschool.guestbook.service.GuestbookManagerImpl">
    <property name="guestbookDao" ref="guestbookDao" />
</bean>[/code]
iBATIS에서 sqlMap을 생성하는 부분입니다. 오...3줄이면 끝나는군요.
아래는 Dao를 하나 선언해줍니다. 이 Dao는 sqlMapClient를 받습니다. 그래서 이 sqlMapClient를 통해
sql문에 접근할 수 있습니다. 그리고 그 아래에 있는 bean은 Manager입니다. Dao를 이용해서 service로직을 구현하는 부분입니다.

그러면 저기 sqlMapClient property에 있는 configLocation에 SqlMapConfig.xml파일을 만들어봅시다.
Web Pages -> WEB-INF에 대고 New -> Other하고 XML Document를 선택하고 SqlMapConfig.xml파일을 생성한 뒤 다음과 같이 씁시다.

SqlMapConfig.xml

[code]<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sqlMapConfig     
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"     
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
    <typeAlias alias="GuestbookVO" type="com.phpschool.guestbook.vo.GuestbookVO"/>
   
    <sqlMap resource="com/phpschool/guestbook/db/MySQLGuestbook.xml" />
</sqlMapConfig>
[/code]
다음과 같이 sqlMapConfig를 생성합니다. alias는 아래 resource에서 사용할 클래스 이름의 별명을 사용하게 하는 것입니다. 예를 들어 ResultClass 등에서 패키지명까지 다 입력해주어야하는데 alias를 지정해주면 클래스명만 써도 됩니다.
그리고 아래는 resource, 즉 sql들을 모아둔 xml파일입니다.
우선 제끼고 ValueObject를 만들어봅시다.
Source Packages에 대고 New -> Java Package선택 후 Package Name을 com.phpschool.guestbook.vo 라고 줘서 vo라는 패키지를 만듭시다.
그리고 New -> Java Class선택 후 Class Name을 GuestbookVo라고 합시다.

GuestbookVo.java
[code]private int no;
private String password;
private String name;
private String subject;
private String content;
private String ip;
private Timestamp datetime;[/code]
위 까지만 타이핑하고, Alt + Ins 하면 Getter And Setter가 나오는데 선택하고 전체를 다 선택하면 자동으로 setter와 getter가 만들어집니다.

아 힘들어-_-; 다음 이시간에-_-;

 
Posted by 머드초보
,
 
글쓰기 부분입니다.

얘는 Form이 들어가서 살짝 복잡합니다-_-;












writeController를 보도록 합시다.
[code]
<bean id="guestbookWriteValidator"
  class="com.mudchobo.guestbook.logic.GuestbookWriteValidator" />
 
<bean id="writeController"
  class="com.mudchobo.guestbook.controller.WriteController">
  <property name="sessionForm" value="true" />
  <property name="commandName" value="guestbookWrite" />
  <property name="commandClass"
    value="com.mudchobo.guestbook.logic.GuestbookWrite" />
  <property name="validator" ref="guestbookWriteValidator" />
  <property name="formView" value="list" />
  <property name="successView" value="list.do" />
  <property name="guestbookManager">
   <ref bean="guestbookMan" />
  </property>
</bean>
[/code]
writeController를 보면 여러가지 property가 있습니다. 사실......-_-; 잘 모르겠습니다-_-;
commandClass는 GuestbookWrite클래스를 값으로 사용하는데 이 클래스는 지금 현재 폼에 input이 3개가 있습니다. 이름, 제목, 내용. 이 3가지를 GuestbookWrite라는 VO에 담으려고 쓰는 것 같습니다.
그리고 validator는 guestbookWriteValidator를 참조했는데 이것은 GuestbookWriteValidator라는 클래스입니다. 이걸 Validator로 쓰겠다는 겁니다. 이것은 값을 받았을 때 해당 폼의 input의 값이 ""이면 에러를 추가하도록 되어있습니다. 사실 이부분 구현하다 말았습니다-_-;(귀차나서-_-)

formView는 list, list.jsp를 말하는 것 같습니다. successView는 성공시에 list.do를 수행하라는 겁니다.
guestbookManager는 Manager클래스를 참조합니다. 참조해서 데이터를 넣어야 하기 때문이죠 ^^

자 이제 실질적으로 하는 Controller를 보도록 합시다.
[code]
protected ModelAndView onSubmit(HttpServletRequest request,
   HttpServletResponse response, Object command, BindException errors)
   throws Exception {
  GuestbookVO guestbookVO = new GuestbookVO();
 
  guestbookVO.setName(((GuestbookWrite)command).getName());
  guestbookVO.setSubject(((GuestbookWrite)command).getSubject());
  guestbookVO.setContent(((GuestbookWrite)command).getContent());
  guestbookVO.setIp(request.getRemoteAddr());
  guestbookVO.setDatetime(new Timestamp(System.currentTimeMillis()));
 
  guestbookManager.writeGuestbook(guestbookVO);
 
  return new ModelAndView(new RedirectView(getSuccessView()));
 }
[/code]
우선 form액션을 수행하는 Controller는 SimpleFormController를 상속받아요. onSubmit메소드를 오버라이드합니다. 폼을 채우고 글쓰기버튼을 눌렀을 때 write.do를 수행하는데 그것을 수행하게 되면 writeController를 수행합니다.
command를 GuestbookWrite형으로 형변환하는군요. 아....위에 commandClass가 이건거 같군요.
저렇게 하니까 getName 등의 getter를 사용할 수 있군요.
그것을 가져와서 guestbookVO setter에 넣습니다. ip주소나 시간은 따로 생성합니다.
writeGuestbook메소드를 호출하니 그냥 끝나는군요.
writeGuestbook메소드를 보도록합시다.
[code]
public void writeGuestbook(GuestbookVO guestbookVO) {
  jdbcTemplate = new JdbcTemplate(dataSource);
  String query = "INSERT INTO guestbook (name, subject, content, ip, datetime) " +
      "VALUES (?, ?, ?, ?, ?)";
 
  Object[] params = new Object[] { guestbookVO.getName(),
          guestbookVO.getSubject(),
          guestbookVO.getContent(),
          guestbookVO.getIp(),
          guestbookVO.getDatetime() };
 
  jdbcTemplate.update(query, params);
 }
[/code]
insert 쿼리를 만들고 5가지의 ?를 넣었네요. 거기에 Object를 생성해서 각각의 값을 불러와서 넣어주고 가볍게
update한번하니 끝나네요. 와 간단해요!

아.....아무도 안볼꺼지만 그래도 그나마 저의 삽질이 도움이 되시는 분이 한분이라도 계셨으면 좋겠네요 ^^

 
Posted by 머드초보
,
 



확실히 db연동부분은 쉽군요-_-; try catch도 안해도 되고, 커넥션 같은것도 스프링에서 다 알아서 해줘요-_-;
처음 틀만 제대로 만들어놓으면 개발하는데에는 더 속도가 빨라질 것 같아요.









우선 ListController클래스를 봅시다.
[code]
List<GuestbookVO> contentslist = getGuestbookManager().getContents();  
return new ModelAndView("list", "contentslist", contentslist);
[/code]
멤버변수로 있는 guestbookManager는 springapp-servlet.xml에서 알아서 셋팅되니 우리는 그냥 getter만 하면 됩니다. 가져와서 getContents()메소드를 호출하면 List를 다 가져오는 메소드입니다.

자세히 보도록 합시다.
GuestbookManagerDao클래스는 인터페이스입니다. GuestbookManagerDaoJdbc클래스는 저 인터페이스를 구현해 놓은 클래스입니다.
getContents()메소드
[code]
@SuppressWarnings("unchecked")
public List<GuestbookVO> getContents() {
 
  jdbcTemplate = new JdbcTemplate(dataSource);
  String query =
  "SELECT no, name, subject, content, ip, datetime FROM guestbook ORDER BY no DESC";
 
  List<GuestbookVO> contentslist =
                   (List<GuestbookVO>)jdbcTemplate.queryForList(query);
 
  return contentslist;
 }
[/code]
코드를 보니 예전에 스트럿츠에서하던 try-catch-finally는 다 걷어버리고, 딸랑 몇개만 남았어요. 커넥션하는것도 없어요-_-; 매우 간단해요!-_-;
아....참고로 저렇게 해도 나쁜방식입니다. 원래는 하나하나 매핑해줘야한다더군요.(이것도 아이군한테 혼났어요-_-;)
dataSource는 xml에서 다 해주니 새로운 jdbcTemplate을 생성합니다. 이 생성된 jdbcTemplate이 제공하는 메소드중에 queryForList라는게 있는데 query를 주면 자동으로 List형태로 반환해주는 메소드입니다.
저렇게 리스트 형식으로 받게 됩니다. 자동으로 가져오는 것보다 매퍼라는게 있는데 그걸로 매핑해서 하는게 명확한 표현입니다.
아 그리고 저렇게하면 워링이 뜨는데 그건 프레임워크에서 만들어진 List형에 아무것도 안붙어있기때문이죠.
jdk1.5.0이상부터는 List에는 형태를 명시해주기로 되어있어요. ex) List<GuestbookVO>
가볍게 무시를 해줍시다-_-;
이클립스에서 해주는데 @SuppressWarnings("unchecked") 라고하면 워링이 사라집니다.

이제 Controller는 이 List를 받아서 list.jsp을 요청하면 List를 넘겨줍니다.
list.jsp를 봅시다.
[code]
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/jsp/include.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><fmt:message key="title"/></title>
</head>
<body>

<form action="write.do" method="post">

이름 : <input name="name" type="text"/>
제목 : <input name="subject" type="text"/><br />
내용 : <br /><textarea name="content" rows="10" cols="50"></textarea><br />
<br />
<input type="submit" value="글쓰기"/>
<br />
<spring:hasBindErrors name="guestbookWrite">
 <b>필드를 채워주세요!</b>
</spring:hasBindErrors>
<hr />
</form>
<c:forEach var="contentslist" items="${contentslist}">
 <div>
 <p>이름 : ${contentslist.name}</p>
 <p>제목 : ${contentslist.subject}</p>
 <p>내용 : ${contentslist.content}</p>
 <p>아이피 : ${contentslist.ip}</p>
 <p>날짜 : ${contentslist.datetime}</p>
 </div>
 <hr />
</c:forEach>

</body>
</html>
[/code]
spring태그는 우선 가볍게 무시합시다. 위에 쓰기위한 폼이 있고, 아래에는 forEach를 통해 반복하고 있군요.
list.jsp에 딸려온 contentslist에 있는 것을 반복해서 출력해줍니다.
저거 el표기법인데 구글에서 가볍게 검색해서 공부해봅시다(사실 저도 잘 모릅니다-_-;)
jstl도 가볍게 검색해주고-_-;

 
Posted by 머드초보
,