トッカンソフトウェア

Spring MVC ダウンロード

今回はダウンロードをやります。Viewを使う方法でやります。

Viewを使わず、Servletで行う場合はこちらを参照下さい。


設定ファイル

applicationContext.xml

				
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-4.2.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">

	<context:component-scan base-package="spring.test.controller" />

	<mvc:annotation-driven />

	<bean class="org.springframework.web.servlet.view.XmlViewResolver">
		<property name="order" value="1" />
		<property name="location" value="/WEB-INF/spring/views.xml" />
	</bean>
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="order" value="2" />
		<property name="prefix" value="/WEB-INF/" />
		<property name="suffix" value=".jsp" />
	</bean>

</beans>
			
/WEB-INF/spring/views.xmlにビュークラスとIDの一覧を記述し、コントローラでIDが指定された時に紐づくビュークラスが実行されます。
IDがviews.xmlが存在しない場合、Jspファイルをビューとします。

views.xml

				
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">

	<bean id="userCsvView" class="spring.test.UserCsvView" />
</beans>

			
コントローラでuserCsvViewが指定された場合、UserCsvViewクラスが呼ばれます。


pom.xml、web.xmlは初回と同様です。

クラス

モデル

以前、作成したUserModelクラスをそのまま使用します。

コントローラ

				
package spring.test.controller;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import spring.test.UserModel;

@Controller
@RequestMapping(value = "/download")
public class DownloadControler {

	@RequestMapping(method = RequestMethod.GET)
	public String downloadGet(HttpServletRequest request) {
		return "download";
	}

	@RequestMapping(method = RequestMethod.POST)
	public ModelAndView downloadPost(HttpServletRequest request) {
		ModelAndView mv = new ModelAndView("userCsvView");
		ArrayList<UserModel> userList = new ArrayList<>();
		for (int i = 0; i < 3; i++) {
			UserModel um = new UserModel();
			um.setId("ユーザ" + i);
			um.setName("名前" + i);
			userList.add(um);
		}
		mv.addObject("list", userList);
		return mv;
	}
}


			
ModelAndViewのコンストラクタでビューを指定しています。ビューに渡すデータはaddObjectメソッドで渡します。

ビュー

				
package spring.test;

import java.io.PrintWriter;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.view.AbstractView;

public class UserCsvView extends AbstractView {

	@Override
	protected void renderMergedOutputModel(Map<String, Object> map, HttpServletRequest req, HttpServletResponse res)
			throws Exception {
		res.setContentType("text/csv;charset=UTF8");
		String fileName = new String("サンプル.csv".getBytes("Shift_JIS"), "ISO-8859-1");

		res.setHeader("Content-Disposition", "attachment; filename=" + fileName);
		PrintWriter writer = res.getWriter();

		@SuppressWarnings("unchecked")
		List<UserModel> userList = (List<UserModel>) map.get("list");
		for (UserModel um : userList) {
			writer.append(um.getId());
			writer.append(",");
			writer.append(um.getName());
			writer.append("\r\n");
		}
		writer.close();
	}
}

			
AbstractView クラスを継承して作成します。ファイル名は上記のようにやると日本語文字化けしません。
ファイル名が英語の場合は、そのままの文字列でOKです。

コントローラからデータを受け取る場合は、コントローラで指定したキーで受け取れます。

Jsp

download.jsp

ダウンロードするだけの画面です。
				
<%@page import="spring.test.controller.LoginControler"%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<html>
<head>
<title>ダウンロード</title>
</head>
<body>
	<spring:url value="/download" var="url" htmlEscape="true" />
	<form:form name="dl" action="${url}" method="POST">

		<a href="#" onClick="dl.submit();">ダウンロード</a>
	</form:form>
	${msg}
</body>
</html>


			
リンクをクリック時にsubmitが実行されるようにしてます。

実行

http://localhost:8080/springMVC/download にアクセスしてダウンロードリンクをクリックします。



ページのトップへ戻る