Struts2: динамическая ссылка перенаправляет? - PullRequest
1 голос
/ 01 апреля 2011

Я новичок в Struts, Я использую Java-класс, который генерирует algortihme HTML-файл, который я храню локально. Можно ли создать ссылку в моем действии, которая перенаправляет на временный файл в случае успеха действия? Это мой класс action.java:

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."

спасибо за помощь

РЕДАКТИРОВАТЬ: спасибо за решение Tommi, но оно не работает, теперь у меня новая ошибка:

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)

1 Ответ

2 голосов
/ 01 апреля 2011

Попробуйте определить свой результат следующим образом:

<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";
}
...