`
cnwuzhulin
  • 浏览: 28557 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts1文件上传与下载、Token防止重复提交、高级功能

阅读更多

1Struts文件上传与下载、Token防止重复提交、高级功能

1.1Struts的文件上传

使用SmartUpload时,保存文件需要通过saveAs方法来保存,但使用Struts文件上传时,需要通过自己定义的 IO操作来保存文件。接收文件类型参数也在ActionForm中完成,在ActionForm中需要使用FormFile类型的数据来接收。修改之前的教师添加功能。页面表单必须要封装。

文件域,使用html:file<input type=file>

<tr>

<td height="18" bgcolor="#FFFFFF" class="STYLE15">

<span class="STYLE19"><strong>教师照片:</strong>

</span>

</td>

<td bgcolor="#FFFFFF">

<span class="STYLE19"> <label>

<html:file property="photo"></html:file>

</label> </span>

</td>

</tr>

<html:form action="/pages/back/teacher.do" method="post" enctype="multipart/form-data">

不能直接将文件设置到lib对象的photourl。在ActionForm中接收这个photo参数,类型定义为FormFile

private FormFile photo ;

public FormFile getPhoto() {

return photo;

}

public void setPhoto(FormFile photo) {

this.photo = photo;

}

ActionForm中完成文件的上传操作。

public ActionErrors validate(ActionMapping mapping,

HttpServletRequest request) {

ActionErrors errors = new ActionErrors();

// 在进行验证时,先要判断当前的status状态,一般只有insertupdate才需要验证

if ("insert".equals(status)) {

if (teacher.getName() == null

|| teacher.getName().trim().equals("")) {

errors.add("teacher.name", new ActionMessage("name.null"));

}

// 验证通过的情况下要进行文件上传

if (errors.size() == 0) {

InputStream is = null;

FileOutputStream os = null;

try {

// 通过IO流操作来进行保存

is = photo.getInputStream();

// 可以使用两种方法取得物理路径

// this.getServlet().getServletContext().getRealPath();

String path = request.getSession().getServletContext()

.getRealPath("/upload")

+ "/";

// 主文件名使用时间戳生成

String fileName = IPTimeStamp.getIPTimeStamp(request

.getRemoteAddr());

// 扩展名,截取文件名的最后一个.后面的内容

fileName += photo.getFileName().substring(

photo.getFileName().lastIndexOf("."));

os = new FileOutputStream(new File(path + fileName));

// 边读边写

byte[] data = new byte[2048];

int length = 0;

while ((length = is.read(data)) != -1) {

os.write(data, 0, length);

}

// 将教师中的图片路径设置为fileName

teacher.setPhotourl(fileName);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

if (is != null) {

try {

is.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

if (os != null) {

try {

os.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

}

return errors;

}

1.2Token防止重复提交

为了防止重复刷新,Struts提供了一个Token指令牌来进行处理。

其原理是在进入添加页前,在Session范围内保存一个属性(通过UUID生成),同时将这个值在进入添加页时自动保存在表单隐藏域中。当表单提交时,如果两个值相同,表示是第一次提交,允许进行添加操作,而且在添加完成后,将Session范围中的值重新生成。当用户刷新,并重复提交时,表单提交的那个隐藏域的值不变,但Session中的值改变了,比较这两个值,如果不一样,则表示用户进行了重复提交。 

修改library的添加,在进入添加页前的Action操作中,加入保存Session属性的方法。

public ActionForward insertpre(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

LibraryForm libraryForm = (LibraryForm) form;

Map map = BackServiceFactory.getLibrarySeviceInstance().insertper();

request.setAttribute("allItem", map.get("allItem"));// Session中保存一个属性

this.saveToken(request);

return mapping.findForward("insert");

}

页面表单自动生成隐藏域、修改添加部分的Action操作。调用Token的验证方法

public ActionForward insert(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

LibraryForm libraryForm = (LibraryForm) form;

if (this.isTokenValid(request)) {

boolean flag = BackServiceFactory.getLibrarySeviceInstance()

.doCreate(libraryForm.getLib());

<sp

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Struts高级部分(1)(解决重复提交、上传组件)

    本节主要关注Struts在处理两个关键问题上的高级应用:防止重复提交和文件上传组件的使用。 **一、解决重复提交** 在Web应用程序中,重复提交是一个常见的问题,可能导致数据不一致或服务过载。Struts通过几种策略...

    Struts高级部分(1)(解决重复提交、上传组件)笔记

    在本文中,我们将深入探讨Struts框架的两个高级特性:如何防止重复提交以及如何实现文件上传功能。 首先,让我们关注重复提交的问题。在Web应用中,用户可能会因为网络延迟或误操作导致同一个表单数据被多次提交,...

    张孝祥广州讲座-struts高级实战进阶.ppt

    7. **文件上传**:Struts支持文件上传功能,通过使用FileUpload组件,可以在表单中添加文件域,然后在Action中处理文件上传请求。 8. **DispatchAction的应用**:DispatchAction允许一个Action处理多个请求,通过...

    struts2学习笔记.doc

    - 使用Token机制防止重复提交。 - 在`struts.xml`中配置Token拦截器。 - 在Action类中处理Token验证逻辑。 #### 八、杂项 **8.1 常见问题解答** - **问题汇总**:针对Struts2开发过程中常见的问题进行总结和解答...

    张冰struts原代码(全部1-6)之六

    5. **Session与Token机制**:testtokensession.rar和testtoken.rar可能涉及了防止重复提交和session管理的策略。在Web开发中,为了防止用户意外或恶意的重复提交,通常会使用Token机制。同时,session管理也是重要的...

    struts高级实战进阶-传智播客

    防止表单重复提交是Web开发中的一个重要问题,Struts提供了一些机制来解决这个问题,例如使用Token机制或在服务器端检查请求的状态。复选框和下拉列表框的处理则涉及到如何在表单中正确绑定和传递这些组件的值。文件...

    struts2 详解文档

    24. **防止重复提交**:可以使用s:token标签防止表单重复提交的问题。 25. **Struts2整合Spring和Hibernate**:Struts2与Spring的整合可以实现依赖注入,与Hibernate的整合则方便进行持久化操作。 以上就是Struts2...

    struts高级日记

    Struts 支持使用 Token 来防止重复提交表单数据。在页面中可以通过 `&lt;a href="mytoken.do"&gt;&lt;/a&gt;` 的方式指向一个 Action,在该 Action 中保存一个 Token(如 `this.saveToken(request)`),然后在提交表单时验证 ...

    学习struts很好的文档

    Struts提供了一种机制来防止表单重复提交,即通过生成唯一的Token并在每次表单提交时检查该Token的有效性。 ##### 2.Struts应用的国际化 Struts支持通过配置资源文件实现国际化,使应用能够适应不同语言环境。 ##...

    Struts2 in action中文版

    15.3 使用令牌防止表单重复提交 313 15.3.1 使用s:token/表单标签 313 15.3.2 令牌拦截器规则的例外 314 15.4 自动显示等待页面 316 15.5 完成CRUD操作的一个动作 317 15.5.1 CRUD 317 15.5.2 拦截器和接口 318 ...

    传智播客 struts课程笔记 赖家材

    - **防止表单重复提交**:通过使用令牌(token)机制来防止用户的重复提交操作。 - **Struts 验证框架**:Struts 提供了一个强大的验证框架,可以在客户端和服务器端对用户输入进行验证,确保数据的有效性和安全性...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    第15章 防止重复提交 252 15.1 标记管理 252 15.2 使用Token拦截器 253 15.3 使用Token Session拦截器 256 15.4 小结 257 第16章 调试与性能分析 258 16.1 debug标签 258 16.2 Debugging拦截器 259 16.3 性能分析 ...

    ssh 框架技术

    - **Struts2**:解决了Struts1的一些问题,增加了更多高级特性,如拦截器、文件上传等功能。 ##### 3. 为什么要使用Struts2框架 - **简化开发**:提供了丰富的标签库,降低了编码复杂度。 - **易于维护**:MVC模式...

Global site tag (gtag.js) - Google Analytics