- 浏览: 230471 次
- 性别:
- 来自: 武汉
最新评论
-
spp_1987:
org.springframework.beans.facto ...
Hibernate4之多对多双向关联 -
spp_1987:
后台保存订单下面 有很多订单 调了 对应什么方法 实现的?
Hibernate4之多对多双向关联 -
spp_1987:
订单 和 商品之间 有中间表存在吗???
Hibernate4之多对多双向关联 -
spp_1987:
跟 官方 hibernate4.2.5提供 的 manytom ...
Hibernate4之JPA规范配置详解 -
zhuguopei_java:
谢谢。楼主你这是解释源码吗
Struts2中action接收参数的三种方法及ModelDriven和Preparable接口结合JAVA反射机制的灵活用法
Struts2的上传下载是整合了commons-fileupload-1.2.2.jar这个包的功能,不过还需要commons-io-2.3.jar这个包的支持。其实上传下载功能主要是配置,下面是我的一个小例子,
可以实现上传下载,并且渲染图片到页面的效果,AbstractBaseAction这个基类代码可以翻看我之前写的博文中有贴出代码。
大概主要下面几点:
1.提交表单form的enctype属性
2.struts.xml的配置,下载要注意result的type,上传要注意拦截器的配置,这里我还配置了资源文件,利用国际化来做文件上传表单的验证功能。
可以实现上传下载,并且渲染图片到页面的效果,AbstractBaseAction这个基类代码可以翻看我之前写的博文中有贴出代码。
大概主要下面几点:
1.提交表单form的enctype属性
2.struts.xml的配置,下载要注意result的type,上传要注意拦截器的配置,这里我还配置了资源文件,利用国际化来做文件上传表单的验证功能。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <constant name="struts.custom.i18n.resources" value="messages" /> <constant name="struts.configuration.xml.reload" value="true" /> <constant name="struts.enable.SlashesInActionNames" value="true" /> <constant name="struts.ognl.allowStaticMethodAccess" value="true" /> <constant name="struts.multipart.maxSize" value="30480000" /> <constant name="struts.ui.theme" value="simple" /> <package name="main" extends="struts-default"> <default-interceptor-ref name="paramsPrepareParamsStack" /> <action name="*-*" class="com.chou.web.PlayerAction" method="{2}"> <interceptor-ref name="token"> <param name="includeMethods">save</param> </interceptor-ref> <interceptor-ref name="paramsPrepareParamsStack"> <param name="fileUpload.allowedTypes">image/bmp,image/png,image/gif,image/jpeg,image/jpg,image/x-png,image/pjpeg</param> <param name="fileUpload.allowedExtensions">.jpg,.gif,.jpeg,.bmp,.png</param> <param name="fileUpload.maximumSize">20971520</param> </interceptor-ref> <result name="input">player-load.jsp</result> <result name="invalid.token">player-load.jsp</result> <result name="success">{1}-{2}.jsp</result> <result name="list" type="redirect">player-list</result> <result name="download" type="stream"> <param name="contentType">${fileContentType}</param> <param name="contentLength">${fileContentLength}</param> <param name="contentDisposition">attachment;filename="${fileFileName}"</param> <param name="inputName">fileStream</param> <param name="bufferSize">4096</param> </result> </action> </package> </struts>
public class PlayerAction extends AbstractBaseAction<Player> { private static final long serialVersionUID = -3068068486865209475L; PlayerDao playerDao = new PlayerDao(); /** * 文件属性 */ private File file; private String fileFileName; private InputStream fileStream; private String fileContentType; private int fileContentLength; public String list() throws Exception { return SUCCESS; } public void prepareSave() throws Exception { Player player = getModel(); if (getId() != null) { player = playerDao.loadPlayer(getId()); } setModel(player); } public String save() throws Exception { // System.out.println(fileContentType); // System.out.println(fileFileName); Player player = getModel(); if (file != null) {// 新增或者修改照片操作 FileInputStream fis = null; byte[] buf = new byte[(int) file.length()]; try { fis = new FileInputStream(file); fis.read(buf); player.setImage(buf); } catch (IOException e) { e.printStackTrace(); addActionError("读取上传文件失败。"); LOG.error("读取上传文件失败。", e, new String[0]); return ERROR; } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { LOG.error("关闭FileInputStream失败。", e, new String[0]); } } } } else if (file == null && getId() != null) {// 修改操作,但是不修改照片 player.setImage(playerDao.loadPlayer(getId()).getImage()); } if (player != null) { player.setCreatetime(new Date()); playerDao.saveOrUpdate(player); return "list"; } return INPUT; } public void prepareLoad() throws Exception { Player player = getModel(); if (getId() != null) { player = playerDao.loadPlayer(getId()); player.setImage(null); } else { player.setBirthday(new Date()); player.setContract("输入详细合同情况"); } setModel(player); } public String load() throws Exception { return SUCCESS; } public void prepareDownload() throws Exception { Player player = getModel(); if (getId() != null) { player = playerDao.loadPlayer(getId()); } setModel(player); } public String download() throws Exception { if (getId() != null) { try { Player player = getModel(); setFileContentType("image/jpg"); setFileContentLength(player.getImage().length); setFileFileName(new String(player.getName().getBytes(), "iso-8859-1") + ".jpg"); setFileStream(new ByteArrayInputStream(player.getImage())); } catch (Exception e) { LOG.error("加载文件出错。", new String[0]); } } return "download"; } //把图片渲染到页面 public String showImage() throws Exception { byte[] bigImgByte = null; OutputStream out = null; HttpServletResponse response = ServletActionContext.getResponse(); if (getId() == null) { response.setHeader("Content-disposition", "attachment; filename=" + "no.jpg"); response.setContentType("image/jpeg"); out = response.getOutputStream(); out.write(bigImgByte); out.flush(); return NONE; } Player player = playerDao.loadPlayer(getId()); if (player.getImage() == null) { return NONE; } bigImgByte = player.getImage(); try { response.setHeader("Content-disposition", "attachment; filename=" + player.getName().trim().replace(" ", "") + ".jpg"); response.setContentType("image/jpeg"); out = response.getOutputStream(); out.write(bigImgByte); out.flush(); } catch (Exception e) { System.out.println("没有图片!!"); } finally { try { if (null != out) out.close(); } catch (IOException e) { e.printStackTrace(); } } return NONE; } /** * getter....setter */ }
<body> <div align="center"><h1>添加球员</h1></div> <s:if test="hasErrors()"> <s:fielderror/> <s:actionerror/> </s:if> <s:form id="sForm" action="player-save" enctype="multipart/form-data" method="post" onsubmit="return verifyUpload()"> <s:hidden name="id" /> <s:token/> <table align="center" border="1"> <tr> <th>姓名</th> <td><s:textfield name="name" maxlength="20" required="true"/></td> <th>出生日期</th> <td> </td> </tr> <tr> <th>身高</th> <td><s:textfield name="high" maxlength="5"/></td> <th>体重</th> <td><s:textfield name="weight" maxlength="5"/></td> </tr> <tr> <th>球队</th> <td><s:textfield name="team" maxlength="30"/></td> <th>位置</th> <td><s:select name="place" list="placeKinds" listKey="key" listValue="value"/></td> </tr> <tr> <th>号码</th> <td><s:textfield name="no" maxlength="2"/></td> <th>选秀顺位</th> <td><s:textfield name="draft" maxlength="30"/></td> </tr> <tr> <th>国籍</th> <td><s:textfield name="nationality" maxlength="10"/></td> <th>毕业学校</th> <td><s:textfield name="school" maxlength="50"/></td> </tr> <tr> <th>本季工资</th> <td><s:textfield name="salary" maxlength="10"/></td> <th>球员图片</th> <td> <s:file name="file" /> </td> </tr> <tr> <td> <img style="cursor:pointer" alt="<s:property value="name"/>" src="<s:url action="player-showImage" ><s:param name="id"><s:property value="id"/></s:param></s:url>"> </td> <th>合同情况</th> <td colspan="2"><s:textarea name="contract" cols="30" rows="4"/></td> </tr> <tr> <td colspan="4" align="center"> <s:reset value="重置"/> <s:submit value="提交"/> </td> </tr> </table> </s:form> </body>
struts.messages.error.content.type.not.allowed=文件上传失败:你要上传的文件"{1}"文件类型不匹配 struts.messages.error.file.extension.not.allowed=只允许上传图片,请检查文件"{1}"后缀名 struts.messages.error.file.too.large=文件“{1}”大小超过所允许的上限(20M) struts.messages.invalid.token=请不要重复提交表单 xwork.default.invalid.fieldvalue=无效的数据,请检查日期、数值类型数据的格式是否正确"{0}"
发表评论
-
Struts2远程执行漏洞
2013-01-25 22:44 2088Struts2转码有个bug,可以导致应用挂掉(也可以执行类似 ... -
Struts2整合之动态图表OpenFlashChart
2012-07-06 15:56 2848Java开源项目中制作图表 ... -
Struts2整合之CKeditor和CKfinder
2012-07-11 17:29 3302先从官网上下载好最新的CKeditor和CKfinder包之后 ... -
Struts2常用的数据标签
2012-06-30 16:24 1446<s:property /> <s:pr ... -
Struts2常用的集合控制标签
2012-06-30 15:56 2010<s:iterator/>迭代器标签 迭代器标签被 ... -
Struts2标签之token防止表单重复提交
2012-06-29 16:57 2098Struts2的token标签防止表单重复提交的思路是这样的: ... -
Struts2常用的UI标签
2012-06-29 17:03 1767<s:textfield />标签的label属性 ... -
Struts2中OGNL、ActionContext和值栈及线程安全浅析
2012-06-27 17:35 3155值栈(ValueStack) Struts2将OGNL ... -
Struts2之OGNL表达式中#,$,%的用法区别
2012-06-25 22:57 2573struts2 井号,星号,百分号 “#”主要有三种用途: 1 ... -
Struts2精萃之interceptor
2012-06-25 01:00 1910下面这段话能完美诠释拦截器的含义: 拦截器是AOP中的概念, ... -
Struts2的服务器端的四种输入校验方式
2012-06-24 16:34 2676Struts2的服务器端验证框架有四种方式校验,一种是利用do ... -
Struts2的客户端校验方式及自带的13种校验器
2012-06-24 16:22 2615如果要使用Struts2的验证框架,首先要开启这个拦截器。在 ... -
Struts2之国际化i18N配置
2012-06-23 19:19 3278在struts2中需要做国际化的有: jsp页面的国际化,a ... -
Struts2之Web应用中文乱码问题的6种解决方法
2012-06-23 17:29 1567在web应用中通常用下面几种方法解决中文问题: 1.HTM ... -
Struts2配置精要之struts.xml( global和default的配置)
2012-06-23 16:48 5055下面这个struts.xml囊括了所有可能用到的标签用法,例如 ... -
Struts2配置精要之常量constant配置详解(包括零配置Convention 的常量)
2012-06-18 02:30 4201这是目前为止收集的stru ... -
Struts2配置精要之Result Types(Struts2.3.4)
2012-06-17 19:36 10424struts2.3.4的Predefined Result ... -
Struts2配置精要之defaultStack与paramsPrepareParamsStack
2012-06-17 17:56 4266在Struts2.3.4的struts-default.xml ... -
Struts2中action接收参数的三种方法及ModelDriven和Preparable接口结合JAVA反射机制的灵活用法
2012-06-17 00:48 4777Struts2中Action接收参数的方法主要有以下三种: ... -
Struts2原理浅析
2012-06-16 16:12 2144JavaEE把MVC设计模式引入 ...
相关推荐
综上所述,Struts2是一个功能强大且灵活的Java Web开发框架,它不仅提供了丰富的特性,还通过其独特的设计模式和插件机制,使得开发者能够快速构建高质量的Web应用程序。通过对Struts2核心概念和技术的理解,开发者...
Struts2支持OGNL(Object-Graph Navigation Language)作为其默认表达式语言,允许在JSP页面中直接访问对象属性和执行方法,而Struts1使用的是JSP EL(Expression Language)或者自定义的Struts标签。 **4. 视图...
Struts2是一个强大的Java EE应用程序框架,用于构建和维护可扩展、模块化和易于管理的Web应用程序。在Struts2中,标签库是其核心组件之一,极大地简化了视图层的开发,使得开发者可以更加专注于业务逻辑而不是繁琐的...
- 注解配置:在2.3.1版本中,Struts2支持在Action类和方法上使用注解进行配置,使得代码更简洁,更易于维护。 4. **插件系统** - Struts2具有强大的插件机制,可以方便地扩展其功能。例如,Freemarker或Velocity...
它建立在Apache Jakarta的.struts1之上,并吸取了其他框架的优点,如WebWork,提供了更丰富的功能和更好的灵活性。 在初学者的`struts2测试案例`中,我们可以学习到以下核心知识点: 1. **Action类**:Struts2的...
为了调试目的,可以开启Struts2的值栈调试功能,查看栈中的内容,帮助开发者了解当前请求的状态和数据流。 9. **Struts2访问Web元素** Struts2可以通过OGNL(Object-Graph Navigation Language)轻松地访问和操作...
综上所述,Struts2相较于Struts1,在灵活性、可扩展性、易用性和性能方面都有显著提升,特别是在模型驱动、表达式语言、视图管理和拦截器机制等方面展现了明显的优势。然而,选择何种框架还需根据项目需求、团队熟悉...
Struts 2是Struts 1的后续版本,它吸取了WebWork框架的优点,提供了更强大的功能和更灵活的设计。Struts 2的核心概念包括Action、Result、Interceptor和Freemarker或JSP作为视图。Action类取代了Struts 1中的...
综上所述,Struts2.x相对于Struts1.x在多个方面进行了改进和优化,包括但不限于Action的实现方式、工作流程、数据绑定、视图技术以及验证机制,这些改进共同构成了Struts2.x相较于Struts1.x的优势,使其成为现代Web...
Struts 2是Struts框架的一个重要分支,它继承了Struts 1.x的一些特性,并在此基础上进行了大幅度的改进与扩展,使之成为了一个更为强大、灵活的Web开发框架。Struts 2主要应用于Java EE平台上的Web应用开发,其核心...
- **功能齐全的标签库(Tag Library)**:Struts2提供了丰富的标签库,可以帮助开发者更高效地开发页面逻辑,减少了页面代码的复杂度。 - **开源性**:Struts2是开源项目,这意味着开发者可以自由地获取其源代码并...
- Struts2的核心特性之一,可以插入在Action调用前后,实现日志、权限验证、事务管理等功能。 - 默认拦截器栈包含一系列预定义的拦截器,如params(处理参数)、i18n(国际化)和exception(异常处理)。 4. **...
综上所述,《Struts2 in Action》中文版不仅介绍了Struts2框架的基本原理和架构,还深入探讨了如何利用Struts2来构建高效、可维护的Web应用。无论是初学者还是有经验的开发者,都能从这本书中获得宝贵的指导和启发。
在创建一个Struts2工程时,通常需要依赖一系列的jar包来支持其核心功能和其他组件的运行。标题"struts2所需全部jar包"和描述中的"编写struts2工程所必须的几个jar包,绝对全,够用"都表明这些是构建和运行Struts2...
综上所述,Struts2不仅继承和发展了传统的MVC设计模式,还引入了许多创新机制,如强大的配置机制、灵活的拦截器体系结构以及OGNL表达式语言等,使得开发者能够更加高效地构建复杂的企业级应用。
Struts2框架是基于MVC(Model-View-Controller)设计模式的,它的出现是为了改善Struts1的一些局限性,提供了更强大的功能和灵活性。在Struts2中,Action类是处理用户请求的核心,通过配置Action映射,可以将HTTP...
6. **Interceptor**: 拦截器是Struts2的核心特性之一,允许在Action执行前后插入自定义逻辑,如日志记录、权限验证等。 7. **ValueStack**: 用于存储Action的属性和OGNL表达式,便于在视图层和控制器之间传递数据。...
这个框架基于MVC(Model-View-Controller)设计模式,为开发者提供了丰富的功能和API,使得开发者能够更专注于业务逻辑,而不是底层的HTTP处理和页面渲染。 **Struts2 API** Struts2 API是Struts2框架的核心组件之...
综上所述,"struts2 lib2"涉及到的是Struts2框架的使用和其相关库文件的管理,理解这些知识点对于开发和维护基于Struts2的Java Web应用具有重要意义。开发者需要熟悉Struts2的架构、插件系统、OGNL表达式以及如何...