struts简单入门3——拦截器和文件上传
2013-09-30 15:32
337 查看
≡(▔﹏▔)≡今天调了很久。。。而且都是一些很碎碎的错误。。。所以调程序真心是个痛苦的活(>﹏<),经常调半天都调不出来,比较赶时间~~所以先大概写下来免得忘了今天的痛苦经历!!!
继上一次的用户登陆后加入代码:
/anli/adminWelcome.jsp(只有管理员有权添加商品)
Product.java
ProductManagerAction.java
和Product.java一样有这3个字段
关于struts.xml的设置:
上传出错的提示页面(配合struts2标签,不过我比较不怎么会用这个表情,习惯<%%>和c表情多一点):
继上一次的用户登陆后加入代码:
/anli/adminWelcome.jsp(只有管理员有权添加商品)
<a href="product/add_products_admin.jsp">添加商品</a>好了~开始添加商品的地方了~~。。。一堆容易出现的小错误我都写在下面好鸟~
<% Usr u = (Usr)session.getAttribute("usr"); if(u!=null && u.getSuperuser().equals("3")){ %> <!-- 上传文件需要encType的属性为那个,是上传二进制数据。。。但这样不能request.getParameter(),可以考虑smartupload来getRequest --> <form name="form" method="post" action="saveOneProductManagerAction.action" encType=multipart/form-data> 欢迎,<%=u.getUsername()%> <a href="<%=request.getContextPath() %>/clearSession.action">注销</a> <table width="60%"> <tr><td>产品id:<input type="text" name="productId"/></td></tr> <tr><td>产品name:<input type="text" name="productname"/></td></tr> <tr><td>图片:<input type="file" name="upload" /></td></tr> <tr><td><input type="submit" value="添加"/></td></tr> </table> </form> <% }else{ %> <center><h3>对不起,你没有权利查看!</h3></center> <% } %>上面主要代码和注意部分:1.只有user是admin才可以添加商品u.getSuperuser().equals("3");2.提示欢迎用户信息和注销信息(额。。注销的再补上,忘了写。。。);3.提交表单到saveOneProductManagerAction.action;4.设置encType这个属性是保证可以上传文件用的;5.注意表单的名字productId,productname和upload,和后面的代码是有关系的(像我基础不太扎实经常都忘了);6.我眼花一直没看出来的<%=u.getUsername()%>,调了很久,那时候没有写"=",觉得奇怪明明后台调试有数据,怎么就显示不出来;7.request.getContextPath()
Product.java
private String productId; private String productname; private String structure;//imagepath路径和名字ProductDAO.java
public boolean findProductById(String id){ //保证传入的文件没有和table重复id的判断, //比较简单,不写了。。。 //不过一直漏了这句ps.setString(1, id); //调很久一直都说没有参数。。。我还以为id没有传进去呢。。。 }
public void saveProduct(Product product){ String sql = "insert into product(productId,productname,structure) values(?,?,?)"; try{ conn = DBConn.getConnection(); ps = conn.prepareStatement(sql); ps.setString(1, product.getProductId()); ps.setString(2, product.getProductname()); ps.setString(3, product.getStructure()); ps.executeUpdate(); System.out.println("成功添加!内容如下:"); System.out.println("id: "+product.getProductId()+"; name: "+ product.getProductname()+"; imagpath: "+product.getStructure()); }catch(SQLException e){ e.printStackTrace(); }finally{ DBConn.dbClose(conn, ps, rs); } }上面通过executeUpdate()函数执行
ProductManagerAction.java
和Product.java一样有这3个字段
private String productId; private String productname; private String structure;//imagepath另外,还应该有和上传文件相关的属性:
//上传文件属性字段,用FIle类型封装 private File upload; //struts2要求定义文件字段+FileName 和+ContentType的两个字段来封装文件名和文件类型 private String uploadFileName; private String uploadContentType; //选择文件自己的屋里路径 private String filepath; //保存路径属性,该属性的值可以通过配置文件来设置,从而动态注入 private String savepath; //处理结果展示字段tip(主要用于提示出错) private String tip;添加商品用的代码(下面再解析):
public String saveOne()throws Exception{ ProductDAO dao = new ProductDAO(); /* if(this.getProductId()!=null) System.out.println(this.getProductId()); else System.out.println("sdkjlk");*/ if(dao.findProductById(this.getProductId())){ this.setTip(this.getText("productM_tip.id.used"));//商品号被占用,请求重新添加商品 return INPUT; }else{ if(this.getUpload()!=null){ if(this.getUploadContentType().equals("application/vnd.ms-excel")){ this.setTip(this.getText("productM_tip。upload.file.type")); return INPUT;//此处只允许上传图片类型文件,请返回重新选择 } //保存图片名称到数据库字段structure this.setStructure(this.getUploadFileName()); this.setSavepath("D:\\tmp"); //以服务器的文件保存地址和原文件的名 建立上传文件输出流 FileOutputStream fos = new FileOutputStream(this.getSavepath()+"\\"+this.getUploadFileName()); //以上传文件建立一个文件上传流 FileInputStream fis = new FileInputStream(this.getUpload()); //将上传文件的内容写入服务器 byte[] buffer = new byte[1024]; int len = 0 ; while((len = fis.read(buffer))>0){ fos.write(buffer, 0, len); } } System.out.println("—————————结束上传单个文件—————————"); Product product = new Product(); product.setProductId(this.getProductId()); product.setProductname(this.getProductname()); product.setStructure(this.getSavepath()+"\\"+this.getStructure()); dao.saveProduct(product); } return "anli_saveOnesuccess"; }解析:1.用dao和数据库连接起来(解耦);2.findProductById(this.getProductId()))用于检查这个想要添加为文件的id是否已经在数据库存在,this.getProductId()方法和页面add_products_admin.jsp中的text的name属性productId有关系,注意的是,我们新建的这个Action里面的属性就是为了接收页面传送过来的属性值(我是这样理解的:当form提交表单调到某个action时,这个action就可以通过多个属性值对应接收页面中的属性值,只要get、set方法和name对应起来就可以接收);3.关于upload类型要通过File来封装,而struts2要求通过文件名和文件类型来封装文件;4.如果符合要求则可以进行上传文件的操作,通过FileInputStream读入upload的数据,将它们写入到FileOutputStream中;5.上传完毕(这时已经在定义的保存目录下看到文件了)封装Product,并通过dao来保存当前的product对象,这时db里面就存有这个文件的id、name和path
关于struts.xml的设置:
<!-- 此处调用constant元素定义常量 --> <constant name="struts.devMode" value="true"></constant> <!-- 定义资源文件的位置和类型 --> <constant name="struts.custom.i18n.resources" value="properties/myMessages"></constant> <!-- 设置应用使用的解析码 --> <constant name="struts.i18n.encoding" value="GBK"></constant> <!-- 设置应用使用的上传解析器类型 --> <constant name="struts.multipart.parser" value="jakarta"></constant> <!-- 设置临时存储文件 --> <constant name="struts.multipart.saveDir" value="/tmp"></constant> <!-- 指定使用按type的自动装配策略 --> <constant name="struts.objectFactory.spring.autoWire" value="name"></constant> <package name="struts2" extends="struts-default">第二部分关于拦截器的设置:
<action name="*ProductManagerAction" class="com.ascent.action.ProductManagerAction" method="{1}"> <!-- 配置fileUpload拦截器 --> <interceptor-ref name="fileUpload"> <!-- 设置上传文件类型 --> <param name="allowedTypes">image/bmp,image/png,image/jpg,image/jpeg,image/gif, image/pjpeg,image/x-png,application/vnd.ms-excel</param> <!-- 设置上传文件大小 --> <param name="maximumSize">200000</param> </interceptor-ref> <!-- 必须显示配置引用struts默认的拦截器栈 :defaultStack--> <interceptor-ref name="defaultStack"></interceptor-ref> <!-- 设置上传路径 --> <param name="savePath">/upload</param> <!-- 必须设置input逻辑视图,拦截器默认出错返回input --> <result name="input">/product/upload_error.jsp</result> <!-- 成功添加后跳转 --> <result name="anli_saveOnesuccess">/anli/addProductSucc.jsp</result> </action>注意allowedTypes类型有几个多的。。。是为了浏览器的兼容,IE浏览器似乎对后缀名的设置不太同(如image/pjpeg),火狐浏览器倒是正常的后缀名。另外我之前没有设置临时存储文件的时候出错,实际上是不是真的要设置才可以我也不太清楚,注释也挺清楚的,应该再回头看也能看懂吧我= _ =
上传出错的提示页面(配合struts2标签,不过我比较不怎么会用这个表情,习惯<%%>和c表情多一点):
<font color="red" size="3"><s:fielderror/><s:property value="tip"/></font> <a href="javascript:history.back()">返回</a>
相关文章推荐
- [转]简单的Struts文件上传
- struts+newxy(新坐标)文件上传,比jspsmart更简单 作者:胡立新
- Struts2国际化、拦截器配置以及使用struts上传文件
- struts+newxy(新坐标)文件上传,比jspsmart更简单
- 一个简单的struts实现文件上传示例
- struts2.X心得9--struts2自定义拦截器以及文件上传等几个拦截器使用案例
- javaweb文件上传简单入门
- Java Web整合开发(19) -- Struts 2.x 拦截器与文件上传
- struts2.X心得9--struts2自定义拦截器以及文件上传等几个拦截器使用案例
- struts实现简单的文件上传与下载
- Struts 多个文件,拦截器,文件上传
- 《struts----入门简要分析struts的工作原理》---只是简单的分析配置文件,对内部的FormBean等有关的知识未涉及
- 19_Struts 2.x 拦截器与文件上传
- struts文件上传与下载简单DEMO
- struts文件上传拦截器中参数的配置(maximumSize,allowedTypes ,allowedExtensions)问题
- 超简单的struts文件上传
- struts+newxy(新坐标)文件上传,比jspsmart更简单
- Struts实现简单的文件下载(继上一篇文件上传)
- 【ssh】struts文件上传拦截器(单,多文件上传,以及错误信息的返回)
- struts2.3.4和struts2.3.15.1 Fileupload上传文件简单分析