增加logo的技术点:文件上传,国际化

文件上传的功能在struts2中是使用文件上传拦截器完成的。

1.首先需要在页面上添加一个文件上传的超链接。

点击该超链接能够跳转到文件上传页面。我给该表单页面中的field字段使用了logo作为名字,即name=logo。

2.在SurveyAction中进行表单的接收。接收的类型包括文件名、文件类型和文件本身,以方便处理,给每个字段都提供了set/get方法。

 //上传的logo图片
private File logo; //上传的logo的文件
private String logoFileName ; //上传的文件的名称
private String logoContentType ; //上传的文件的类型
public String getLogoFileName() {
return logoFileName;
}
public void setLogoFileName(String logoFileName) {
this.logoFileName = logoFileName;
}
public String getLogoContentType() {
return logoContentType;
}
public void setLogoContentType(String logoContentType) {
this.logoContentType = logoContentType;
}
public File getLogo() {
return logo;
}
public void setLogo(File logo) {
this.logo = logo;
}

3.书写文件上传的工具类该工具类能够将文件上传之后将服务器中该文件的相对路径以字符串的形式返回,曾经写过一个类似的文件上传工具类(在jbpm工作流项目实战中),但是上一个工具类返回的是文件本身。

 public static String saveUploadFileToDestDir(File sourceFile, String infactFileName){
SimpleDateFormat sdf=new SimpleDateFormat("/yyyy/MM/dd");
Date date=new Date();
String aimPath=ServletActionContext.getServletContext().getContextPath()+"/upload"+sdf.format(date);
String dirPath=ServletActionContext.getServletContext().getRealPath("/upload")+sdf.format(date);
File dir=new File(dirPath);
if(!dir.exists()){
dir.mkdir();
}
String []arrFileNames=infactFileName.split("\\."); String lastFileName=arrFileNames[arrFileNames.length-1];
File destFile=new File(dir,UUID.randomUUID().toString().replaceAll("-", "")+"."+lastFileName);
try {
FileUtils.copyFile(sourceFile, destFile);
} catch (IOException e) {
System.out.println("保存文件失败!");
}
return "/upload"+sdf.format(date)+"/"+destFile.getName();
}

4.在Action中书写上传逻辑。

 //实施上传logo动作的方法
public String doUploadLogo() throws Exception{
//首先需要保存住上传的文件!
String fileName=FileUploadUtils.saveUploadFileToDestDir(logo, logoFileName);
//接着需要将保存住的文件和Survey对象关联起来
model=this.surveyService.getModelById(model.getSurveyId());
model.setLogoPath(fileName);
System.out.println(fileName);
this.surveyService.updateSurvey(model);
return "toDesignSurveyPageAction";
}

从上面的代码中能够看出来,上传文件之后,保存到数据库中的是文件路径,而且是相对路径。

5.在设计调查页面上使用相对应的代码将图片显示出来。

 <!-- 在这里加上一个logo标识 -->
<s:if test="isLogoImageExists()">
  <img width="40px" alt="这是logo标识" src="<s:url value='%{logoPath}'/>"/>
</s:if>
<s:else>
  <!-- 如果图片不存在,则什么都不显示 -->
</s:else>

这里调用了SurveyAction中的一个方法isLogoImageExists(),要注意,这个方法必须写在SurveyAction中,在struts2中支持直接调用Action中的方法,但是如果想要调用自定义工具类中的方法,就需要换一种写法,而且必须配置struts2中的配置文件使其支持静态调用才行。

6.SurveyAction中的判断logo是否存在的方法。

 //一个方法专门判断上传的文件是否存在!
public boolean isLogoImageExists() throws Exception{
String fileName=this.model.getLogoPath();
File file=new File(sc.getRealPath(fileName));
return file.exists();
}

当然这里并没有指定默认的logo,在参与调查页面中我指定了一个默认的logo,否则太难看了。

7.文件上传的要点在上面已经差不多说完了,但是上面说的只是没有异常情况发生一切正常的情况下才能正常运行,必须采取一定的措施防止异常情况的发生。

(1)通过修改文件上传拦截器对文件的上传类型、文件上传扩展名、文件上传大小进行限制。因为在struts.xml文件中已经重新制定了新默认拦截器栈,所以如果想要修改文件上传拦截器,一定要是新的拦截器栈,而不是之前的默认的拦截器栈,完整配置文件内容如下。

 <?xml version="1.0" encoding="utf-8" ?>
<!-- <!DOCTYPE struts SYSTEM "file:\\\D:\程序\java\struts2\dtd\struts-2.3.dtd"> -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"file:\\\D:\程序\java\struts2\dtd\struts-2.3.dtd">
<struts>
<package name="surveyPackage" namespace="/" extends="surveyparkPackage">
<action name="SurveyAction_*" class="com.kdyzm.struts.action.SurveyAction" method="{1}">
<result name="toMySurveyPageAction" type="redirectAction">
<param name="actionName">SurveyAction_toMySurveyPage.action</param>
<param name="namespace">/</param>
</result>
<result name="toMySurveyPage">/survey/showMySurveyPage.jsp</result>
<result name="designSurveyPage">/survey/designSurveyPage.jsp</result>
<result name="toEditSurveyPage">/survey/eidtSurveyPage.jsp</result>
<result name="toUploadLogoPage">/survey/updateLogoPage.jsp</result>
<result name="input">/survey/updateLogoPage.jsp</result>
<interceptor-ref name="surveyparkStack">
<!-- <param name="fileUpload.maximumSize">60000</param> -->
<param name="fileUpload.allowedExtensions">.jpg,.jpeg,.png,.gif,.bmp</param>
<param name="fileUpload.allowedTypes">image/jpg,image/jpeg,image/pjpeg,image/bmp,image/gif,image/png</param>
<param name="fileUpload.useActionMessageBundle">true</param><!--这个是告诉拦截器需要到Action所在目录找资源文件-->
</interceptor-ref>

</action>
</package>
</struts>

(2)指定错误页

<result name="input">/survey/updateLogoPage.jsp</result>

  这样在文件上传不满足指定条件的时候就会自动跳转到指定的错误页上去了。

8.虽然通过7已经完成了对异常情况的处理,但是错误页上显示的信息都是英文,一般人看不懂,需要对信息进行国际化处理。

国际化的步骤:

  打开struts2-core-2.3.1.2.jar

      |---org.apache.struts2

        |---struts-messages.properties

  文件,在该文件中保存了所有的默认提示信息,将文件上传的几个重要信息拷贝出来。

  

  我们只需要用到上面的三条信息。

  在和SurveyAction同目录下创建一个SurveyAciton_zh_CN.properties文件,将上面的三条信息拷贝进去。然后重写写值部分,由于是中文,所以如果直接写会直接被编码,被编码是正确的,否则还要手动编码。网上有很多是编码失败的,我也不明白为什么直接写中文之后会直接被正确编码,但是在jsp页面中显示的时候就是中文了,我也没有使用其它方式手动编码,大概是我用的eclipse是比较新的版本的缘故吧。

  

  当然千万不能忘了需要修改文件上传拦截器让其和Action所在的文件夹中找和Action名字匹配的资源文件,配置方式:

<param name="fileUpload.useActionMessageBundle">true</param>

  这个实际上在之前的配置文件中已经显示出来了,但是之前没有提为什么要这么配置。

9.上传logo全部细节已经搞定,下面是测试的界面

  (1)单击增加logo按钮

  (2)选择文件

  当然,上面的文件学则错误了,看看有什么提示

  (3)错误提示

  当然,是文件类型和扩展名都不允许,但是文件类型不允许的配置提示在前,所以首先显示这条信息。

  (4)如果上传成功直接跳转到设计调查的页面并将logo显示出来。

【Java EE 学习 72 上】【数据采集系统第四天】【增加调查logo】【文件上传】【动态错误页指定】【上传限制】【国际化】的更多相关文章

  1. 【Java EE 学习 72 下】【数据采集系统第四天】【移动/复制页分析】【使用串行化技术实现深度复制】

    一.移动.复制页的逻辑实现 移动.复制页的功能是在设计调查页面的时候需要实现的功能.规则是如果在同一个调查中的话就是移动,如果是在不同调查中的就是复制. 无论是移动还是复制,都需要注意一个问题,那就是 ...

  2. Java EE学习——Quartz的Cron表达式

    经历过低谷后,还是要好好学习,越失落会越来越落后. 今天写一下Cron表达式的用法,虽然是之前自己写的,也过了挺长一段时间,这次就拿出来作为回顾吧. Cron表达式是Quartz的精髓(个人觉得),比 ...

  3. Java EE 学习(9):IDEA + maven + spring 搭建 web(5)- 博客文章管理

    转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) . 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) Jav ...

  4. Java EE 学习(8):IDEA + maven + spring 搭建 web(4)- 用户管理

    转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) ava E ...

  5. Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库

    参考: https://my.oschina.net/gaussik/blog/513444 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 ...

  6. Java EE 学习(6):IDEA + maven + spring 搭建 web(2)- 配置 Spring

    参考:https://my.oschina.net/gaussik/blog/513353 注:此文承接上一文:Java EE 学习(5):IDEA + maven + spring 搭建 web(1 ...

  7. Java EE 学习(5):IDEA + maven + spring 搭建 web(1)

    参考:http://www.cnblogs.com/lonelyxmas/p/5397422.html http://www.ctolib.com/docs-IntelliJ-IDEA-c--1590 ...

  8. Java EE 学习(4):IDEA + maven 搭建 web(2)

    参考:http://www.bubuko.com/infodetail-1855067.html 现使用 Maven 创建项目:本节接Java EE 学习(3):IDEA + maven 搭建 web ...

  9. 【Java EE 学习 74 上】【数据采集系统第六天】【使用Jfreechart的统计图实现】【Jfreechart的基本使用方法】

    之前已经实现了数据的采集,现在已经有了基本的数据,下一步就需要使用这些数据实现统计图的绘制了.这里使用Jfreechart实现这些统计图的绘制.首先看一下Jfreechart的基本用法,只有知道了它的 ...

随机推荐

  1. Hybrid APP混合开发的一些经验和总结

    http://www.cnblogs.com/kingplus/p/5588339.html 写在前面: 由于业务需要,接触到一个Hybrid APP混合开发的项目.当时是第一次接触混合开发,有一些经 ...

  2. 12月5日PHPCMS替换主页

    cms替换主页的步骤 1.先做好静态页面: 2.在D:\wamp\www\phpcms\install_package\phpcms\templates文件夹下建新的文件夹tianqiwangluo( ...

  3. Nodejs事件引擎libuv源码剖析之:句柄(handle)结构的设计剖析

    声明:本文为原创博文,转载请注明出处. 句柄(handle)代表一种对持有资源的索引,句柄的叫法在window上较多,在unix/linux等系统上大多称之为描述符,为了抽象不同平台的差异,libuv ...

  4. Linux学习笔记<六>

    进程与程序 1.子程序与父程序 PID是进程的ID,PPID是其父进程的ID 登录bash之后,就是获取了一个名为bash的PID,在这个环境上所执行的其他命令,就是其子程序 common@commo ...

  5. 【先定一个小目标】Windows下Redis的安装使用

    Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  6. window 使用vagrant搭建开发开发环境

    # -*- mode: ruby -*-# vi: set ft=ruby : # All Vagrant configuration is done below. The "2" ...

  7. Quick Cocos 旋转子弹的实现中我学到的

    self 在lua中相当于java中的this lua中的任何变量在没有赋值前, 都可以看做是nil  lua变量有3种,成员变量: self.变量名 = 局部变量: local 变量名 = 全局变量 ...

  8. jvm--4垃圾收集

    6. 垃圾收集GC (1)当需要排查各种内存溢出,内存泄漏等问题,当GC成为系统达到更高性能的瓶颈时,我们就需要对这些自动化的GC进行监控和调节. (2)PC计数器.本地方法栈.虚拟机栈,随方法或者线 ...

  9. C和指针 第十五章 二进制I/O

    二进制I/O 数据写入到文件效率最高的是用二进制形式写入,二进制输出避免了在数值转换为字符串过程中,所涉及的开销和精度损失,但而精致并非人眼所能阅读,所以这个技巧只有当数据被另一个程序按顺序读取才能使 ...

  10. C#高级编程笔记 2016年10月26日 MVC入门 Controller

    1.MVC的定义:   Models: Classes that represent the data of the application  and that use validation logi ...