天天看點

學習SpringMVC——國際化+上傳+下載下傳

每個星期一道菜,這個星期也不例外~~~

  一個軟體,一個産品,都是一點點開發并完善起來的,功能越來越多,性能越來越強,使用者體驗越來越好……這每個名額的提高都需要切切實實的做點東西出來,好比,你的這個産品做大了,用的人多了,不僅僅再是上海人用,北京人用,還有印度人用,法國人用等等,可以說這個産品已經走上了國際化的大舞台。當印度的哥們輸入url通路産品時,界面上彈出“歡迎您,三哥”,估計哥們當場就蒙圈了。而這個時候,國際化就應運而生了。

  要做國際化這道菜,真的沒有想象中的那麼複雜,反而很簡單,不信你看——

1. 注入ResourceBundleMessageSource

  在SpringMVC.xml添加用于國際化處理的beanResourceBundlMessageSource

<a href="http://www.cnblogs.com/bigdataZJ/p/springmvc5.html#">?</a>

1

2

3

<code>&lt;</code><code>bean</code> <code>id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"&gt;</code>

<code></code><code>&lt;</code><code>property</code> <code>name="basename" value="i18n"&gt;&lt;/</code><code>property</code><code>&gt;</code>

<code>&lt;/</code><code>bean</code><code>&gt;</code>

  這裡property中的name是與注入類中的屬性名一直的,這裡的value決定了後面國際化檔案的名稱,記得是i18n,馬上你就會看到它的用法。

2. 建立國際化檔案

  總共需要建立三個國際化屬性檔案

學習SpringMVC——國際化+上傳+下載下傳

  i18n.properties-預設的國際化檔案

  i18n_en_US.properties-用于英文環境的國際化檔案

  i18n_zh_CN.properties-用于中文環境的國際化檔案

  注意:這裡為什麼檔案的名稱都是i18n開頭,因為在第一點的springmvc.xml配置檔案中,配置的value值就是i18n

  對于i18n.properties和i18n_en_US.properties檔案的内容相同,如下

<code>i18n.username=UserName</code>

<code>i18n.password=Password</code>

  i18n_zh_CN.properties

<code>i18n.username=\u7528\u6237\u540D</code>

<code>i18n.password=\u5BC6\u7801</code>

3.建立頁面

  分别建立兩個頁面,一個是i18n.jsp,顯示使用者名,同時有跳轉到i18n2.jsp的超連結,另一個是i18n2.jsp,顯示密碼,同時有跳轉到i18n.jsp的超連結。

  i18n.jsp

4

5

6

7

8

9

10

11

12

13

14

15

<code>&lt;%@ page language="java" contentType="text/html; charset=UTF-8"</code>

<code></code><code>pageEncoding="UTF-8"%&gt;</code>

<code>&lt;%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %&gt;</code>

<code>&lt;!</code><code>DOCTYPE</code> <code>html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;</code>

<code>&lt;</code><code>html</code><code>&gt;</code>

<code>&lt;</code><code>head</code><code>&gt;</code>

<code>&lt;</code><code>meta</code> <code>http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;</code>

<code>&lt;</code><code>title</code><code>&gt;Insert title here&lt;/</code><code>title</code><code>&gt;</code>

<code>&lt;/</code><code>head</code><code>&gt;</code>

<code>&lt;</code><code>body</code><code>&gt;</code>

<code></code><code>&lt;</code><code>fmt:message</code> <code>key="i18n.username"&gt;&lt;/</code><code>fmt:message</code><code>&gt;&lt;</code><code>br</code><code>&gt;&lt;</code><code>br</code><code>&gt;</code>

<code></code><code>&lt;</code><code>a</code> <code>href="i18n2"&gt;i18n2&lt;/</code><code>a</code><code>&gt;</code>

<code>&lt;/</code><code>body</code><code>&gt;</code>

<code>&lt;/</code><code>html</code><code>&gt;</code>

  

  i18n2.jsp

<code></code><code>&lt;</code><code>fmt:message</code> <code>key="i18n.password"&gt;&lt;/</code><code>fmt:message</code><code>&gt;&lt;</code><code>br</code><code>&gt;&lt;</code><code>br</code><code>&gt;</code>

<code></code><code>&lt;</code><code>a</code> <code>href="i18n"&gt;i18n&lt;/</code><code>a</code><code>&gt;</code>

  同時,顯然我們需要在index.jsp中添加一個入口,連結到i18n.jsp頁面,如下

<code>&lt;</code><code>a</code> <code>href="i18n"&gt;i18n&lt;/</code><code>a</code><code>&gt;</code>

  為了能夠直接點選就連結過去,而不需要通過handler處理并跳轉到視圖的套路,我們需要在springmvc.xml中添加标簽

<code>&lt;</code><code>mvc:view-controller</code> <code>path="/i18n" view-name="i18n"/&gt;</code>

<code>&lt;</code><code>mvc:view-controller</code> <code>path="/i18n2" view-name="i18n2"/&gt;</code>

  這樣就能實作直接在位址欄中直接通路到i18n.jsp和i18n2.jsp頁面了。

學習SpringMVC——國際化+上傳+下載下傳

  小坑:如果i18n.jsp和i18n2.jsp中的編碼方式采用預設“ISO-8859-1”,就會出現頁面顯示亂碼

學習SpringMVC——國際化+上傳+下載下傳

  當把編碼改為“UTF-8”後,就能夠正常顯示

學習SpringMVC——國際化+上傳+下載下傳

  以上是國際化這道菜的基礎做法,那麼如果我還想做一道不用直接通路i18n.jsp,而是經過handler處理後呈現的i18n.jsp,或者我還想做一道不用那麼麻煩還要切換語言的國際化菜,有沒有可能,當然,接着看——

1. 注釋之前在springmvc.xml添加對于i18n.jsp直接通路的标簽

<code>&lt;!--</code>

<code>&lt;mvc:view-controller path="/i18n" view-name="i18n"/&gt;</code>

<code>--&gt;</code>

2. 在Hanlder處理類SpringMVCTest中添加處理接口

<code>@Autowired</code>

<code>private</code> <code>ResourceBundleMessageSource messageSource;</code>

<code>@RequestMapping</code><code>(</code><code>"/i18n"</code><code>)</code>

<code>public</code> <code>String testI18n(Locale locale){</code>

<code></code><code>String val = messageSource.getMessage(</code><code>"i18n.username"</code><code>,</code><code>null</code><code>, locale);</code>

<code></code><code>System.out.println(val);</code>

<code></code><code>return</code> <code>"i18n"</code><code>;</code>

<code>}</code>

  注意這裡注入了國際化處理類ResourceBundleMessageSource,并使用其getMessage方法擷取國際化後的屬性值。

  啟動tomcat服務可以看到

學習SpringMVC——國際化+上傳+下載下傳

  那麼如果根據自己的設定,在不同的語言環境中顯示相應語言的資訊呢

1. 配置SessionLocaleResolver和LocaleChangeInterceptor

<code>&lt;!-- 配置SessionLocaleResolver --&gt;</code>

<code>&lt;</code><code>bean</code> <code>id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"&gt;&lt;/</code><code>bean</code><code>&gt;</code>

<code>&lt;!-- 配置LocaleChangeInterceptor --&gt;</code>

<code>&lt;</code><code>mvc:interceptors</code><code>&gt;</code>

<code></code><code>&lt;</code><code>bean</code> <code>class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"&gt;&lt;/</code><code>bean</code><code>&gt;</code>

<code>&lt;/</code><code>mvc:interceptors</code><code>&gt;</code>

  這裡的LocaleChangeInterceptor主要用于将帶有locale資訊的請求解析為一個Locale對象,并得到一個LocaleResolver對象

  之後這裡的SessionLocalResolver就會将上面的LocalResolver對象轉化為Session的屬性,并從中取出這個屬性,也就是Locale對象,傳回給應用程式。

2. 在index.jsp中添加超連結

<code>&lt;</code><code>a</code> <code>href="i18n?locale=zh_CN"&gt;中文&lt;/</code><code>a</code><code>&gt;</code>

<code>&lt;</code><code>br</code><code>&gt;&lt;</code><code>br</code><code>&gt;</code>

<code>&lt;</code><code>a</code> <code>href="i18n?locale=en_US"&gt;英文&lt;/</code><code>a</code><code>&gt;</code>

  這樣,我們就可以看到結果

學習SpringMVC——國際化+上傳+下載下傳

  說完國際化,再來說說SpringMVC對于json的支援。

  在傳統的開發過程中,我們的handler即controller層通常遵循需要轉向一個JSP視圖的套路;但是這樣的場景并不能滿足所有的要求,比如我們很多時候隻需要傳回資料即可,而不是一個JSP頁面。那麼這時候SPRING MVC3的@ResponseBody和@ResponseEntity就支援這樣的功能。Controller直接傳回資料(這裡我們說說json資料),而不是直接指向具體的視圖。這裡簡單的分别舉一個上傳和下載下傳的例子。

1. 檔案上傳

1.1 使用jquery在index.jsp實作ajax請求

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

<code>&lt;</code><code>script</code> <code>type="text/javascript" src="scripts/jquery-1.9.1.min.js"&gt;&lt;/</code><code>script</code><code>&gt;</code>

<code>&lt;</code><code>script</code><code>&gt;</code>

<code></code><code>$(function(){</code>

<code></code><code>$("#testJson").click(function(){</code>

<code></code><code>var url = this.href;</code>

<code></code><code>var args = {};</code>

<code></code><code>$.post(url, args, function(data){</code>

<code></code><code>for(var i=0; i&lt;</code><code>data.length</code><code>; i++){</code>

<code></code><code>var id = data[i].id;</code>

<code></code><code>var lastName = data[i].lastName;</code>

<code></code><code>alert(id + ": " + lastName);</code>

<code></code><code>}</code>

<code></code><code>})</code>

<code></code><code>return false;</code>

<code>&lt;/script&gt;</code>

<code>&lt;</code><code>a</code> <code>href="emps"&gt;list all employees&lt;/</code><code>a</code><code>&gt;&lt;</code><code>br</code><code>/&gt;&lt;</code><code>br</code><code>/&gt;</code>

<code>&lt;</code><code>a</code> <code>href="testJson" id="testJson"&gt;testJson&lt;/</code><code>a</code><code>&gt;</code>

  這裡核心的就是用jquery寫的ajax請求

  請求的url就是定義的href;

  data為請求響應後傳回的資料;

  正常情況下,我們應該請求到所有員工的資訊,并且通過這裡的周遊得到每一個員工的所有資訊如id、lastName等

1.2. 這裡我們需要引入三個jar包

  jackson-annotation-2.1.5.jar

  jackso-core-2.1.5.jar

  jackso-databind-2.1.5.jar

  這三個主要是用于後面在傳回資料的轉換中用到的。

1.3. 在handler SpringMVCTest中添加接口

<code>@ResponseBody</code>

<code>@RequestMapping</code><code>(</code><code>"testJson"</code><code>)</code>

<code>public</code> <code>Collection&lt;Employee&gt; testJson(){</code>

<code></code><code>return</code> <code>employeeDao.getAll();</code>

  這裡我的個人了解,就是将通過employeeDao查詢到的所有的員工資訊,作為響應傳回給接口,并最終通過一系列處理得到一個json的資料形式,然後在前台頁面中周遊解析。而完成這一切就是歸功于注解@ResponseBody。

  具體來說,是有内部的一些converter來做這些轉換的,在接口方法中打斷點,進入調試

學習SpringMVC——國際化+上傳+下載下傳

  選擇DispatcherServlet,找到this-&gt;handleradapters-&gt;elementData,在這個數組中找到RequestMappingHandlerAdapter,點進去找到messageConverters,便可以看到總共有7個converters

學習SpringMVC——國際化+上傳+下載下傳

  這裡第7個MappingJackson2HttpMessageConverter就是我們添加了以上三個jar包後才加載進來的converter。可以看出,這裡有足夠過對于不同資料類型處理的轉換器。

  最終的上傳結果如下

學習SpringMVC——國際化+上傳+下載下傳

2. 檔案下載下傳

2.1 準備下載下傳源

  在WebContent下建立files目錄,放入aaa.txt,作為下載下傳源

2.2 在index.jsp添加超連結作為下載下傳入口

<code>&lt;</code><code>a</code> <code>href="testResponseEntity" id="testJson"&gt;testResponseEntity&lt;/</code><code>a</code><code>&gt;&lt;</code><code>br</code><code>/&gt;</code>

2.3 在handler SpringMVCTest中添加接口

<code>@RequestMapping</code><code>(</code><code>"testResponseEntity"</code><code>)</code>

<code>public</code> <code>ResponseEntity&lt;</code><code>byte</code><code>[]&gt; testResponseEntity(HttpSession session)</code><code>throws</code> <code>IOException{</code>

<code></code><code>byte</code><code>[] body =</code><code>null</code><code>;</code>

<code></code><code>ServletContext servletContext = session.getServletContext();</code>

<code></code><code>InputStream in = servletContext.getResourceAsStream(</code><code>"/files/aaa.txt"</code><code>);</code>

<code></code><code>body =</code><code>new</code> <code>byte</code><code>[in.available()];</code>

<code></code><code>in.read(body);</code>

<code></code><code>HttpHeaders headers =</code><code>new</code> <code>HttpHeaders();</code>

<code></code><code>headers.add(</code><code>"Content-Disposition"</code><code>,</code><code>"attachment;filename=aaa.txt"</code><code>);</code>

<code></code><code>HttpStatus statusCode = HttpStatus.OK;</code>

<code></code><code>ResponseEntity&lt;</code><code>byte</code><code>[]&gt; response =</code><code>new</code> <code>ResponseEntity&lt;&gt;(body, headers, statusCode);</code>

<code></code><code>return</code> <code>response;</code>

  啟動tomcat,我們可以看到aaa.txt真的可以下載下傳啦~~~

學習SpringMVC——國際化+上傳+下載下傳

  好了,到此為止,我們都幹了啥

  1. 支援國際化

  2. 檔案上傳

  3. 檔案下載下傳

http://www.cnblogs.com/bigdataZJ/p/springmvc5.html

上一篇: linux筆記
下一篇: Linux筆記