spring mvc下载文件简单实现

文件下载有好多种方式,通过返回值,通过servlet的返回输出流等,我们这里使用spring的controller简单实现如何下载文件,并从url传入参数。

这是controller的简单实现,使用aspose.cells解析excel模板,并保存到输出流就可以下载了。

/**
* 下载文件,参数可以通过url传入
*/
@RequestMapping(value="/download/{fileName}.xls")
public void download(@RequestParam(required=false,value="arg1") String arg1,HttpServletRequest request, HttpServletResponse response){
	
	//解析excel模板
	WorkbookDesigner designer = new WorkbookDesigner();  
	String template_file_path = "d:/aspose/cell_sample.xls";  
	Workbook wb = new Workbook(template_file_path); 
	designer.setWorkbook(wb);
	
	//解析数据
	//designer.setDataSource("list", new MapData(getHashMapList()));//map list作为数据源
	//designer.process();//全自动赋值
	
	//文件输出到 输出流
	wb.save(response.getOutputStream(), SaveFormat.EXCEL_97_TO_2003);
	
}

在前端的脚本中直接使用url下载代码如下

window.location = escape("/download/myfile.xls?arg1=val1");

以上简易实现文件下载,注意如果是url传入中文的话,tomcat必须配置url的编码模式为utf-8,要不然的话在后台取到的参数会可能是乱码的。

Spring MVC简单配置

作为一名软件工程师,如果不知道容器界大名鼎鼎的Spring,那么你就奥的了,当然了Spring现在是一个组织,她的下面有很多分支的产品,那么我们先来看看Spring MVC如何简单法?

创建Maven项目

先看看pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>fullstacks.cn</groupId>
	<artifactId>himvc</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<properties>
		<spring.version>4.2.0.RELEASE</spring.version>
	</properties>

	<dependencies>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.freemarker</groupId>
			<artifactId>freemarker</artifactId>
			<version>2.3.23</version>
		</dependency>

	</dependencies>

	<build>
		<sourceDirectory>src</sourceDirectory>
		<resources>
			<resource>
				<directory>src</directory>
				<excludes>
					<exclude>**/*.java</exclude>
				</excludes>
			</resource>
		</resources>
		<plugins>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>2.3</version>
				<configuration>
					<warSourceDirectory>WebContent</warSourceDirectory>
					<attachClasses>true</attachClasses><!-- 把class打包jar作为附件 -->
					<archiveClasses>true</archiveClasses><!-- 把class打包jar -->
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

 

依赖项就不提了,这里我们用freemark模板作为mvc里面的view,看看build元素下几个的意思

sourceDirectory 是配置源代码的目录,个人喜爱直接使用src

resources 是配置资源文件的目录,个人喜爱还是src目录下,非.java的文件都作为资源文件了

plugins 插件配置里面,加入war包的配置,warSourceDirectory 配置页面的目录,个人喜爱直接使用根木录下的WebContent目录,这个跟eclipse一样

当然build元素可以不用配置,那么就用默认maven的目录结构,所有东西都是在src下,个人不是很喜爱。

配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
   
   
    <context-param> 
        <param-name>contextConfigLocation</param-name> 
        <param-value>classpath:config/springmvc.xml</param-value> 
    </context-param> 
    <listener> 
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
 
    <listener>
    	<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>
    
    <servlet> 
        <servlet-name>springmvc</servlet-name> 
        <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class> 
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param> 
    </servlet> 
    <servlet-mapping> 
        <servlet-name>springmvc</servlet-name> 
        <url-pattern>/</url-pattern> 
    </servlet-mapping> 
     
 
</web-app>

这里注意servlet的路径,直接是根路径,也即是所有的请求都是通过spring处理。当然根据个人的喜爱配置指定的路径下才由mvc处理,当然这样的话在访问的时候一定要使用正确的路径。

根据上面的配置spring的配置文件在config/springmvc.xml

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

	<!-- 注解自动扫描 -->
	<context:component-scan base-package="cn.fullstacks" />

	<!-- freemarker view resolver -->
	<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
		<property name="templateLoaderPath" value="/" />
		<property name="defaultEncoding" value="UTF-8" />
	</bean>
	<bean id="freemarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
		<property name="viewClass"
			value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
		<property name="prefix" value="" />
		<property name="suffix" value=".ftl" />
		<property name="order" value="1" />
		<property name="contentType" value="text/html;charset=UTF-8" />
	</bean>

	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
	<!-- 处理静态资源的转向 -->
	<mvc:default-servlet-handler />
	<!-- 支持注解 -->
	<mvc:annotation-driven />

</beans>

这里需要注意的是context:component-scan 扫描指定包下的注解,如果你写的控制器不在这些包里面,spring就不会处理他,这一点一定要记住了,要不然的话你写一个controller然后在页面上访问怎么也访问不到还找不到原因,所以这里的包一般都是配置一个最外层的包,你的所有代码都是在这个包里面的。

freemark的配置就是注意根路径和后缀名就可以了,直接配置跟路径

<property name=”prefix” value=”” />  这是表示是页面文件夹里面的跟

<property name=”suffix” value=”.ftl” /> 后缀名

后面的几个配置都一目了然了。

那么所有配置到这里全部结束,下面就来开发一个界面

一个View,路径page/index.ftl

<html>
	<head></head>
	<body>
		<h1> hi spring mvc. </h1>
	</body>
</html>

一个Controller

package cn.fullstacks;

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

@Controller
public class IndexController {
	
	@RequestMapping("/index")
	public ModelAndView index(){
		return new ModelAndView("page/index");
	}

}

 

那么最简单的这里你的view的路径一定不要带有后缀,因为在配置文件里面已经配置好。

然后映射的url是/index , 那么运行起来之后在浏览器里面访问路径为 http://localhost:8080/himvc/index

看看效果图

image

 

最后献上这个超级简单例子的全部项目代码,himvc