springMVCのclasspathとfileの違い

spring

springの設定ファイル(servlet-context.xml)で使う、classpathfileの違いを紹介します

[スポンサーリンク]

classpathfileは、プロパティファイルやメッセージファイルを読み込む時に使います。使い分けが出来ると非常に便利です。
classpathとfileを使ったことがない方や、見たことはあるけど使い方が分からない方でも分かるように紹介をすすめていきます。

この章でやること

classpathとfileの使い方を紹介します。
classpathとfileの違いを紹介します。

classpathとfileの使い方

spring設定ファイル(servlet-context.xml)に追記します。
プロパティファイルを読み込むクラスを2つ設定します。

    <bean id="classpathProperties"
        class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="locations">
            <list>
                <value>classpath:classpath.properties</value>
            </list>
        </property>
    </bean>

    <bean id="fileProperties"
        class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="locations">
            <list>
                <value>file:${user.home}\Documents\GitHub\spring-classpath-file\src\main\resources\file.properties</value>
            </list>
        </property>
    </bean>

servlet-context.xmlで設定したクラスは、このように使います。

@Controller
public class HomeController {

    @Autowired
    private Properties classpathProperties;

    @Autowired
    private Properties fileProperties;

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {

        String classpath = 
            classpathProperties.getProperty("app.test");
        String file = 
            fileProperties.getProperty("app.test");
 
        model.addAttribute("classpath", classpath );
        model.addAttribute("file", file );
        return "home";
    }
	
}

今回はJSPも使用したので、JSPのソースも載せておきます。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	Hello world!  
</h1>

<P>  classpath is ${classpath}. </P>

<P>  file is ${file}. </P>

</body>
</html>

解説1

classpathは、main/resourcesディレクトリをトップレベルとみなします。

fileは、フルパスでディレクトリを指定します。
フルパスでプロジェクト外のディレクトリも指定することが出来ます。

servlet-context-classpath-file1

解説2

fileで指定している、${user.home}はカレントディレクトリが入ります。
windowsマシンであれば、C:\Users\ユーザ名\を指定したことになります。

classpathとfileの違い

classpathは、main/resourcesディレクトリを参照します。
fileは、フルパスでプロジェクト外のディレクトリも指定出来ます。

springMVCのバージョン

org.springframework-versionは、3.1.0を使っています。
javaは、1.7.13を使っています。

ダウンロード

GitHubでサンプルソースを公開しています。こちらからご自由にダウンロードして下さい。
demo

最後に

classpathとfileの違いは以上になります。
使いどころとしては、プロジェクト内のリソースファイルを参照する場合は、classpathで十分だと思います。
外部のファイルを参照したい場合のみ、fileを使用することで使い分けましょう。

リソースファイルの読み込み方を理解していないと、junitを作るときハマってしまいがちです。
classpathとfileの違いについて調べていた時に、Web上で日本語ドキュメントがみつからなかったので、いつか自分で書きたいと思っていました。
それでは!