您的位置:首页 > 编程语言 > Java开发

struts简单入门3——拦截器和文件上传

2013-09-30 15:32 337 查看
≡(▔﹏▔)≡今天调了很久。。。而且都是一些很碎碎的错误。。。所以调程序真心是个痛苦的活(>﹏<),经常调半天都调不出来,比较赶时间~~所以先大概写下来免得忘了今天的痛苦经历!!!
继上一次的用户登陆后加入代码:
/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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: