<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-21  評論-29  文章-0  trackbacks-0
    前言:好久沒有發新隨筆了,不是沒有在學習,而是這個月BRAS用得太猛了,后面幾天都沒網上了!好了,言歸正傳,用一個小工程總結一下最近學習Struts2的心得體會。
    開發環境:jdk1.6 + tomcat6.0.14 + Myeclipse6.0 + Struts2.0.14 + commons-fileupload-1.2.1 + commons-io-1.4
    學習教程:風中葉 浪曦_Struts2應用開發系列
    小項目需求分析或實現的功能:
    (1).用戶只有輸入正確的邀請碼之后才能進行注冊,否則填寫注冊信息之后提交沒有反應,還會停留在注冊頁面。
    (2).用戶注冊之后可以上傳文件,也可以下載其中的文件。
    分析:struts2并沒有實現文件的上傳和下載,我們需要到apache網站去下載commons-fileupload-1.2.1 和 commons-io-1.4 ,并把其中的核心jar包導入到工程。我們可以使用攔截器來實現功能(1)。

    具體步驟:
    1.新建web項目 命名為struts2demo


    2.向工程中導入所需要的jar包 必要的jar包有七個


    3.在web.xml文件中注冊struts2
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" 
        xmlns
    ="http://java.sun.com/xml/ns/j2ee" 
        xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation
    ="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    >
      
      
    <filter>
         
    <filter-name>struts2</filter-name>
         
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> 
      
    </filter>
     
      
    <filter-mapping>
         
    <filter-name>struts2</filter-name>
         
    <url-pattern>/*</url-pattern>
      
    </filter-mapping>
      
    </web-app>

    4.編寫輸入邀請碼的JSP頁面invite.jsp
    <%@ page language="java" contentType="text/html; charset=GBK"
        pageEncoding
    ="GBK"
    %>
    <%@ taglib prefix="s" uri="/struts-tags" %>   

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head><title>驗證碼校驗</title></head>
    <body>   
        
    <table align="center" width="60%"><tr><td style="color:red"><s:fielderror/></td></tr></table>   
        
    <form action="invite.action" method="post">
            請輸入您的驗證碼:
    <br>
           
    <input type="text" name="invitedcode"><br>
           
    <input type="submit" value="提交驗證碼">
           
    <input type="reset" value="重新輸入">   
        
    </form>   
    </body>
    </html>

    5.在Tomcat的server.xml中加入工程

    6.啟動Tomcat服務器 測試當前所做是否有錯誤


    以上表明當前設置沒有錯誤!
    7.在src下新建com.demo.action包,并在其中新建InviteAction類,此類要繼承ActionSupport類


    package com.demo.action;

    import java.util.Map;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;

    public class InviteAction extends ActionSupport {
        
    private String invitedcode;

        
    public String getInvitedcode() {
            
    return invitedcode;
        }


        
    public void setInvitedcode(String invitedcode) {
            
    this.invitedcode = invitedcode;
        }


        @Override
        
    public String execute() throws Exception {
            
    if("220081078".equals(this.getInvitedcode())){       
                
    return SUCCESS;
            }

            
    else{
                
    this.addFieldError("invitedcode""輸入的邀請碼不正確!請再次輸入!");
                
    return INPUT;
            }

        }

    }


    類中規定只有輸入的驗證碼為220081078,才能進入到注冊頁面,否則會出現錯誤的提示信息并回到原頁面繼續輸入。

    8.在src下新建struts.xml文件,在struts.xml文件中對InviteAction進行注冊
    <?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>

        
    <package name="struts2demo" extends="struts-default">

            
    <action name="invite" class="com.demo.action.InviteAction">           
                
    <result name="input">/invite.jsp</result>
                
    <result name="success">/register.jsp</result>
            
    </action>    
             
        
    </package>
        
    </struts>

    9.新建register.jsp頁面,并加入如下代碼
    <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>

    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      
    <head>
       
    <title>注冊頁面</title>

        
    <script type="text/javascript">
            
    function validate(){
               
    var usernameValue = document.getElementById("usernameId").value;
               
    var passwordValue = document.getElementById("passwordId").value;
               
    var repasswordValue = document.getElementById("repasswordId").value;
               
               
    if(usernameValue.length == 0){
                   alert(
    "用戶名不能為空!");
                   
    return false;
               }

               
    else if(usernameValue.length < 6 || usernameValue.length > 16){
                   alert(
    "用戶名只能由6-16位字母和數字組成!");
                   
    return false;
               }

               
               
    if(passwordValue.length == 0){
                   alert(
    "密碼不能為空!");
                   
    return false;
               }

               
    else if(passwordValue.length < 6 || passwordValue.length > 16){
                   alert(
    "用戶名只能由6-16位字母和數字組成!");
                   
    return false;
               }

               
               
    if(passwordValue != repasswordValue){
                   alert(
    "兩次輸入的密碼不一致!");
                   
    return false;
               }

               
               
    return true;
            }

        
    </script>

      
    </head>
      
      
    <body>

          
    <table align="center" width="60%"><tr><td style="color:green"><s:fielderror/></td></tr></table>

          
    <s:form action="register" theme="simple" method="post">
          
          
    <table align="center" width="40%" border="2">
             
    <tr><td>*用戶名:</td><td> <s:textfield name="username" id="usernameId"></s:textfield> </td></tr>
             
    <tr><td>*密碼:</td><td> <s:password name="password" id="passwordId"></s:password> </td></tr>
             
    <tr><td>*重復密碼:</td><td> <s:password name="repassword" id="repasswordId"></s:password> </td></tr>
             
    <tr><td>年齡:</td><td> <s:textfield name="age"></s:textfield> </td></tr>
             
    <tr><td>生日:</td><td> <s:textfield name="birthday"></s:textfield> </td></tr>
             
    <tr><td> <s:submit value="注冊" onclick="validate()"></s:submit></td><td><s:reset value="重填"></s:reset> </td></tr>
                   
          
    </table>
          
    </s:form>
       
      
    </body>
    </html>
    其中腳本validate()方法對輸入進行客戶端的驗證,如果沒有輸入必填項(用戶名和密碼)或輸入的長度超過限制,都會提示相應的錯誤信息。

    10.對以上所做工作進行測試
    如果輸入錯誤的邀請碼 如2200810888 則顯示結果如下


    如果輸入正確的邀請碼 如220081078 則轉入到注冊頁面 測試成功!


    11.在action包中創建RegisterAction類 并編寫如下代碼
    package com.demo.action;

    import java.util.Calendar;
    import java.util.Date;

    import com.opensymphony.xwork2.ActionSupport;

    public class RegisterAction extends ActionSupport {
        
    private String username;
        
    private String password;
        
    private String repassword;
        
    private int age;
        
    private Date birthday;

        
    public String getUsername() {
            
    return username;
        }


        
    public void setUsername(String username) {
            
    this.username = username;
        }


        
    public String getPassword() {
            
    return password;
        }


        
    public void setPassword(String password) {
            
    this.password = password;
        }


        
    public String getRepassword() {
            
    return repassword;
        }


        
    public void setRepassword(String repassword) {
            
    this.repassword = repassword;
        }


        
    public int getAge() {
            
    return age;
        }


        
    public void setAge(int age) {
            
    this.age = age;
        }


        
    public Date getBirthday() {
            
    return birthday;
        }


        
    public void setBirthday(Date birthday) {
            
    this.birthday = birthday;
        }


        @Override
        
    public String execute() throws Exception {
            
            
    return SUCCESS;
        }


        @Override
        
    public void validate() {
            
    if(null == username || username.length()<6 || username.length()>16){
                
    this.addActionError("用戶名應該由6-10位字母和數字組成");
              }

            
    if(null == password || password.length()<6 || password.length()>16){
                    
    this.addActionError("密碼應該由6-10位字母和數字組成");
              }

            
    else if(!(repassword.equals(password))){
                    
    this.addActionError("兩次輸入密碼不一致!");
              }

            
    if(age<0 || age>150){
                    
    this.addActionError("年齡應該在0-150之間!");
              }

            
        }
        
    }

     其中validate()方法對輸入進行服務器端的驗證,以提高安全性。

    12.在struts.xml文件中對RegisterAction進行注冊 在package下加入如下代碼

    <action name="register" class="com.demo.action.RegisterAction">           
                
    <result name="input">/register.jsp</result>
                
    <result name="success">/registersuccess.jsp</result>
            
    </action>

    13.編寫registersuccess.jsp頁面
    <%@ page language="java" contentType="text/html; charset=GBK"
        pageEncoding
    ="GBK"
    %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>

    <title>注冊成功</title>
    </head>
    <body>
        恭喜您已經注冊成功!
    <br>
        一下是您的注冊信息:
    <br>
        用戶名:${requestScope.username}
    <br>
        密碼:${requestScope.password}
    <br>
        年齡:${requestScope.age}
    <br>
        生日:${requestScope.birthday}
    <br>

        
    <href="upload.jsp">開始上傳文件</a>
    </body>
    </html>

    14.對上述工作進行測試
    如果進行不合法的注冊 如沒有填入必填項或者輸入長度不合法 會出現相關錯誤提示信息


    如果輸入合法注冊信息,將轉到注冊成功頁面。


    15.編寫文件上傳頁面upload.jsp代碼
    <%@ page language="java" contentType="text/html; charset=GBK"
        pageEncoding
    ="GBK"
    %>
    <%@ taglib prefix="s" uri="/struts-tags"%>

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>上傳文件頁面</title>

       
    <script type="text/javascript">
          
    function addMore(){
             
    var td = document.getElementById("more");
             
    var br = document.createElement("br");
             
    var input = document.createElement("input");
             
    var button = document.createElement("input");
             input.type 
    = "file";
             input.name 
    = "file";
             button.type
    ="button";
             button.value
    ="Remove";
             
             button.onclick 
    = function(){
                td.removeChild(br);
                td.removeChild(input);
                td.removeChild(button);
             }

             
             
             td.appendChild(br);
             td.appendChild(input);
             td.appendChild(button);
          
          }

       
       
    </script>


    </head>
    <body>
        
         
    <table align="center" width="60%"><tr><td style="color:green"><s:fielderror/></td></tr></table>
        
         
    <s:form action="upload" theme="simple" enctype="multipart/form-data" method="post">
          
          
    <table align="center" width="50%" border="2">
          
             
    <tr><td>用戶名:</td><td> <s:textfield name="username"></s:textfield> </td></tr>
             
    <tr><td>密碼:</td><td> <s:password name="password"></s:password> </td></tr>
             
    <tr><td>選擇文件:</td>  <td id="more"><s:file name="file"></s:file><input type="button" value="上傳更多" onclick="addMore()"></td> </tr>
             
    <tr><td><s:submit value=" 全部上傳 "></s:submit></td></tr>
                   
          
    </table>
          
    </s:form>
        
    </body>
    </html>
      該頁面允許用戶上傳足夠多的文件。點擊“上傳更多...”按鈕一次會添加一個上傳文件textfield,點擊‘Remove’按鈕可以消去該行。

    16.編寫UploadAction類代碼 將文件上傳到upload文件夾
    package com.demo.action;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.List;

    import org.apache.struts2.ServletActionContext;

    import com.opensymphony.xwork2.ActionSupport;

    public class UploadAction extends ActionSupport {
        
    private String username;
        
    private String password;
        
    private List<File> file;
        
    private List<String> fileFileName;
        
    private List<String> fileContentType;
        
    public String getUsername() {
            
    return username;
        }

        
    public void setUsername(String username) {
            
    this.username = username;
        }

        
    public String getPassword() {
            
    return password;
        }

        
    public void setPassword(String password) {
            
    this.password = password;
        }

        
        
    public List<File> getFile() {
            
    return file;
        }

        
    public void setFile(List<File> file) {
            
    this.file = file;
        }

        
    public List<String> getFileFileName() {
            
    return fileFileName;
        }

        
    public void setFileFileName(List<String> fileFileName) {
            
    this.fileFileName = fileFileName;
        }

        
    public List<String> getFileContentType() {
            
    return fileContentType;
        }

        
    public void setFileContentType(List<String> fileContentType) {
            
    this.fileContentType = fileContentType;
        }

        
        @Override
        
    public String execute() throws Exception {
            
            
            
    for(int i = 0;i<file.size();i++){
                InputStream is 
    = new FileInputStream(file.get(i));
                
                String root 
    = ServletActionContext.getRequest().getRealPath("/upload");
                
                File destFile 
    = new File(root,this.getFileFileName().get(i));
                
                OutputStream os 
    = new FileOutputStream(destFile);
                
                
    byte[] buffer = new byte[400];
                
    int length = 0 ;
                
    while((length = is.read(buffer)) > 0){
                    os.write(buffer, 
    0, length);
                }

                
                is.close();
                os.close();
            }

            
            
    return SUCCESS;
        }

        
    }


    17.在struts.xml文件中對UploadAction進行注冊
         <action name="upload" class="com.demo.action.UploadAction">
                
    <result name="success">/uploadsuccess.jsp</result>
                
    <result name="input">/upload.jsp</result>
                
    <interceptor-ref name="fileUpload">
                    
    <param name="maximumSize">4096000</param>
                    
    <param name="allowedTypes">application/vnd.ms-powerpoint</param>
                
    </interceptor-ref> 
                
    <interceptor-ref name="defaultStack"></interceptor-ref>
            
    </action>
     上傳文件時會用到內部的fileUpload攔截器 其中對上傳文件的大小和類型進行了限制 如上也許上傳最大文件為4000K,文件類型只能為ppt類型。

    18.對上傳文件是的錯誤信息進行改進,系統提供的錯誤信息(如文件大小或類型不合法)可讀性很差。
        在struts.xml中加入如下語句 
    <constant name="struts.custom.i18n.resources" value="message"></constant>
        
        
    <constant name="struts.i18n.encoding" value="gbk"></constant>
       第一句是配置錯誤信息message.properties,第二句是對上傳文件過程中的中文亂碼進行更正。
       在src目錄下新建文件message.properties ,文件內容為
    struts.messages.error.content.type.not.allowed=\u4e0a\u4f20\u7684\u6587\u4ef6\u7c7b\u578b\u4e0d\u5141\u8bb8 \u8bf7\u91cd\u8bd5
    struts.messages.error.file.too.large=\u4e0a\u4f20\u6587\u4ef6\u7684\u5927\u5c0f\u8d85\u8fc7\u9650\u5236
      右邊的編碼可以通過Java提供的native2ascii進行轉換。

    19.編寫download.jsp頁面
    <%@ page language="java" contentType="text/html; charset=GBK"
        pageEncoding
    ="GBK"
    %>
        
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>

    <title>文件下載</title>
    </head>
    <body>
        歡迎來到下載頁面!
    <br>
       
    <s:a href="/struts2/download.action">點擊下載</s:a>

    </body>
    </html>

      20.編寫DownloadAction類代碼 假設我們要下載的是upload文件夾下的Struts2.ppt文件

     

    package com.demo.action;

    import java.io.InputStream;

    import org.apache.struts2.ServletActionContext;

    import com.opensymphony.xwork2.ActionSupport;

    public class DownloadAction extends ActionSupport {
         
        
    public InputStream getDownloadFile(){
            
    return ServletActionContext.getServletContext().getResourceAsStream("/upload/Struts2.ppt");
            
        }


        @Override
        
    public String execute() throws Exception {
            
    return SUCCESS;
        }

        
        
    }




     

    21.在struts.xml文件中對DownloadAction進行注冊 要注意其中的參數名稱

     <action name="download" class="com.demo.action.DownloadAction"> 
                
    <result name="success" type="stream">
                   
    <param name="contentType">application/vnd.ms-powerpoint</param>
                   
    <param name="contentDisposition">filename="Struts2.ppt"</param>
                   
    <param name="inputName">downloadFile</param>
                
    </result>
            
    </action>


     22.對以上步驟進行測試

    上傳文件類型不合法


    上傳合法內容,如我們上傳三個ppt文件 則能成功





    點擊到下載頁面下載文件

    23.實現邀請碼功能 以上并沒有實現邀請碼的功能,即用戶可以直接進入到注冊頁面進行注冊。我們需要編寫一個攔截器實現該功能。
    (1)編寫InviteInterceptor攔截器代碼
       
    package com.demo.interceptor;

    import java.util.Map;

    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

    public class InviteInterceptor extends AbstractInterceptor {

        @Override
        
    public String intercept(ActionInvocation invocation) throws Exception {
            Map map 
    = invocation.getInvocationContext().getSession();
            
    if(map.get("invitedcode"== null){
                
    return Action.INPUT;
            }
    else{
                
    return invocation.invoke();
            }

        }


    }


    (2)改寫InviteAction的execute()方法 加入如下語句
        
    (3)在struts.xml中注冊攔截器 并在register的action中加入攔截器
       最終struts.xml的代碼
    <?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.custom.i18n.resources" value="message"></constant>
        
        
    <constant name="struts.i18n.encoding" value="gbk"></constant>
        
    <constant name="struts.multipart.saveDir" value="/upload"></constant>
      
        
    <package name="struts2demo" extends="struts-default">
        
            
    <interceptors>            
               
    <interceptor name="invite" class="com.demo.interceptor.InviteInterceptor"></interceptor>
            
    </interceptors>    
            
           

            
    <action name="invite" class="com.demo.action.InviteAction">           
                
    <result name="input">/invite.jsp</result>
                
    <result name="success">/register.jsp</result>
            
    </action>    
            
            
    <action name="register" class="com.demo.action.RegisterAction">           
                
    <result name="input">/register.jsp</result>
                
    <result name="success">/registersuccess.jsp</result>
                
                
    <interceptor-ref name="invite"></interceptor-ref>
                
    <interceptor-ref name="defaultStack"></interceptor-ref>
            
    </action>
            
            
    <action name="upload" class="com.demo.action.UploadAction">
                
    <result name="success">/uploadsuccess.jsp</result>
                
    <result name="input">/upload.jsp</result>
                
    <interceptor-ref name="fileUpload">
                    
    <param name="maximumSize">4096000</param>
                    
    <param name="allowedTypes">application/vnd.ms-powerpoint</param>
                
    </interceptor-ref> 
                
    <interceptor-ref name="defaultStack"></interceptor-ref>
            
    </action>
            
             
    <action name="download" class="com.demo.action.DownloadAction"> 
                
    <result name="success" type="stream">
                   
    <param name="contentType">application/vnd.ms-powerpoint</param>
                   
    <param name="contentDisposition">filename="Struts2.ppt"</param>
                   
    <param name="inputName">downloadFile</param>
                
    </result>
            
    </action>
             
        
    </package>
        
    </struts>

    24.最后的測試
    如果沒有進行邀請碼的驗證 直接進入到注冊頁面進行注冊 將不成功。達到項目需求。

    總結:這是最近三天學習的結果,很喜歡風中葉老師的講解。他沒有給我們代碼,卻每一步都講得很仔細,還帶著我們一步步地看相關的幫助文檔,會繼續支持風中葉老師的!開發還是要自己多看看各種文檔,這樣才能學習到正宗的知識!

    由于隨筆附件大小有限制 上傳的代碼中刪除了struts2的5個jar包 可自行加入
    本隨筆代碼 代碼

    posted on 2009-05-26 21:49 特立獨行 閱讀(17518) 評論(27)  編輯  收藏 所屬分類: Struts框架

    評論:
    # re: struts2實現文件上傳的下載 2009-05-27 16:49 | 代號zzy
    兄弟,贊一個。  回復  更多評論
      
    # re: struts2實現文件上傳的下載[未登錄] 2009-05-27 17:06 | EricFan
    大哥,什么叫做文件上傳的下載?  回復  更多評論
      
    # re: struts2實現文件上傳的下載 2009-05-30 00:16 | 事發當時
    就一個上傳下載文件,竟然讓你搞了這么一大堆垃圾代碼,攔截器都是現成的,一個action ,5,6行代碼足以,洋洋撒薩!  回復  更多評論
      
    # re: struts2實現文件上傳的下載 2009-05-30 08:50 | 特立獨行
    @事發當時
    本人菜鳥而已 只是把最近的學習內容串聯在一起 復習一下 沒有別的  回復  更多評論
      
    # re: struts2實現文件上傳的下載 2009-05-30 18:20 | gyl868
    謝謝樓主分享,很詳細適合我這種初學者,希望多多發此類帖子喲,我會常來看的,有個問題,使用攔截器后還是可以不通過驗證頁面直接進入register.jsp頁可提交成功,不知道為何  回復  更多評論
      
    # re: struts2實現文件上傳的下載 2009-06-01 17:07 | 特立獨行
    @gyl868
    可能我配置的時候錯誤了 我有空再看看  回復  更多評論
      
    # re: struts2實現文件上傳的下載[未登錄] 2009-07-19 11:14 | skyman
    這些截圖真的是由這些代碼產生的嗎?有些地方是錯的,如RegisterAction里面的validate方法中addActionError,但在相應的jsp中卻用的是fielderror...  回復  更多評論
      
    # re: struts2實現文件上傳的下載[未登錄] 2009-08-17 14:16 | 小強
    撒旦法撒旦法  回復  更多評論
      
    # re: struts2實現文件上傳的下載 2009-12-17 22:50 |
    NB的人都滾一邊去,人家分享個東西,看把TM你給牛的!

    腦殘!

    看不懂什么意思還不如去。。。

    真2.。。  回復  更多評論
      
    # re: struts2實現文件上傳的下載 2009-12-17 22:51 |
    NB的人都滾一邊去,人家分享個東西,看把TM你給牛的!

    腦殘!

    看不懂什么意思還不如去死!。。。  回復  更多評論
      
    # re: struts2實現文件上傳的下載 2010-05-07 14:16 | 一個人
    寫的不錯,基本上跟著樓主做出來了,謝謝  回復  更多評論
      
    # re: struts2實現文件上傳和下載 2010-07-25 01:16 | 黃文龍
    謝謝樓主 學習了  回復  更多評論
      
    # re: struts2實現文件上傳和下載[未登錄] 2010-09-26 13:22 |
    很好!  回復  更多評論
      
    # re: struts2實現文件上傳和下載[未登錄] 2010-09-26 15:49 |
    我是菜鳥,按你的步驟走 由錯誤 提示我找不到系統指定的路徑  回復  更多評論
      
    # re: struts2實現文件上傳和下載 2011-01-20 10:28 | weiythi
    不錯 學習了  回復  更多評論
      
    # re: struts2實現文件上傳和下載 2011-01-27 09:51 | chenwei
    fsdfdsfdsfs  回復  更多評論
      
    # re: struts2實現文件上傳和下載 2011-06-14 09:52 | 游仞
    下載功能不行  回復  更多評論
      
    # re: struts2實現文件上傳和下載[未登錄] 2011-07-14 16:34 | 鄭少文
    @事發當時
    可以把你說的方法給我看看么??

    javajacob@163.com先謝過。  回復  更多評論
      
    # re: struts2實現文件上傳和下載 2012-03-26 19:32 | 方式
    你是北京圣思園的吧,一點新意沒有  回復  更多評論
      
    # re: struts2實現文件上傳和下載 2012-04-09 15:42 | ry
    步驟不全啊~uploadsuccess.jsp就沒有說怎么建啊  回復  更多評論
      
    # re: struts2實現文件上傳和下載 2012-04-25 14:04 | fdsf
    dssf  回復  更多評論
      
    # re: struts2實現文件上傳和下載[未登錄] 2012-05-25 18:01 | hh
    我運行下載頁面時出錯啊!怎么改?  回復  更多評論
      
    # re: struts2實現文件上傳和下載 2012-05-25 23:37 | pppppppppp
    大俠 ……怎么實現點一個文件下載一個文件,而不是固定的文件?  回復  更多評論
      
    # re: struts2實現文件上傳和下載 2012-09-06 11:27 | 采用
    配置的文件 有關鍵字, 把action 中的name 換下就可以了 @陳  回復  更多評論
      
    # re: struts2實現文件上傳和下載 2012-12-04 18:54 | 邊城
    怎么將上傳的東西在頁面上顯示出來啊  回復  更多評論
      
    # re: struts2實現文件上傳和下載 2012-12-07 16:32 | 你這代碼量有點多
    你這代碼量有點多,STRUTS2封裝好了,頂多15行搞定  回復  更多評論
      
    # re: struts2實現文件上傳和下載[未登錄] 2012-12-20 21:25 | 小菜
    下載做來直接就在頁面把文件打開了。。  回復  更多評論
      
    主站蜘蛛池模板: 亚洲国产精品成人精品软件| 最近免费字幕中文大全视频| 美女视频黄免费亚洲| 亚洲国产第一站精品蜜芽| 性xxxx视频播放免费| 无码精品一区二区三区免费视频 | 华人在线精品免费观看| 国产尤物在线视精品在亚洲| 亚洲国产成人精品久久| 亚洲AV无码一区二区二三区入口| 亚洲不卡AV影片在线播放| 成人免费视频88| 91成人免费在线视频| 久久永久免费人妻精品| 97超高清在线观看免费视频| 日日躁狠狠躁狠狠爱免费视频| 亚洲熟妇AV日韩熟妇在线| 亚洲成a人片7777| 91精品国产亚洲爽啪在线影院| 亚洲精品无码精品mV在线观看| 亚洲精品国产V片在线观看| 日韩一级在线播放免费观看| 成人无遮挡裸免费视频在线观看| 国产电影午夜成年免费视频| 7m凹凸精品分类大全免费| 99精品视频在线视频免费观看 | 亚洲精品国产成人影院| 免费乱理伦在线播放| 国产成人啪精品视频免费网| 在线精品免费视频| 天天拍拍天天爽免费视频| 免费看大美女大黄大色| 暖暖免费高清日本中文| 永久黄网站色视频免费直播| 高清国语自产拍免费视频国产 | 亚洲国产成人无码av在线播放| 亚洲视频在线观看免费视频| 亚洲网站在线免费观看| 亚洲国产品综合人成综合网站| 亚洲自偷精品视频自拍| 亚洲一级毛片免费看|