增加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. mysql 控制台 快捷方式

    程序--附件--命令提示符 cd C:\Program Files\MySQL\MySQL Server 5.5\bin 我安装的5.5的默认目录,或者也可以增加path路径,直接打开cmd就可以登陆 ...

  2. 分享公司DAO层数据库结果映射到对象的方法

    主题 前面写过一篇文章,分享了公司是怎么动态封装SQL查询条件的(http://www.cnblogs.com/abcwt112/p/5874401.html). 里面提到数据库查询结果二维数组最后是 ...

  3. [Storm] Storm与asm的恩恩怨怨

    asm的引用冲突 1. Jersey & Storm 0.9.3 jersey 1.8 (which depends on asm 3.0) Storm 0.93 (which depends ...

  4. Sentiment Analysis resources

    Wikipedia: Sentiment analysis (also known as opinion mining) refers to the use of natural language p ...

  5. Form Builder的三种查询方法构建

    1.使用DEFAULT_WHERE: DECLARE   V_DEFAULT_WHERE VARCHAR2(32767);  V_WHERE         VARCHAR2(32767); BEGI ...

  6. 11i和R12配置JAR包

    R11:$IAS_ORACLE_HOME/Apache/Jserv/etc/jserv.properties R12: 方法1:直接解压JAR包放到$JAVA_TOP下: 方法2:编辑:$ORA_CO ...

  7. 输出 Office 报表

    以 word 为例: 将 word 存为 Word2003 XML,其中苹果等部分即是 xml 如下: 服务器端通常输出 HTML,HTML 是文本,XML也是文本,可以简单的套用服务器端网页的思路. ...

  8. JavaWeb监听器的使用(一)监听上下文和会话信息

    1.监听上下文的类 package com.examp.ch9; import java.io.FileOutputStream; import java.io.PrintWriter; import ...

  9. nubia Z5 mini 小牛 黑砖qhsusb dload修复

    给手机分区,用了分区助手,将一些分区移动. 结果分区坏了,只有两三个分区在电脑显示,当时晕菜把数据线拔了重插. 手机变砖,不能启动,黑屏,不能进recovery... 参考 http://bbs.nu ...

  10. 解决svn问题:Wrong committed revision number: -1

    参考:http://my.oschina.net/luckyi/blog/291007