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 にアクセスしてダウンロードリンクをクリックします。
ページのトップへ戻る