2011-04-01 72 views
1

我是Struts的新手, 我使用一个java类来生成一个algortihme,我在本地存储一个HTML文件。 在动作成功的情况下,是否可以在我的动作中创建一个重定向到临时文件的链接? 这是我action.java类:Struts2:动态链接重定向?

String databases; 
String sequence; 
String algoUsed; 
String maxTarget; 
String wordSize; 
String name; 

String sequenceFasta; 
boolean lowComplexity; 


private String url; 

public String getUrl() 
    { 
    return url; 
    } 


public String getAlgoUsed() { 
    return algoUsed; 
} 

public void setAlgoUsed(String algoUsed) { 
    this.algoUsed = algoUsed; 
} 


public String getDatabases() { 
    return databases; 
} 

public void setDatabases(String databases) { 
    this.databases = databases; 
} 

public String getWordSize() { 
    return wordSize; 
} 

public void setWordSize(String wordSize) { 
    this.wordSize = wordSize; 
} 

public boolean isLowComplexity() { 
    return lowComplexity; 
} 

public void setLowComplexity(boolean lowComplexity) { 
    this.lowComplexity = lowComplexity; 
} 

public String getMaxTarget() { 
    return maxTarget; 
} 

public void setMaxTarget(String maxTarget) { 
    this.maxTarget = maxTarget; 
} 

public String getSequence() { 
    return sequence; 
} 

public void setSequence(String sequence) { 
    this.sequence = sequence; 
} 

File blast = new File("C:\\dmif-blast\\web\\blast.xml"); 
File directory = new File("C:\\dmif-blast\\web\\blast\\"); 
public String commandBlastN() throws Exception{ 
    try { 

     blast.delete(); 

    File blasthtml = File.createTempFile("blast_", ".html",directory); 



      ProcessBuilder pb = new ProcessBuilder(
        this.blastAllPath, 
        "-task", "blastn", 
        "-db", blastDB, 
        "-query", fasta.getAbsolutePath(), 
        "-outfmt", "5", 
        "-word_size", wordSize, 
        "-num_alignments", maxTarget, 
        "-num_descriptions", maxTarget, 
        "-out", blast.getAbsolutePath()); 


      Process proc = pb.start(); 
      System.out.println(pb.command()); 


      if (proc.waitFor() != 0) { 
       throw new RuntimeException("error occured"); 
      } 


    } catch (Exception err) { 
     throw new RuntimeException(err); 

    } 


       InputStream in = new FileInputStream(blast); 
       FileOutputStream out = new FileOutputStream(blasthtml); 
       out.write(BlastXML2HTML.toHTML(in).getBytes()); 
       out.close(); 

        System.out.println("success......"); 

       url = blasthtml.getCanonicalPath(); 


       return SUCCESS; 

    } 

}

和我stuts.xml

<action name="blastn" class="com.ncbi.blast.beanAction.ncbiBlastNAction" method="commandBlastN"> 
     <interceptor-ref name="token"/> 
     <interceptor-ref name="defaultStack"/> 
     <interceptor-ref name="execAndWait"/> 
     <result name="wait">wait.jsp</result> 
     <result name="error">blastn.jsp</result> 
     <result name="invalid.token">blastn.jsp</result> 
      <result name="success" >${url}</result> 
    </action> 

我有一个错误

"The requested resource (/dmif-blast/C:/dmif-blast/web/blast/blast_7632426713872140252.html) is not available." 

感谢您的帮助

编辑: 感谢您的解决方案托米,但它不工作,现在我有一个新的错误:

Stacktraces java.lang.RuntimeException: java.io.IOException: The system cannot find the path specified com.ncbi.blast.beanAction.ncbiBlastNAction.commandBlastN(ncbiBlastNAction.java:168) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441) com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280) org.apache.struts2.interceptor.BackgroundProcess$1.run(BackgroundProcess.java:57) java.lang.Thread.run(Thread.java:619) 

java.io.IOException: The system cannot find the path specified java.io.WinNTFileSystem.createFileExclusively(Native Method) java.io.File.checkAndCreate(File.java:1704) java.io.File.createTempFile(File.java:1792) com.ncbi.blast.beanAction.ncbiBlastNAction.commandBlastN(ncbiBlastNAction.java:95) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441) com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280) org.apache.struts2.interceptor.BackgroundProcess$1.run(BackgroundProcess.java:57) java.lang.Thread.run(Thread.java:619) 

回答

2

尝试定义你这样的结果:

<result name="redirect" type="redirect">${url}</result> 

,然后在行动,有这样的事情:

private String url; 

public String getUrl() { 
    return url; 
} 

public String commandBlastN() { 
    // create your HTML file 
    url = "/web/blast/blast_xxxx.html"; 
    return "redirect"; 
}