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>

不同主题展示结果:
dark
light

工程目录结构如下
目录结构

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 黑色衣服穿在身上掉色怎么办 电信卡流量超了怎么办 移动卡流量超了怎么办 狗狗老是挠痒痒怎么办 出差同住的同事睡觉打鼾怎么办 小孩皮肤太黑了怎么办 苹果平板突然黑屏打不开怎么办 孩子认人晚上哭怎么办 主腹动脉有硬块怎么办 糖链抗原125偏高怎么办 狗长了个肿瘤怎么办 腺肌瘤糖类抗原125升高怎么办 糖类抗原724单项升高怎么办? 化疗期间糖类抗原升高怎么办? 门面租客到期不搬怎么办 这几天老想初恋怎么办 结婚了还想初恋怎么办 九年了想初恋了怎么办 吃肥肉恶心想吐怎么办 宝宝吃了母乳不吃奶粉怎么办 母猫的奶少怎么办 鲤鱼打挺起不来怎么办 练不会鲤鱼打挺怎么办 鲤鱼打挺脖子痛怎么办 新买的沙发太高怎么办 额最后离开公司没人关灯怎么办 看到我妹妹就烦怎么办 野塘钓鱼不开口怎么办 团关系找不到接收地怎么办 两岁宝宝就是不肯说话怎么办 两岁宝宝不肯吃药怎么办 并蹄莲叶子大黄怎么办 异地恋见面来大姨妈怎么办 奶水太多宝宝老是呛到怎么办 奶水太多吃奶婴儿呛怎么办 人家不愿意交我为朋友怎么办 面对诋毁我的人怎么办 做事太细致速度太慢怎么办 高一儿子早恋了怎么办 儿子18岁谈朋友怎么办 和朋友为钱吵架怎么办