今回は、書籍の登録処理を追加します。まず
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の
<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に追加
