spring一些知識點(一)

一、全局實例初始化

在項目中,有時我們需要對某些類進行初始化。全局實例,會一直存在,不會被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一些常用的東西做個小小的總結,希望多多指教吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章