Beginning Spring学习笔记——第3章(三)文件上传、异常处理和个性化
来源:互联网 发布:数据挖掘软件容易使用 编辑:程序博客网 时间:2024/06/10 03:09
上传文件
Spring提供了两种上传文件的方法,使用Commoms FileUpload多部分请求流程以及使用Servlet 3.1多部分请求流程
首先在Web上下文(即springmvc-servlet.xml)中定义多部分解析器,定义方式对应相应上传流程
<!-- 使用Servlet 3.1的多部分解析器 --><bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"></bean><!-- 使用Commoms FileUpload的多部分解析器 --><bean id="multipartResolver" class="org.springframework.web.multipart.commoms.CommomsMultipartResolver"></bean>
对于Servlet 3.1方法,还要在web.xml文件中的DispatcherServlet的定义中使用multipart-config标签配置上传流程
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> <multipart-config> <location>c:/Tools/Up/</location> <max-file-size>4194304</max-file-size> <max-request-size>4194304</max-request-size> <file-size-threshold>4194304</file-size-threshold> </multipart-config> </servlet>
其中location为保存上传文件的目录位置,max-file-size为上传文件最大大小限制(单位为字节),max-request-size为数据请求最大大小限制(单位为字节),file-size-threshold为上传文件被保存到临时文件夹之前允许的最大字节数
而对于Commons FileUpload方法,则是定义解析器属性来配置上传流程
<bean id="multipartResolver" class="org.springframework.web.multipart.commoms.CommomsMultipartResolver"> <property name="uploadTempDir" value="/tmp"/> <property name="maxUploadSize" value="/tmp"/> <property name="maxInMemorySize" value="/tmp"/></bean>
其中uploadTempDir为保存上传文件的临时目录,默认为Web应用程序的Servlet容器临时目录。maxUploadSize为上传被拒绝前最大字节数,maxInMemorySize为上传文件保存到临时文件夹前允许的最大字节数。
异常处理
在控制器类中,使用@ExceptionHandler注解来定义处理某个异常的方法,并使用@ControllerAdvice注解标记某个通用的异常处理控制器,控制器中包含了一系列使用@ExceptionHandler、@InitBinder和@ModelAttribute注解标记的方法,从而使遇到的异常能以返回异常处理页面的方式解决。
下例演示了异常示例的解决,首先定义一个找不到用户的异常类
public class UserNotFoundException extends Exception { public UserNotFoundException(String name) { super("User not found with name: " + name); }}
在控制器中使用如下代码
@Controllerpublic class UserController { private Map<String, User> users = new HashMap<String, User>(); @PostConstruct public void setup() { users.put("Madoka", new User("Madoka", "Kaname")); users.put("Homura", new User("Akemi", "Homura")); } @RequestMapping(value = "/form") public ModelAndView user() { return new ModelAndView("userForm", "user", new User()); } @RequestMapping(value = "/result") public ModelAndView processUser(String name) throws Exception { ModelAndView modelAndView = new ModelAndView(); User user = users.get(name); if ("Madokami".equals(name)) { throw new Exception(); } if (user == null) { throw new UserNotFoundException(name); } modelAndView.addObject("u", user); modelAndView.setViewName("userResult"); return modelAndView; } @ExceptionHandler(UserNotFoundException.class) public ModelAndView handleException(UserNotFoundException e) { ModelAndView modelAndView = new ModelAndView("errorUser"); modelAndView.addObject("errorMessage", e.getMessage()); return modelAndView; }}
其中标记的handleException方法处理用户找不到的异常。
其他的全局异常则交给异常处理类中的方法处理,异常处理类如下:
@ControllerAdvicepublic class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ModelAndView handleException() { return new ModelAndView("errorGlobal"); }}
部署到服务器上运行,打开网页,输入mert
显示找不到用户
输入Madoka,返回用户信息
输入Madokami触发全局异常
国际化
通过区域设置解析器,根据用户区域设置配置多语言支持。
初始化区域设置解析器时,DispatcherServlet在springmvc-servlet.xml中查找名为localResolver的Bean,没找到则配置使用AcceptHeaderLocaleResolver Bean。
为了使用区域设置解析其,在上下文文件中定义区域设置解析器和区域设置更改拦截器
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <context:component-scan base-package="com.lonelyquantum.wileybookch3" /> <context:annotation-config /> <mvc:annotation-driven /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/" /> <property name="suffix" value=".jsp" /> </bean> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basename" value="classpath:messages" /> </bean> <mvc:interceptors> <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> <property name="paramName" value="lang" /> </bean> </mvc:interceptors></beans>
拦截器中将paramName属性值设置为lang,消息资源包中将路径设置为classpath:message,对应工程中的如下文件:
JSP欢迎页面为:
<%@ page contentType="text/html;charset=UTF-8" %><%@taglib uri="http://www.springframework.org/tags" prefix="spring" %><html><head> <title>Spring MVC Internationalization</title></head><body> Language: <a href="?lang=en_US">English</a>-<a href="?lang=tr_TR">Turkish</a>-<a href="?lang=zh_CN">Chinese</a> <h2> <spring:message code="welcome"/> </h2> Locale: ${pageContext.response.locale}</body></html>
其中的Locale参数触发执行LocaleChangeInterceptor。注意,为使在propterties文件中用UTF-8表示的中文能正确显示,需要将网页的字符集定义为UTF-8。
得到的几种语言的页面:
使用主题
由支持主题的资源包、主题解析器以及主题更改拦截器组成。三者在上下文配置文件中定义如下:
<context:component-scan base-package="com.lonelyquantum.wileybookch3" /> <context:annotation-config /> <mvc:annotation-driven /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/" /> <property name="suffix" value=".jsp" /> </bean> <bean id="themeSource" class="org.springframework.ui.context.support.ResourceBundleThemeSource"/> <bean id="themeResolver" class="org.springframework.web.servlet.theme.SessionThemeResolver"> <property name="defaultThemeName" value="dark" /> </bean> <mvc:interceptors> <bean id="themeChangeInterceptor" class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"> <property name="paramName" value="theme"/> </bean> </mvc:interceptors>
资源包是ThemeResource的实现,负责从类路路径中加载属性文件,属性文件中通过键/值对列出所有主题资源,键是资源名称,值是访问资源的URI。如下深色属性文件dark.properties的内容
style=css/dark.css
其对应的主题资源文件dark.css为:
body { background-color: black; color: white;}
主题资源解析器决定哪个主题被解析,其中的属性defaultThemeName为默认属性文件的名称,在用户第一次请求时使用。
themeChangeInterceptor包含在<mvc:interceptor>标签中,为有序拦截器集合的一个元素。paramName属性是JSP中用来设定主题的键值。
对应页面JSP文件如下:
<%@ page contentType="text/html;charset=ISO-8859-9" %><%@taglib uri="http://www.springframework.org/tags/form" prefix="mvc" %><%@taglib uri="http://www.springframework.org/tags" prefix="spring" %><html><head> <title>Spring MVC Themes</title> <link rel="stylesheet" href="<spring:theme code="style"/>" type="text/css" /></head><body>Theme :<a href="?theme=light">Light</a> - <a href="?theme=dark">Dark</a><br/><mvc:form modelAttribute="user" action="result.mvc"> <table> <tr> <td><mvc:label path="username">User Name</mvc:label></td> <td><mvc:input path="username" /></td> <td><mvc:errors path="username" /></td> </tr> <tr> <td><mvc:label path="email">E-Mail</mvc:label></td> <td><mvc:input path="email" /></td> <td><mvc:errors path="email" /></td> </tr> <tr> <td><mvc:label path="ccNumber">Credit Card Number</mvc:label></td> <td><mvc:input path="ccNumber" /></td> <td><mvc:errors path="ccNumber" /></td> </tr> <tr> <td><mvc:label path="password">Password</mvc:label></td> <td><mvc:password path="password" /></td> <td><mvc:errors path="password" /></td> </tr> <tr> <td colspan="3"> <input type="submit" value="Submit" /> </td> </tr> </table></mvc:form></body></html>
不同主题展示结果:
工程目录结构如下
- Beginning Spring学习笔记——第3章(三)文件上传、异常处理和个性化
- Beginning Spring学习笔记——第3章(二)表单处理
- Beginning Spring学习笔记——第2章(三)Spring的Bean管理
- Beginning Spring学习笔记——第5章(一)ORM和JPA基础
- Beginning Spring学习笔记——第3章(一)Spring MVC基础
- Beginning Spring学习笔记——第6章(三)使用Spring进行编程式事务管理
- Beginning Spring学习笔记——第4章(三)将JDBC操作模块化为Java对象
- Beginning Spring学习笔记——第1章
- Beginning Spring学习笔记——第9章 SpEL
- Beginning Spring学习笔记——第10章 缓存
- Beginning Spring学习笔记——第2章(一)Spring IoC容器
- Beginning Spring学习笔记——第4章(一)Spring JDBC连接的配置
- Beginning Spring学习笔记——第5章(二)Spring的JPA支持
- Beginning Spring学习笔记——第6章(一)Spring事务管理基础
- Beginning Spring学习笔记——第2章(二)依赖注入
- Beginning Spring学习笔记——第7章 使用Spring进行测试驱动开发
- Beginning Spring学习笔记——第8章 Spring AOP
- Beginning Spring学习笔记——第4章(二)使用Spring执行数据访问操作
- resin4.0.53安装部署文档
- [PAT甲级]1012. The Best Rank (25)(最好排名)
- 它可以通过前述的 Kafka, Flume等数据源
- android ExpandableListView三级菜单的使用
- 字符串问题---最小包含子串的长度
- Beginning Spring学习笔记——第3章(三)文件上传、异常处理和个性化
- 单例模式
- CORS——跨域请求那些事儿
- AVL 平衡二叉搜索树原理及编程实现 (C++)版本 第二版
- Android Saving Data
- 关于内存泄漏---auto_ptr
- loadrunner11 回放脚本Action.c(94): 错误 -27979: 找不到请求的表单 [MsgId: MERR-27979]
- LR回放https协议脚本失败:[GENERAL_MSG_CAT_SSL_ERROR]connect to host "XXX" failed:[10054] Connection reset by
- android MAGNETIC_FIELD