登録機能の説明

登録機能ではプルダウンメニューを使っている箇所が何箇所かあります。これらの内容はデータベースのテーブルに入っています。
読み込みはアプリケーションの立ち上げ時に一度行ってキャッシュしています。将来的にはこのデータをメンテナンスする機能も考えています。
これらのデータは登録前のアクションで読み込み内容はSessionに入れます。(登録前に内容を確認して再度修正したりする機能があるのでSessionに入れます)。

登録前のAction

**
 * 登録する前のプルダウンリストのデータを用意するためのアクション
 * 
 * $Id$
 * Copyright 2009 M Factory
 */
package com.majima.library.action;

import java.util.List;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;

import com.majima.library.entity.Ganre;
import com.majima.library.entity.Media;
import com.majima.library.entity.Owner;
import com.majima.library.entity.Place;
import com.majima.library.entity.TopChar;
import com.majima.library.service.GanreService;
import com.majima.library.service.ItemService;
import com.majima.library.service.MediaService;
import com.majima.library.service.OwnerService;
import com.majima.library.service.PlaceService;
import com.majima.library.util.PulldownUtils;
import com.majima.library.util.TopCharList;
import com.opensymphony.xwork2.ActionSupport;

public class PrepareRegistAction extends ActionSupport {

	@Autowired
	private GanreService gService;
	
	@Autowired
	private MediaService mService;
	
	@Autowired
	private OwnerService oService;
	
	@Autowired
	private PlaceService pService;
	

	@Autowired
	private PulldownUtils pdUtils;
	@Action(
			value = "/Regist_prepare",
			results = {
				@Result(name = "input", location = "/WEB-INF/form/registForm.jsp" )
			}
		)	
	public String prepare() throws Exception {
		List<Ganre> gList = pdUtils.findAllGanre();
		List<Media> mList = pdUtils.findAllMedia();
		List<Owner> oList = pdUtils.findAllOwner();
		List<Place> pList = pdUtils.findAllPlace();
		List<TopChar> tList = TopCharList.getTopCharList();
		HttpSession session = ServletActionContext.getRequest().getSession();
		session.setAttribute("gList", gList);
		session.setAttribute("mList", mList);
		session.setAttribute("oList", oList);
		session.setAttribute("pList", pList);
		session.setAttribute("tList", tList);
		return "input";
	}
	
}

Struts2.1では以下のFilterを使用するのですが、日本語を入力すると文字化けします。

	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

文字化けに対応するには以下のメソッドでできるのですが登録の時と検索結果の表示で同じPOJOを使用しています。
すると、そのPOJOへのsetterで文字化け対応を入れ込むと、データベースから読み込んだデータをPOJOに設定する際にもその部分が使われてしまうのでデータベースから読み込んだ日本語データを正しく表示できません。

文字化けに対応するためのメソッド

package com.majima.library.util;

import java.io.UnsupportedEncodingException;
import org.apache.struts2.ServletActionContext;

public class StringUtils {
	static public String encoding(String str) {
    	try {
            return new String(str.getBytes("iso-8859-1"),
            		ServletActionContext.getRequest().getCharacterEncoding());
        } catch (UnsupportedEncodingException e) {
        }
        return null;
    }
}

最初うまくいかなかったときのsetter

/**
 * 所有物データ
 */
package com.majima.library.entity;

import java.io.Serializable;

import com.majima.library.util.StringUtils;

public class Item implements Serializable {
	
	/** コード */
	private int code;
	/** 頭文字 **/
	private String topChar;
	/** アーティスト */
	private String artist;
	/** タイトル */
	private String title;
	/** 作成年 */
	private int year;
	/** ジャンルコード */
	private int ganreCode;
	/** メディアコード */
	private int mediaCode;
	/** 保管場所コード */
	private int placeCode;
	/** 所有者コード */
	private int ownerCode;
・・・・・・

	public String getTitle() {
		return title;
	}
	
	public void setTitle(String title) {
		this.title = StringUtils.encoding(title);
	}
・・・・・

}

しかたないので、文字入力と表示の部分のsetter,getterを以下のようにしました。

	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
			this.title = title;
	}

	/**
	 * 文字化け対策のgetter
	 * @return
	 */
	public String getCtitle() {
		return getTitle();
	}
	
	/**
	 * 文字化け対策のsetter
	 * @param artist
	 */
	public void setCtitle(String title) {
		this.title = StringUtils.encoding(title);
	}

登録や修正の場合は文字化け対応のsetter,getterを使用し、データベースからの読み込みには上記ソースのsetTitleが使われます。

登録のJSPは以下の様になりました。

%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><s:text name="title.regist"/></title>
</head>
<body>
  <font color="red">
  <s:actionerror/>
  </font>
  <s:set name="convert" value=""></s:set>
  <s:form action="Regist_confirm"> 
    <s:select name="ganreCode" list="#session['gList']" listKey="gCode" listValue="ganreName" label="%{getText('label.ganre')}" value="%{ganreCode}"></s:select>
  	<s:select name="mediaCode" list="#session['mList']" listKey="mCode" listValue="mediaName" label="%{getText('label.media')}" value="%{mediaCode}"></s:select>
 	<s:select name="topChar" list="#session['tList']" listKey="code" listValue="topChar" label="%{getText('label.topChar')}" value="%{topChar}"></s:select>
  	<s:textfield name="cartist" label="%{getText('label.artist')}" value="%{artist}"/>
  	<s:textfield name="ctitle" label="%{getText('label.title')}" value="%{title}"/>
  	<s:textfield name="year" label="%{getText('label.year')}" value="%{year}"/>
	<s:select name="placeCode" list="#session['pList']" listKey="pCode" listValue="placeName" label="%{getText('label.place')}" value="%{placeCode}"></s:select>
  	<s:select name="ownerCode" list="#session['oList']" listKey="oCode" listValue="ownerName" label="%{getText('label.owner')}" value="%{ownerCode}"></s:select>
	<s:submit key="button.confirm"></s:submit>
  </s:form>
  <s:form action="Regist_reset">
    <s:submit key="button.reset"></s:submit>
  </s:form>
</body>
</html>

ctitle,cartistを使っているところがポイントです。