增加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】【文件上传】【动态错误页指定】【上传限制】【国际化】的更多相关文章
-
【Java EE 学习 72 下】【数据采集系统第四天】【移动/复制页分析】【使用串行化技术实现深度复制】
一.移动.复制页的逻辑实现 移动.复制页的功能是在设计调查页面的时候需要实现的功能.规则是如果在同一个调查中的话就是移动,如果是在不同调查中的就是复制. 无论是移动还是复制,都需要注意一个问题,那就是 ...
-
Java EE学习——Quartz的Cron表达式
经历过低谷后,还是要好好学习,越失落会越来越落后. 今天写一下Cron表达式的用法,虽然是之前自己写的,也过了挺长一段时间,这次就拿出来作为回顾吧. Cron表达式是Quartz的精髓(个人觉得),比 ...
-
Java EE 学习(9):IDEA + maven + spring 搭建 web(5)- 博客文章管理
转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) . 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) Jav ...
-
Java EE 学习(8):IDEA + maven + spring 搭建 web(4)- 用户管理
转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) ava E ...
-
Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库
参考: https://my.oschina.net/gaussik/blog/513444 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 ...
-
Java EE 学习(6):IDEA + maven + spring 搭建 web(2)- 配置 Spring
参考:https://my.oschina.net/gaussik/blog/513353 注:此文承接上一文:Java EE 学习(5):IDEA + maven + spring 搭建 web(1 ...
-
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 ...
-
Java EE 学习(4):IDEA + maven 搭建 web(2)
参考:http://www.bubuko.com/infodetail-1855067.html 现使用 Maven 创建项目:本节接Java EE 学习(3):IDEA + maven 搭建 web ...
-
【Java EE 学习 74 上】【数据采集系统第六天】【使用Jfreechart的统计图实现】【Jfreechart的基本使用方法】
之前已经实现了数据的采集,现在已经有了基本的数据,下一步就需要使用这些数据实现统计图的绘制了.这里使用Jfreechart实现这些统计图的绘制.首先看一下Jfreechart的基本用法,只有知道了它的 ...
随机推荐
-
安装mcrypt
Mcrypt扩展是 mcrypt 库的接口,mcrypt 库提供了对多种块算法的支持. 安装mcrypt之前请确认已经安装yum install gcc php-devel 执行命令:yum upda ...
-
Oracle实例和服务知识点
shutdown是对实例而言 service是启动的,根本不代表instance就是启动的. 启动数据库基本可分为三个过程: 1,nomount(即只启动instance,而不加载数据库) 2,mo ...
-
使用火狐的restclient发送http接口post及get请求
1.在firefox安装restclient插件,具体参照http://jingyan.baidu.com/article/1876c8529b07e3890b137623.html: —.发送pos ...
-
BrnShop开源网上商城第五讲:自定义视图引擎
今天这篇博文主要讲解自定义视图引擎,大家都知道在asp.net mvc框架中默认自带一个Razor视图引擎,除此之外我们也可以自定义自己的视图引擎,只需要实现IViewEngine接口,接口定义如下: ...
-
poj 1699 Best Sequence(AC自己主动机+如压力DP)
id=1699" target="_blank" style="">题目链接:poj 1699 Best Sequence 题目大意:给定N个D ...
-
asp.net core 教程(七)-异常处理、静态文件
Asp.Net Core-异常处理 Asp.Net Core-异常处理 在这一章,我们将讨论异常和错误处理.当 ASP.NET Core应用程序中发生错误时,您可以以各种不同的方式来处理.让我们来看看 ...
-
最长公共子序列Lcs(打印路径)
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这 ...
-
Actifio CDS 2TB MDisk limits
**** updated 7 Aug 2016 - reformatted and corrected out of date info *** Background Depending on you ...
-
C# 导出dataGridView中的值到Excel
C# 怎么导出dataGridView中的值到Excel 1 2 3 4 5 6 在系统应用过程中,数据是系统的核心.如果直接在应用软件中看数据,有时也有些不便,所以就会把系统数据转换成Excel格式 ...
-
T440安装Win7系统
于T440自带的是Win8系统,硬盘格式为GPT分区格式,而Win7必须要MRP格式,所以必须要将硬盘格式从GPT修改为MRP,方法如下: 准备工作,下载”电脑店U盘启动盘制作工具“(百度一下,去官网 ...