英文:
JSF selectOneMenu onChange to update an object
问题
我使用了答案中的代码从<https://stackoverflow.com/questions/16207479/how-to-include-file-from-external-local-disk-file-system-folder-in-jsf>获得了以下内容:
JSF
...
<ui:define name = "content">
<h:form>
<span class="dataSpan" style="border-width:0px">
<object id="thePdf" data="#{request.contextPath}/my.pdf" type="application/pdf" width="1150" height="620">
<a href="#{request.contextPath}/my.pdf">Download file.pdf</a>
</object>
</span>
</h:form>
<h:form class="standardFont">
<span class="notesSpan" style="border-width:0px">
<p:panel header="Data Entry">
<h:panelGrid columns="1" border="0" styleClass="form-grid" columnClasses="form-column-label,form-column-input">
<h:outputLabel />
<h:outputLabel id="fileName" styleClass="centerBoldRed" value="#{pdfServlet.fileName}" >
</h:outputLabel>
<h:outputLabel />
<h:outputLabel for="fileNameList">Files:</h:outputLabel>
<h:selectOneMenu id="fileNameList" value="#{dataEntryBean.fileNameList}" styleClass="boldRed">
<f:selectItems value="#{dataEntryBean.fileNameList}" var="file" itemValue="#{file}" itemLabel="#{file}" />
</h:selectOneMenu>
<h:message class="error" for="fileNameList" id="fileNameListError" />
</h:panelGrid>
...
Java - PdfServlet
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String s = "my.pdf";
File file = new File("//Temp/input/my/pdfs/IncomingPdf/" + s);
response.setHeader("Content-Type", getServletContext().getMimeType(file.getName()));
response.setHeader("Content-Length", String.valueOf(file.length()));
response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName()+ "\"");
Files.copy(file.toPath(), response.getOutputStream());
}
DataEntryBean
...
public List<String> getFileNameList() {
return fileNameList;
}
public final void setFileNameList() {
File folder = new File("//Temp/input/my/pdfs/IncomingPdf/");
FilenameFilter pdfFileFilter = (File dir, String name) -> {
return name.endsWith(".pdf");
};
File[] files = folder.listFiles(pdfFileFilter);
try {
for(File f : files) {
fileNameList.add(f.getName());
}
} catch (ArrayIndexOutOfBoundsException ex) {
fileNameList.add("No PDF file was found.");
}
}
...
这个方案很好地运作。PDF文件在查看器中打开,selectOneMenu显示了目录中的所有文件名。
因此,我的问题是:
如何从selectOneMenu中更改/选择一个名称,并使该文件在object中打开?
我认为我必须使用selectOneMenu中的itemValue作为PdfServlet的参数,并将其用于s中的硬编码值,但我不确定如何做到这一点。任何建议将不胜感激。TIA。
英文:
I used the code from the answer in <https://stackoverflow.com/questions/16207479/how-to-include-file-from-external-local-disk-file-system-folder-in-jsf> to come up with:
JSF
...
<ui:define name = "content">
<h:form>
<span class="dataSpan" style="border-width:0px">
<object id="thePdf" data="#{request.contextPath}/my.pdf" type="application/pdf" width="1150" height="620">
<a href="#{request.contextPath}/my.pdf">Download file.pdf</a>
</object>
</span>
</h:form>
<h:form class="standardFont">
<span class="notesSpan" style="border-width:0px">
<p:panel header="Data Entry">
<h:panelGrid columns="1" border="0" styleClass="form-grid" columnClasses="form-column-label,form-column-input">
<h:outputLabel />
<h:outputLabel id="fileName" styleClass="centerBoldRed" value="#{pdfServlet.fileName}" >
</h:outputLabel>
<h:outputLabel />
<h:outputLabel for="fileNameList">Files:</h:outputLabel>
<h:selectOneMenu id="fileNameList" value="#{dataEntryBean.fileNameList}" styleClass="boldRed">
<f:selectItems value="#{dataEntryBean.fileNameList}" var="file" itemValue="#{file}" itemLabel="#{file}" />
</h:selectOneMenu>
<h:message class="error" for="fileNameList" id="fileNameListError" />
</h:panelGrid>
...
Java - PdfServlet
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String s = "my.pdf";
File file = new File("//Temp/input/my/pdfs/IncomingPdf/" + s);
response.setHeader("Content-Type", getServletContext().getMimeType(file.getName()));
response.setHeader("Content-Length", String.valueOf(file.length()));
response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName()+ "\"");
Files.copy(file.toPath(), response.getOutputStream());
}
DataEntryBean
...
public List<String> getFileNameList() {
return fileNameList;
}
public final void setFileNameList() {
File folder = new File("//Temp/input/my/pdfs/IncomingPdf/");
FilenameFilter pdfFileFilter = (File dir, String name) -> {
return name.endsWith(".pdf");
};
File[] files = folder.listFiles(pdfFileFilter);
try {
for(File f : files) {
fileNameList.add(f.getName());
}
} catch (ArrayIndexOutOfBoundsException ex) {
fileNameList.add("No PDF file was found.");
}
}
...
And this works great. The PDF file is opened in the viewer and the selectOneMenu displays all of the file names from the directory.
So my question is this:
How can I change/select a name from the selectOneMenu and have that file get opened in the object?
I think I have to use the itemValue from the selectOneMenu as a parameter to PdfServlet and use that instead of the hardcoded value in s but I'm not sure how to do that. Any suggestions would be appreciated. TIA.
答案1
得分: 0
这是我所做的事情...不确定是否是正确的方法,但它实现了我想要的效果...
在JSF中添加(位于顶部):
<f:metadata>
<f:viewAction action="#{dataEntryBean.onLoad()}" />
<f:viewAction action="#{pdfServlet.setFileName(dataEntryBean.fileName)}" />
</f:metadata>
并在fileNameListError之前添加以下内容:
<h:commandButton value="提交" action="#pdfServlet.setFileName(dataEntryBean.fileName)}"/>
然后在PdfServlet中,将以下内容更改为:
String s = "my.pdf";
改为:
private static String s;
添加到DataEntryBean中:
public void onLoad() {
setFileNameList();
this.fileName = this.fileNameList.get(0);
}
正如我所说,我不确定这是否是百分之百正确的方法,但它确实起作用。如果有任何更新或更正使其变得更好,将不胜感激。谢谢。
英文:
So here's what I did...not sure if it's the correct way, but it does what I was looking for...
Added to JSF (at top):
<f:metadata>
<f:viewAction action="#{dataEntryBean.onLoad()}" />
<f:viewAction action="#{pdfServlet.setFileName(dataEntryBean.fileName)}" />
</f:metadata>
And added this before fileNameListError:
<h:commandButton value="Submit" action="#pdfServlet.setFileName(dataEntryBean.fileName)}"/>
Then in PdfServlet I changed
String s = "my.pdf";
to
private static String s;
Added to DataEntryBean:
public void onLoad() {
setFileNameList();
this.fileName = this.fileNameList.get(0);
}
As I said, I'm not sure if this is the 100% correct way to do this but it does work. Any updates or corrections that make this better would be appreciated. Thanks.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论