增加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. 502 Bad Gateway深究

    早上收到502报警,设置的报警规则是502错误两分钟超过500就报警. 排障流程: 日志分析系统报障-->查看日志系统日志-->nginx错误日志-->php错误日志-->ph ...

  2. MyEclipse部署web项目到Tomcat出现An internal error occurred during: "Launching on Tomcat 7.x"的问题

    如果出现了上述的错误按照如下的3个步骤解决:1.首先关闭MyEclipse工作空间.2.然后删除工作空间下的文件."MyEclipse10\workspace.metadata.plugin ...

  3. 静态方法中不能new内部类的实例对象的总结

    class Test{ public void main(String[] args){ A testA=new A(); //这里会出现问题 new Thread(new Runnable(){ p ...

  4. C语言基础(11)-随机数发生器

    一. rand() rand是一个C语言库函数,功能是生成一个随机数.rand需要一个不同的种子,才能生成不同的随机数. 二. srand(int seed) rand需要一个不同的种子,才能生成不同 ...

  5. python网络编程学习笔记(三):socket网络服务器(转载)

    1.TCP连接的建立方法 客户端在建立一个TCP连接时一般需要两步,而服务器的这个过程需要四步,具体见下面的比较. 步骤 TCP客户端 TCP服务器 第一步 建立socket对象  建立socket对 ...

  6. jq 根据值的正负变色

    效果图这样: 意思就是根据最后的百分值变色,值为负变绿色,值为正变红色. 所以只要取到那个标签里的值了,就能根据正负的判断决定颜色. 我的html部分这样: /*不过他们都说我的dom结构不太合理,同 ...

  7. Linux下实现秒级的crontab定时任务

    crontab的格式如下 * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 ...

  8. 阿里无线前端性能优化指南 (Pt.1 加载优化)

    前言 阿里无线前端团队在过去一年对所负责业务进行了全面的性能优化.以下是我们根据实际经验总结的优化指南,希望对大家有所帮助. 第一部分仅包括数据加载期优化. 图片控制 对于网页特别是电商类页面来说,图 ...

  9. c#在字符串中计算加减乘除...

                DataTable dt = new DataTable();             Response.Write(dt.Compute("1+1*5", ...

  10. 怎么把Maven项目转为动态Web项目?