一、全局實例初始化
在項目中,有時我們需要對某些類進行初始化。全局實例,會一直存在,不會被GC回收。在spring中覺控制反轉(IOC),下面介紹如何使用。
1、在spring-mvc.xml添加如下配置
(1)不需要初始化參數
<bean id="demoDB" class="my.DemoDB" > </bean>
則 Spring框架在加載時,會創建一個my.DemoDB的實例,名字爲"demoDB"
(2)需要初始化參數
<!-- 初始化全局實例,並初始值 class=類路徑 init-method=執行的方法名-->
<bean id="simpleServer" class="my.SimpleServer" init-method="start">
<!-- 初始值 -->
<property name="ip" value="127.0.0.1" />
<property name="port" value="2233" />
</bean>
此時,spring在初始化實例的時候會初始化ip、port這兩個屬性
2、全局實例的使用,在Handler使用下面代碼即可以使用
//1、獲取全局實例
// 應用上下文
WebApplicationContext ctx
= RequestContextUtils.findWebApplicationContext(request);
DemoDB demoDB = ctx.getBean("demoDB", DemoDB.class);
二、spring框架實現文件下載
1、初始化,文件上傳之前需要初始化,需要在spring-mvc.xml添加如下的配置
<!-- 文件上傳支持 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
<property name="defaultEncoding" value="utf-8" />
<property name="maxUploadSize" value="100000000" />
<property name="maxInMemorySize" value="40960" />
</bean>
2、前端代碼
<form action='app/upload' method='post' enctype='multipart/form-data'>
標籤 <input type='text' name='tag' /> <br><br>
<input type='file' name='file' /> <br> <br>
<input type='submit' value='上傳' />
</form>
3、後端代碼,對文件上傳spring並沒有自己寫一套,也是使用Apache下的庫,所以要導兩個包commons-io-2.4.jar、commons-fileupload-1.3.1.jar,這兩個jar在網上很容易找到,這裏就不多說了,下面看看後端代碼
/**
* 文件上傳
* @param request
* @param response
* @throws Exception
*/
@PostMapping(value = "upload")
public void upload(HttpServletRequest request , HttpServletResponse response) throws Exception
{
MultipartHttpServletRequest mhr = (MultipartHttpServletRequest) request;
String tag = mhr.getParameter("tag"); // 表單裏的 name='tag'
System.out.println("** tag: " + tag);
MultipartFile mf = mhr.getFile("file"); // 表單裏的 name='file'
if(mf != null && !mf.isEmpty())
{
boolean flag = false;
File file = new File("E:/tmp");
if(!file.exists())
{
flag = file.mkdirs();
if(!flag)
{
throw new Exception("文件夾創建失敗");
}
}
String fileName = mf.getOriginalFilename();
File localFile = new File(file , fileName);
mf.transferTo(localFile);
System.out.println("**文件保存在:" + localFile.getAbsolutePath());
}
//返回客戶端
JSONObject reply = new JSONObject();
reply.put("error", 0);
reply.put("reason", "OK, 已上傳");
response.setCharacterEncoding("utf-8");
response.setContentType("application/json");
response.getWriter().write(reply.toString(2));
}
這裏只是簡單介紹文件如何上傳,更詳細可以參考我之前的一篇博文https://blog.csdn.net/AndyWei147/article/details/80636539
三、靜態資源的訪問和文件下載
1、靜態資源的訪問
我們都知道,在web項目中,在wen-inf下面的文件是不能直接訪問的,問了解決這個問題,spring進行了處理,只要在spring-mvc.xml添加如下配置就好,舉例,要想訪問web-inf下面的res文件夾下的資源,可以做如下的配置
<!-- 靜態文件 -->
<mvc:resources mapping="/res/**" location="/WEB-INF/res/" />
值得注意的是,我們的訪問鏈接要能夠被spring攔截這個配置才生效
2、文件下載
不用多說,直接上代碼
package my;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class FileDownController
{
// 文件下載
@GetMapping("photo")
public void down(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException
{
File file = new File("C:\\Users\\andy\\Desktop\\qrcode_for_gh_0f6c8cf66633_1280.jpg");
String fileName = "二維碼.jpg";
// 設置Conten-Type 和 Content-Length
long contentLenth = file.length();
response.setContentType("image/jpeg");
response.setHeader("Content-Length", String.valueOf(contentLenth));
//加上這句瀏覽器會顯示提示下載框
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
// 應答:讀取目標文件發送給客戶端
InputStream input = null;
OutputStream out = null;
try
{
input = new FileInputStream(file);
out = response.getOutputStream();
copy(input, out);
} catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} finally
{
try
{
if (input != null)
{
input.close();
}
if(out != null)
{
out.close();
}
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 讀目標文件
* @param input
* @param out
* @throws IOException
*/
public void copy(InputStream input , OutputStream out) throws IOException
{
byte[] buf = new byte[1024];
while(true)
{
int n = input.read(buf);
if(n < 0) break;
if(n == 0) continue;
out.write(buf, 0, n);
}
}
}
上面對spring一些常用的東西做個小小的總結,希望多多指教吧。