I'm a newbie in Struts, I use a java class that generates a algortihme an HTML file that I store locally. Is it possible to create a link in my action that redirects to the temporary file in case of success of the action? This is my action.java class:
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;
}
}
and my 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>
I have a error
"The requested resource (/dmif-blast/C:/dmif-blast/web/blast/blast_7632426713872140252.html) is not available."
thanks for the help
EDIT : thanks for the solution Tommi, but it doesn't work, now I have a new error:
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)
Try defining your result like this:
<result name="redirect" type="redirect">${url}</result>
And then in your action, have something like this:
private String url;
public String getUrl() {
return url;
}
public String commandBlastN() {
// create your HTML file
url = "/web/blast/blast_xxxx.html";
return "redirect";
}
精彩评论