今回は、書籍の登録処理を追加します。まず
struts-config.xmlから見ていきましょう。






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


        '-//Apache Software Foundation//DTD Struts Configuration 1.1//EN'
    'http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd'>


   



   


  

   


   


   

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

追加したアクションは太字部分です。入力用画面のinsert.jspと結果画面のresult.jsp
です。

呼び出しはそれぞれ、/insertedit.do、/insert.doですが、/insert.doを直接呼び出すこと
はありません。(入力情報がないと登録処理ができない)

※現在はこの制御はしないため、/insert.doを直接呼び出すと、SQLExceptionが
発生します。スコープ内のActionForm(BookCatalogFormクラス)からデータを取得
できないためです。

「登録画面から正しく登録ボタン押下によって/insert.doが呼ばれること」が条件と
なります。アプリケーション側で上記のような制御ロジックを入れる必要があります。


insert.jspは、isbn番号とタイトルの入力テキストとsubmitボタンのみの画面で、
result.jspは登録が成功したらメッセージを表示するだけのどちらも簡単な画面です。



insert.jsp
-------------------------------------------------------------------




<html:html>
<
head>
<
title>書籍登録画面title>

head>
<
body>
<
html:form action='/insert'>
<
div align='center' class='body'>

<h2>書籍登録font>h2>
<
table>
    <
tr height='40px'>
        <
td>isbn番号td>
        <
td>
            <
html:text name='bookCatalogForm' property='isbn' maxlength='10'/>
        td>
    tr>

    <tr height='40px'>
        <
td>タイトルtd>
        <
td>
            <
html:text name='bookCatalogForm' property='title' maxlength='100'/>
        td>
    tr

    <
tr height='40px'>
        <
td>概要td>
        <
td>
            <
html:textarea name='bookCatalogForm' property='content' />
        td>
    tr>
table>
<
br>
<
html:submit value='登録' />
div>
html:form>
body>
html:html>
-------------------------------------------------------------------

<html:form action='/insert'>のStrutsタグ部分は、struts-config.xmlの

要素を参照して





と解釈されます。


result.jsp
-------------------------------------------------------------------

<html>
<
head>
<
title>登録完了title>
head>
<
body>
<
div align='center' class='body'>

登録しました。

<BR>

<html:link action='/insertedit' >戻るhtml:link>

body>
html>
-------------------------------------------------------------------



実装の方を見てみましょう。まず、登録処理に必要となる登録用RDBMS操作クラス
InsertBookクラスを新規追加します。

これは以前、コマンドラインベースのアプリケーションで使用したものです。それを
そのまま使っています。RDBMS操作クラスを使うことでこのように簡単にクラスの
使い回しが出来ます。

package dao;

import java.sql.Types ;
import javax.sql.DataSource ;
import org.springframework.jdbc.core.SqlParameter ;
import org.springframework.jdbc.object.SqlUpdate ;

public
class InsertBook extends SqlUpdate{

    private static final String sqlStr = 'INSERT INTO book(isbn , title)'
  
                                     +' VALUES(? , ?)' ;

    public InsertBook(DataSource ds) {

        super(ds , sqlStr) ;

        super.declareParameter(new SqlParameter('isbn', Types.VARCHAR)) ;

        super.declareParameter(new SqlParameter('title', Types.VARCHAR)) ;

          compile() ;

    }

}

 

InsertBookクラスを使うBookDaoImplクラスを追加修正します。
BookDaoImplクラスに追加したinsertBookメソッドがそのままサービス
メソッドになります。

※BookCatalogインターフェース、BookCatalogImplクラスのinsertBook
メソッドに対応しています。




package
dao ;

import java.util.List ;
import org.springframework.dao.DataAccessException ;
import org.springframework.jdbc.core.support.JdbcDaoSupport ;

import
model.Book;

public
class BookDaoImpl extends JdbcDaoSupport implements BookDao{

    protected void initDao() throws Exception {

        this.bookListQuery = new BookListQuery(getDataSource()) ;
        this.insertBook = new InsertBook(getDataSource()) ;

}
   //書籍をisbnで検索する(RDBMS操作クラスを使う)
   
private BookListQuery bookListQuery ;

   public List getBookList(String isbn) throws DataAccessException {

        return this.bookListQuery.execute(isbn) ;

    }
   //書籍を追加する(RDBMS操作クラスを使う)
   
private InsertBook insertBook ;

    public void insertBook(Book book) throws DataAccessException {

       this.insertBook.update(new Object[]
            {book.getIsbn() ,
  
      book.getTitle()}) ;

        }
}



そして、実際にapplicationContextからインスタンスを取得する
BookCatalogImplクラスにサービスメソッド(insertBookメソッド)を
追加します。

※BookCatalogにインターフェース(API)を定義し、BookCatalogImplクラス
で実装します。DIコンテナから実装のインスタンスを受けとりインターフェース
に代入します。これは基本ですね。

package model ;

import
java.util.List;
import model.Book;

public interface BookCatalog {
  
List getBookList(String isbn);
  
void insertBook(Book book);
}

 

package model ;

import
dao.BookDao;
import model.Book;
import java.util.List;

public
class BookCatalogImpl implements BookCatalog{
  
private BookDao bookDao;
   
    public
void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

   public List getBookList(String isbn) {
        return this.bookDao.getBookList(isbn);
    }

    public void insertBook(Book book){
        this.bookDao.insertBook(book);

    }

}

最後に登録処理を行うActionクラス(InsertActionクラス)を新規追加します。
ソースを見て分かると思いますが、登録に関する処理は
bookCatalog.insertBook(book) ;だげです。


DIによってdatasource、DAO(BookDaoImpl クラス)、サービスオブジェクト
(BookCatalogImpl クラス)が連鎖的にインジェクションされて、サービスメソッド
(insertBookメソッド)から一気にDB登録処理が実行されます。

package action;

import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import
org.springframework.web.struts.ActionSupport;
import org.springframework.context.ApplicationContext;

import action.form.BookCatalogForm;
import model.BookCatalog;
import model.Book;

public class InsertAction extends ActionSupport{

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

        BookCatalogForm bookCatalogForm = (BookCatalogForm)form;

       // AppricationContex取得
        ApplicationContext applicationContext = getWebApplicationContext();

        BookCatalog bookCatalog = (BookCatalog)applicationContext.getBean('bookCatalog');

        // 書籍情報(入力)の取得
        Book book = new Book() ;
        book.setIsbn(bookCatalogForm.getIsbn()) ;
        book.setTitle(bookCatalogForm.getTitle()) ;

       //DBへ登録(ビジネスロジックはこれだけ)
       bookCatalog.insertBook(book) ;

        return mapping.findForward('success');

    }

}

以上で簡易的な書籍の登録機能の追加が出来ました。今回の機能追加では
DIの設定(applicaitonContext.xml)の変更はありません。



文字化け対策


JSPでエンコーディングを指定していましたが、文字化けが発生するので、
以下のようにSpringのCharacterEncodingFilterを使用することにしました。


web.xmlに追加


    CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
   
        encoding
        Shift_JIS
   

   
   
  
     forceEncoding
  
     true
  


  
CharacterEncodingFilter
    /*