※上傳
官網說要有 commons-fileupload
※maven、gradle
compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3.3' ------------------------------- <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency>
※
※spring 設定檔
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8" p:maxUploadSize="10240" />
※不需要 <mvc:annotation-driven />
※id 如果不是這個,就會出「Expected MultipartHttpServletRequest: is a MultipartResolver configured?」的錯,所以複製官網的就好
※controller
@RequestMapping(value = "test_upload", method=RequestMethod.POST)
public String upload(@RequestParam("file") MultipartFile file) {
System.out.println("類型=" + file.getContentType());
System.out.println("參數類型=" + file.getName());
System.out.println("名稱=" + file.getOriginalFilename());
System.out.println("大小=" + file.getSize());
try {
System.out.println("大小=" + file.getBytes().length);
System.out.println("InputStream=" + file.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
return "hello";
}
※不寫 @RequestParam,就會出「Could not instantiate bean class [org.springframework.web.multipart.MultipartFile]: Specified class is an interface」的錯
※測試
<form action="ooo/xxx/test_upload.mvc" enctype="multipart/form-data" method="post"> <input type="file" name="file" /> <input type="reset" value="重置"> <input type="submit" value="提交"> </form>
※如果使用 GET ,就會出「The current request is not a multipart request」的錯
※國際化
※自動轉換
瀏覽器是什麼語言會自動轉換※properties
------------------ i18n.properties ------------------
hello=default hello
mvc.lang=default value
------------------ i18n_en_US.properties ------------------
hello=hello
mvc.lang=english {0}{1}
------------------ i18n_zh_CN.properties ------------------
hello=\u4F60\u597D
mvc.lang=\u7B80\u4E2D {0}{1}
------------------ i18n_zh_TW.properties ------------------
hello=\u4F60\u597D
mvc.lang=\u7E41\u4E2D {0}{1}
※hello=你好,mvc.lang=繁中、简中
※spring 設定檔
<context:component-scan base-package="controller" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/" /> <property name="suffix" value=".jsp" /> </bean> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="i18n" p:defaultEncoding="UTF-8" /> <mvc:annotation-driven /> <mvc:view-controller path="ooo/xxx/next1.mvc" view-name="jump1" />
※連 id 都不能改
※頁面
------------------ index.jsp ------------------
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:bundle basename="i18n">
<fmt:message key="hello" />
</fmt:bundle>
<fmt:message key="hello" />
<a href="ooo/xxx/next1.mvc">next1</a>
------------------ jump1.jsp ------------------
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<h1>jump1</h1>
<fmt:message key="mvc.lang">
<c:choose>
<c:when test="${not empty zero && not empty one}">
<fmt:param value="${zero}" />
<fmt:param value="${one}" />
</c:when>
<c:otherwise>
<fmt:param value="" />
<fmt:param value="" />
</c:otherwise>
</c:choose>
</fmt:message>
<a href="next2.mvc">next2</a>
------------------ jump2.jsp ------------------
<h1>jump2</h1>
${msg}<br />
<fmt:message key="mvc.lang"></fmt:message>
※fmt:bundle basename 是用 jstl 的功能
※注意 index 是第一頁,這時 spring 還沒有連到國際化的檔案,所以只使用第 9 行,就只會出現「???hello???」,按 next1 會有 request,所以再來就不用「fmt:bundle basename」了
※jump1 看起來看多,其實只是要把「{0}{1}」變不見而已
※注意 jump1 要跳到 jump2 的超連結,不用再加 ooo/xxx
※controller
package controller;
import java.util.Locale;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/ooo/xxx/")
public class XxxAction {
@Autowired
private ResourceBundleMessageSource messageSource;
@RequestMapping("next2")
public ModelAndView next2(Locale locale) {
String zero = null, one = null, suc = null;
if (Locale.TAIWAN.equals(locale)) {
zero = "對";
one = "嗎?";
suc = "成功";
} else if (Locale.PRC.equals(locale)) {
zero = "对";
one = "吗?";
suc = "成功";
} else if (Locale.US.equals(locale)) {
zero = "all";
one = " right?";
suc = "success";
}
System.out.println(messageSource.getMessage("mvc.lang", new Object[] { zero, one }, locale));
ModelAndView mav = new ModelAndView();
mav.setViewName("jump2");
mav.addObject("msg", suc);
mav.addObject("zero", zero);
mav.addObject("one", one);
return mav;
}
}
※注意替換 {0} 這種東西時,只有在 java 有用,顯示還是會將「{0}{1}」顯示出來,並不會在頁面替換,所以才有 zero、one 這兩個變數讓前端顯示
※手動轉換
頁面有超連結,想換什麼語言就換什麼語言,有三種,參考官網,這裡只寫 SessionLocaleResolver※頁面
<a href="ooo/xxx/btnChangeLang.mvc?locale=en_US">english</a> <a href="ooo/xxx/btnChangeLang.mvc?locale=zh_CN">简体中文</a> <a href="ooo/xxx/btnChangeLang.mvc?locale=zh_TW">繁體中文</a>
※jump1 和 jump2 的頁面和自動轉換一樣
※controller
@RequestMapping("btnChangeLang")
public String btnChangeLang(Locale locale) {
System.out.println(messageSource.getMessage("mvc.lang", null, locale));
return "jump1";
}
※jump1 有個超連結,會到 next2 方法,方法和自動轉換一樣
※spring 設定檔
<context:component-scan base-package="controller" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/" /> <property name="suffix" value=".jsp" /> </bean> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" /> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="i18n" p:defaultEncoding="UTF-8" /> <mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> </mvc:interceptors> <mvc:default-servlet-handler /> <mvc:annotation-driven />
※id localeResolver、messageSource 不能改
※和自動轉換比,增加了 SessionLocaleResolver 和攔截器 LocaleChangeInterceptor,最後刪除了 mvc:view-controller







