程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 對Java中傳值挪用的懂得剖析

對Java中傳值挪用的懂得剖析

編輯:關於JAVA

對Java中傳值挪用的懂得剖析。本站提示廣大學習愛好者:(對Java中傳值挪用的懂得剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是對Java中傳值挪用的懂得剖析正文


本文實例講述了java中struts2完成文件上傳下載功效完成辦法。分享給年夜家供年夜家參考。詳細剖析以下:

1.文件上傳

起首是jsp頁面的代碼

在jsp頁面中界說一個上傳標簽
 
<tr>
     <td align="right" bgcolor="#F5F8F9"><b>附件:</b></td>
     <td bgcolor="#FFFFFF">
     <input type="file" name="upload" />
     </td>
     <td bgcolor="#FFFFFF"> </td>
</tr>
然後是BaseAction中界說的相干屬性其它的就省略了(也可界說在本身的Action,換下拜訪潤飾符便可)
 
/**
*Action基類
**/
public class BaseAction extends ActionSupport {
    protected List<File> upload;
    protected List<String> uploadContentType; //文件類型
    protected List<String> uploadFileName;    //文件名
    protected String savePath;                //保留途徑
}
然後是Action中的一個上傳辦法,代碼以下:
/**
  * 8.上傳附件
  * @param upload
  */
  public void uploadAccess(List<File> upload){
        try {
            if (null != upload) {
                for (int i = 0; i < upload.size(); i++) {
                    String path = getSavePath() + ""+ getUploadFileName().get(i);
                    System.out.println(path);
                    item.setAccessory(getUploadFileName().get(i));
                   
                    FileOutputStream fos = new FileOutputStream(path);
                    FileInputStream fis = new FileInputStream(getUpload().get(i));
                    byte[] buffer = new byte[1024];
                    int len = 0;
                    while ((len = fis.read(buffer)) > 0) {
                        fos.write(buffer, 0, len);
                    }
                    fis.close();
                    fos.close();
                }
            }
        } catch (Exception e) {
            logger.error("上傳附件毛病。", e);
        }
}
接著是我的struts2.xml文件
<action name="itemRDAction_*" class="itemRDAction" method="{1}">
     <param name="savePath">e:upload</param>
     <interceptor-ref name="defaultStack">
           <param name="fileUpload.allowedTypes">
               application/octet-stream,image/pjpeg,image/bmp,image/jpg,image/png,image/gif,image/jpeg,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-excel
           </param>
           <param name="fileUpload.maximumSize">8000000</param>
     </interceptor-ref>
     <result name="show_item_rd_upd">  /WEB-INF/jsp/page_item/updItem_rd.jsp</result>
     <result name="show_item_rd_list"> /WEB-INF/jsp/page_item/listItem_rd.jsp</result>
     <result name="show_item_rd_push"> /WEB-INF/jsp/page_item/pushItem_rd.jsp</result>
</action>
savePath為保留途徑,fileUpload.allowedTypes 用來限制上傳文件類型 fileUpload.maximumSize 文件年夜小限制

2.文件下載

起首是頁面中的下載鏈接
<tr>
   <td width="20%" align="right" bgcolor="#F5F8F9"><b>附件:</b></td>
   <td width="40%" bgcolor="#FFFFFF">
   <div >${item.accessory}</div>
       <c:if test="${!empty item.accessory}">
           <div class="btn_img" ><a href="download.action?filename=${item.accessory}">下載</a></div>
       </c:if>
   </td>
   <td width="40%" bgcolor="#FFFFFF"> </td>
</tr>
接著是DownloadAction的代碼:
/**
 * DownloadAction
 *
 * @author zhaoxz
 *
 */
@Controller("downloadAction")
@Scope("prototype")
public class DownloadAction extends BaseAction {
    /**
     *
     */
    private static final long serialVersionUID = -4278687717124480968L;
    private static Logger logger = Logger.getLogger(DownloadAction.class);
    private String filename;
    private InputStream inputStream;
    private String savePath;
    private String mimeType;
    public InputStream getInputStream() {
        try {
            String path = getSavePath() + "//"+ new String(filename.getBytes("ISO8859-1"), "utf-8");
            System.out.println(path);
            mimeType = ServletActionContext.getServletContext().getMimeType(path)+ ";charset=UTF-8";
            inputStream = new FileInputStream(path);
            String agent = request.getHeader("USER-AGENT");
            System.out.println(agent);
            if (null != agent) {
                if (-1 != agent.indexOf("Firefox")) {// Firefox
                    mimeType = mimeType.replace("UTF-8", "ISO8859-1");
                } else {// IE7+ Chrome
                    System.out.println("IE,Chrome");
                    filename = new String(filename.getBytes("ISO8859-1"),"utf-8");
                    filename = java.net.URLEncoder.encode(filename, "UTF-8");
                }
            }
        } catch (Exception e) {
            logger.error("下載文件信息失足。", e);
        }
        if (null == inputStream) {
            System.out.println("getResource error");
        }
        return inputStream;
    }
    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }
    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
    /*************************** get set ******************************/
    public String getSavePath() {
        return this.savePath;
    }
    public void setSavePath(String savePath) {
        this.savePath = savePath;
    }
    public String getFilename() {
        return filename;
    }
    public void setFilename(String filename) {
        this.filename = filename;
    }
}
然後是它的struts2.xml文件:
 
<action name="download" class="downloadAction">
    <param name="savePath">E:/upload</param>
    <result type="stream">
          <param name="contentType">${mimeType}</param>
          <param name="contentDisposition">attachment;filename="${filename}"</param>
          <param name="inputName">inputStream</param>
    </result>
</action>
下載的話留意下編碼格局根本應當就沒甚麼成績了.

上傳進程碰著的成績

1.上傳年夜文件就失足處理辦法1

湧現的毛病有以下:

1、2012-02-24 11:06:31,937 ERROR (org.apache.struts2.dispatcher.Dispatcher:512) - Could not find action or result
No result defined for action com.iman.portal.action.QuestionActionImpl and result problemPage - action - file:/E:/myeclipse/workspaces/portal/WebRoot/WEB-INF/classes/struts2/struts-question.xml:51:55
2、the request was rejected because its size (2973652) exceeds the configured maximum (2097152)

中辭意思: 請求被謝絕,由於它的年夜小(2973652)跨越設置裝備擺設的最年夜值(2097152)、
斟酌到用戶體驗,所以必需在上傳附件時,攔阻如許的異常,處理辦法以下:

1、所上傳的文件,在上傳進程中都是先寄存在緩存中的,平安起見,照樣在項目標struts.properties文件中,加一個暫時寄存途徑,固然項目中己經設置好辦事器的物理途徑。
 
   struts.multipart.saveDir=/temp
2、斟酌到前期能夠會修正文件上傳的年夜小,所以不論能否默許,照樣在項目標struts.properties文件中,加以下設置裝備擺設:
    <!-- 所許可上傳文件的年夜小2M -->
    <constant name="struts.multipart.maxSize" value="2097152"/>
3、struts.xml設置裝備擺設
 
   <!-- 修正成績辦法 -->
    <action name="updateProblem" method="updateProblem">
      <interceptor-ref name="fileUpload"/>
      <interceptor-ref name="defaultStack" />
     <result name="input">/page/question/page/problemPage.jsp</result>
    </action>
4、最主要也是最症結的一步

fileUpload攔阻器只是當文件上傳到辦事器上以後,才停止的文件類型和年夜小斷定。在Action中假如我們甚麼操作都不做的話,異常就會展示在用戶的眼前,是以想了一個辦法,把該異常信息設置為Action級其余毛病信息。即重寫addActionError辦法。
 
@Override
   public void addActionError(String anErrorMessage) {
    // 這裡要先斷定一下,是我們要調換的毛病,才處置
    if (anErrorMessage.startsWith("the request was rejected because its size")) {
        Pattern pattern = Pattern.compile("d+");
        Matcher m = pattern.matcher(anErrorMessage);
        // 婚配一次
        m.find();       
        String s1 =m.group();//上傳的文件年夜小
        // 再婚配一次
        m.find();       
        String s2 =m.group();//所限制的年夜小           
        if(!s1.equals("") && !s2.equals("")){
            fileUploadErrorMessage="你上傳的文件年夜小(" +  Long.valueOf(s1)/1024 +"字節)跨越許可的年夜小(" + Long.valueOf(s2)/1024/1024 + "M)";
            getRequest().setAttribute("fileUploadErrorMessage","文件太年夜,跨越了許可的年夜小("+Long.valueOf(s2)/1024/1024+"M),上傳掉敗!");
            // 將信息調換失落
            super.addActionError(fileUploadErrorMessage);
            }
        } else {// 不然按本來的辦法處置
            super.addActionError(anErrorMessage);
        }
}
可以,在前往頁面用<s:fielderror/> <s:fielderror/>,獲得addActionError中的毛病內容。

由於我不盤算,在頁面上顯示出來毛病緣由,想彈出一個提醒框,所以將信息放入了request對象中。

而頁面加載時,加了以下js驗證:
//斷定 文件能否上傳勝利
    var message="${request.fileUploadErrorMessage}";
        if(message!=null && ""!=trim(message) && message!="null"){
            self.parent.diag.close();
        alert(message);
        return;
}
上面是一些參考懂得東東:

struts.multipart.maxSize掌控全部項目所上傳文件的最年夜的Size
struts.multipart.maxSize和fileUpload攔阻器的maximumSize屬性分工分歧,總結以下:

1.struts.multipart.maxSize掌控全部項目所上傳文件的最年夜的Size。
  跨越了這個size,後台報錯,法式處置不了如斯年夜的文件。fielderror外面會有以下的提醒:
  the request was rejected because its size (16272982) exceeds the configured maximum (9000000)
2.fileUpload攔阻器的maximumSize屬性必需小於struts.multipart.maxSize的值。
  struts.multipart.maxSize默許2M,當maximumSize年夜於2M時,必需設置struts.multipart.maxSize的值年夜於maximumSize。
3.當上傳的文件年夜於struts.multipart.maxSize時,體系報錯
  當上傳的文件在struts.multipart.maxSize和maximumSize之間時,體系提醒:
  File too large: file "MSF的概念.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
  當上傳的文件小於maximumSize,上傳勝利。
<action name="UploadFile" class="com.buptisc.srpms.action.UploadFileAction">
            <result name="UploadFileResult">/pages/ShowOtherFiles.jsp</result>
            <result name="JGBsuccess">/pages/JGBdetail.jsp</result>
            <interceptor-ref name="fileUpload">
                <param name="savePath">/data</param> 
                <param name="maximumSize">52428800</param>
            </interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
</action>
上傳年夜文件就失足處理方法2:

成績:上傳年夜文件報錯……
處理:修正struts.xml文件中的參數以下
<constant name="struts.multipart.maxSize" value="55000000"/>
<action name="UploadFile" class="com.buptisc.srpms.action.UploadFileAction">
            <result name="UploadFileResult">/www.jb51.net/ ShowOtherFiles.jsp</result>
            <result name="JGBsuccess">/pages/JGBdetail.jsp</result>
            <interceptor-ref name="fileUpload">
                <param name="savePath">/data</param> 
                <param name="maximumSize">52428800</param>
            </interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
</action>
struts.xml文件中的年夜小與現實文件年夜小的關系:1048576(Bytes) = 1024*1024 = 1M現實文件年夜小.
struts.multipart.maxSize掌控全部項目所上傳文件的最年夜的Size
struts.multipart.maxSize和fileUpload攔阻器的maximumSize屬性分工分歧,總結以下:

1.struts.multipart.maxSize掌控全部項目所上傳文件的最年夜的Size。跨越了這個size,後台報錯,法式處置不了如斯年夜的文件。fielderror外面會有以下的提醒:
the request was rejected because its size (16272982) exceeds the configured maximum (9000000)
2.fileUpload攔阻器的maximumSize屬性必需小於struts.multipart.maxSize的值。
struts.multipart.maxSize默許2M,當maximumSize年夜於2M時,必需設置struts.multipart.maxSize的值年夜於maximumSize。
3.當上傳的文件年夜於struts.multipart.maxSize時,體系報錯
當上傳的文件在struts.multipart.maxSize和maximumSize之間時,體系提醒:
File too large: file "MSF的概念.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
當上傳的文件小於maximumSize,上傳勝利。

上傳文件的類型限制

設置裝備擺設fileupload攔阻器

struts2的defaultStack中曾經含有fileupload攔阻器,假如想參加allowedTypes參數,須要重新寫一個defaultstack ,拷貝過去修正一下便可:

<interceptors> 
             <interceptor-stack name="myDefaultStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="alias"/>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="i18n"/>
                <interceptor-ref name=www.jb51.net/>
                <interceptor-ref name="chain"/>
                <interceptor-ref name="debugging"/>
                <interceptor-ref name="profiling"/>
                <interceptor-ref name="scopedModelDriven"/>
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="fileUpload">
                  <param name="allowedTypes">
                     image/png,image/gif,image/jpeg
                  </param>
                </interceptor-ref>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="staticParams"/>
                <interceptor-ref name="actionMappingParams"/>
                <interceptor-ref name="params">
                  <param name="excludeParams">dojo..*,^struts..*</param>
                </interceptor-ref>
                <interceptor-ref name="conversionError"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="workflow">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
            </interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
僅修正代碼中的
<interceptor-ref name="fileUpload">
  <param name="allowedTypes">
     image/png,image/gif,image/jpeg
  </param>
</interceptor-ref>
 
攔阻器棧在<package>標簽內 <action>標簽外設置裝備擺設 如上我們假如把它界說成默許攔阻器的話就不須要在

<action>標簽中引入,沒有的話須要引入攔阻器
<action>
       <result name="input">/error/dbError.jsp</result>
       <interceptor-ref name="myDefaultStack"></interceptor-ref>
</action>
  
文件上傳類型毛病action會直接前往input,所以不須要在action中return "input" ;
 
還可以在<package>標簽外界說上傳問價你的途徑跟年夜小:
<constant name="struts.multipart.saveDir" value="/upload/detailed"></constant>
<constant name="struts.multipart.maxSize" value="1024"></constant>
最最最主要的一點:上傳文件的表單 必需加上:enctype="multipart/form-data" 不加必定報input毛病。

願望本文所述對年夜家的Java法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved