第三十九天學習java

小牛小發表於2020-12-01

總結

json

  • json是一種基於JavaScript 語法開放的輕量級資料交換格式

  • 導包

    • jackson-annotations-2.5.0.jar
    • jackson-core-2.5.0.jar
    • jackson-databind-2.5.0.jar
  • 後臺使用

    @RequestMapping("/add")
    	@ResponseBody
    	public Emp add(Emp emp){
    		return emp;
    	}
    
  • 對日期格式的處理

    • 後臺向前臺傳輸格式時

      • 在日期的get屬性上新增

        @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
        
    • 前臺向後臺傳輸格式時

      • 在日期的set屬性上新增

        @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
        
  • 避免IE返回json時下載檔案的情況

    <!-- 開啟spring對MVC的支援 -->
    <mvc:annotation-driven>
    	<!-- 避免在IE瀏覽器中返回JSON時出現下載檔案的情況 -->
    	<mvc:message-converters>
    		<bean id="mappingJackson2HttpMessageConverter"
    		class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    			<property name="supportedMediaTypes">
    				<list>
    					<value>text/html;charset=UTF-8</value>
    				</list>
    			</property>
    		</bean>
    	</mvc:message-converters>
    </mvc:annotation-driven>
    

檔案的上傳(重點)

  • 在上傳的時候在form表單的屬性中配置

    <form action="/loadon" method="post" enctype="multipart/form-data">
    
  • 在spring-mvc.xml中配置檔案的最大尺寸

    <!-- 設定檔案最大的尺寸 -->
    	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    	<!-- 設定上傳檔案的最大尺寸為10MB -->
    		<property name="maxUploadSize">
    			<!-- spring el寫法:10MB -->
    			<value>#{1024*1024*10}</value>
    		</property>
    	     <!-- 效果同上 
    			<property name="maxUploadSize" value="1048576" />
    		-->
    	</bean>
    
  • 將上傳的檔案拷貝下來

    @Controller
    public class LoadOnController {
    	
    	@RequestMapping("/loadon")
    	@ResponseBody
    	public void loadon(HttpServletRequest req,String username,MultipartFile photo) throws Exception{
    		if(!photo.isEmpty()){
    			//獲取輸入流
    			InputStream in = photo.getInputStream();
    			//通過UUID獲取新的名字
    			String namePath = UUID.randomUUID().toString().replace("-", "")+photo.getOriginalFilename();
    			//得到前面的路徑
    			String realPath = req.getServletContext().getRealPath("/myFile");
    			File dir = new File(realPath);
    			//判斷是否有改路徑
    			if(!dir.exists()){
    				dir.mkdirs();
    			}
    			//拼接路徑
    			File file = new File(dir,namePath);
    			//獲取輸入流
    			OutputStream out = new FileOutputStream(file);
    			//通過工具拷貝資料
    			IOUtils.copy(in, out);
    			//釋放資源
    			out.close();
    			in.close();
    		}
    	}
    }
    

檔案的下載(有時還是會用)

@Controller
public class LoadDownController {

	@RequestMapping("/loaddown")
	public void loadDown(HttpServletRequest req,HttpServletResponse resp,String name) throws Exception{
		//獲取前面的路徑
		String realPath = req.getServletContext().getRealPath("/download");
		File file = new File(realPath,name);
		//獲取輸入流
		InputStream in = new FileInputStream(file);
		
		//設定編碼
		//ie瀏覽器
		if(req.getHeader("User-Agent").toUpperCase().indexOf("TRIDENT")!=-1){
			name = URLEncoder.encode(name, "utf-8");
			//電腦自帶edge【edʒ】瀏覽器	
		}else if(req.getHeader("User-Agent").toUpperCase().indexOf("EDGE")!=-1){		
			name = URLEncoder.encode(name, "utf-8");
		}else{//其他瀏覽器
			name = new String(name.getBytes("UTF-8"),"ISO-8859-1");//轉碼的方式
		};

		//設定彈窗
		//設定相應頭為 檔案下載
		resp.setContentType("multipart/form-data");
		resp.setHeader("Content-Disposition", "attachment;fileName="+name);
		
		//獲取輸出流
		ServletOutputStream out = resp.getOutputStream();
		//拷貝
		IOUtils.copy(in, out);
		//釋放資源
		out.close();
		in.close();
	}
}

過濾器

  • 寫一個類實現HandlerInterceptor,其中preHandle方法用於請求之前攔截,返回值boolean決定是否攔截

  • spring-mvc.xml配置

    	<mvc:interceptors>
    		<mvc:interceptor>
    			<!-- 攔截的路徑   /*只能攔截一層  /a  /b    -->
    			<mvc:mapping path="/**"/>
    			<!-- 不攔截的路徑 -->		
    			<mvc:exclude-mapping path="/fileloadup.jsp"/>
    			<!-- 自己定義的攔截器位置   -->
    			<bean class="cn.itsource.hello.MyInterceptor"></bean>
    		</mvc:interceptor>
    	</mvc:interceptors>