寻找如何使用servlet加载xls,并将此xls设置为电子表格。我不能将电子表格连接到servlet中,因为它总是空的。另外,我不能让bean EventComposer使用
EventComposer loadFileServlet = (EventComposer)SpringUtil.getBean("eventComposer");
不知何故,我需要在servlet中使用一个电子表格,并将xls传递到其中。
或简单地说:如何从servlet中的Composer (jsp)获取Speradseet
我有jsp文件:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>zk</title>
<zssjsp:head/>
</head>
<body>
<div width="100%" style="height: 100%;">
<zssjsp:spreadsheet id="ss" src="/WEB-INF/books/hide.xlsx" apply="org.autto.zk.EventComposer"
width="100%" height="100%" maxVisibleRows="200" maxVisibleColumns="40"
showToolbar="true" showFormulabar="true" showContextMenu="true" showSheetbar="true"/>
</div>
</body>
</html>带有电子表格的EventComposer
public class EventComposer extends SelectorComposer<Component> {
**********
@Wire
private Spreadsheet ss;
//for testing, check xls loaded into spreadsheet after stop editing
@Listen("onStopEditing = #ss")
public void showBook() throws IOException {
Path path = Paths.get("D:\\Documents\\zssjspdemo-master\\src\\main\\webapp\\upload\\blank.xls");
File file = path.toFile();
Importer importer = Importers.getImporter();
Book book = importer.imports(getStreamData(file), "hide");
ss.setBook(book);
}
********
}也有servlet
@WebServlet("/load")
public class LoadFileServlet extends HttpServlet {
@Wire
private Spreadsheet ss; // this spreadsheet null, can't wire it
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
boolean isMultipart = ServletFileUpload.isMultipartContent(req);
if (!isMultipart) {
resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
return;
}
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024 * 1024);
File tempDir = (File)getServletContext().getAttribute("javax.servlet.context.tempdir");
factory.setRepository(tempDir);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(1024 * 1024 * 10);
try {
List items = upload.parseRequest(req);
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem)iter.next();
if (item.isFormField()) {
processFormField(item);
} else {
processUploadedFile(item);
**//whant to do something like this but ss is null
Importer importer = Importers.getImporter();
Book book = importer.imports(getStreamData(item), "hide");
ss.setBook(book);**
}
}
} catch (Exception e) {
e.printStackTrace();
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return;
}
}
/**
* save file to upload folder.
* folder should be created already
*
* @param item
* @throws Exception
*/
private void processUploadedFile(FileItem item) throws Exception {
File uploadedFile = null;
do {
String path = getServletContext().getRealPath("/upload/" + item.getName());
uploadedFile = new File(path);
} while (uploadedFile.exists());
uploadedFile.createNewFile();
item.write(uploadedFile);
}
}pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.zkoss.zss</groupId>
<artifactId>home</artifactId>
<version>3.9.5-Eval</version>
<properties>
<commons-io>1.3.1</commons-io>
<maven.build.timestamp.format>yyyy-MM-dd</maven.build.timestamp.format>
<packname>-${project.version}-FL-${maven.build.timestamp}</packname>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<packaging>war</packaging>
<name>The zssjsp demo Project</name>
<description>The zssjspdemo Project</description>
<licenses>
<license>
<name>GNU LESSER GENERAL PUBLIC LICENSE, Version 3</name>
<url>http://www.gnu.org/licenses/lgpl.html</url>
<distribution>repo</distribution>
</license>
</licenses>
<repositories>
<repository>
<id>ZK CE</id>
<name>ZK CE Repository</name>
<url>http://mavensync.zkoss.org/maven2</url>
</repository>
<repository>
<id>ZK EVAL</id>
<name>ZK Evaluation Repository</name>
<url>http://mavensync.zkoss.org/eval</url>
</repository>
<repository>
<id>prime-repo</id>
<name>PrimeFaces Maven Repository</name>
<url>http://repository.primefaces.org</url>
<layout>default</layout>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>zkmaven</id>
<name>ZK Maven Plugin Repository</name>
<url>http://mavensync.zkoss.org/maven2/</url>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io}</version>
</dependency>
<dependency>
<groupId>org.zkoss.zss</groupId>
<artifactId>zssex</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.zkoss.zss</groupId>
<artifactId>zssjsp</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.7</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
<!-- https://search.maven.org/remotecontent?filepath=org/apache/httpcomponents/httpclient/4.5.9/httpclient-4.5.9.jar -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>25.0.0.redhat-1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.7.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.1.7.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.7.RELEASE</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- Run with Jetty -->
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.10</version>
<configuration>
<scanIntervalSeconds>5</scanIntervalSeconds>
<stopKey>foo</stopKey>
<stopPort>9999</stopPort>
<contextPath>/</contextPath>
</configuration>
</plugin>
</plugins>
</build>
</project>UPD 1:感谢Hawk的想法:它现在是如何工作的: 1.添加了processShowBook(item,req,resp);在请求中:
private void processShowBook(FileItem item, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
request.setAttribute("string", getPathString(item));
request.getRequestDispatcher("/index.jsp").forward(request,response);
}我已经尝试了两个版本,从章节通过请求的方式,我有书,或字符串路径。电子表格也可用,但没有更新。为什么?
另一方面,如果我向onStopEditing方法添加@Listen("onStopEditing = #ss"),并传递路径字符串、编辑exl和prees,则电子表格将被更新。
UPD 2:问题是,当ss被加载时,它有id 8418 (例如)。当我发送请求,并调用doAfterCompose id是8452。当我再次编辑单元格和triger onCellSelection id时。并且有不同的会话。
当servlet将请求重定向到index.jsp/zul时,我在调用doAfterCompose时创建新的对象ss,但仍然具有旧的活动ss。我怎么才能避免这种情况?
发布于 2019-12-16 02:18:15
失败的原因
ZK composer生活在一个特定的“桌面”范围内,它是由ZK创建的,它比会话短,但比请求长。每次使用ZK组件加载(或重新加载)页面时,服务器都会创建一个新组件和一个新的composer,并将页面上的组件连接到composer中,然后该组件向浏览器呈现一个javascript小部件。呈现的javascript小部件和java组件形成一对。当您与小部件交互时,它会向服务器发出AJAX请求,而不是重新加载整个页面。EventComposer ZK有控制composer生命周期的过程,您自己创建的composer (如新的())与ZK框架创建的composer不同。
我建议有三种方法:
包括ZUL方法
因为zul提供了更丰富的特性,所以您只需在FileUpload组件中实现上传功能。因此,在同一页面中的两个zk组件(FileUpload和电子表格)之间更容易进行通信。然后,只需在jsp菜单示例中包含zul即可。有关如何实现上载,请参考Dev参考中的文件上载
通过请求
您可以通过当前的servlet方式实现上传。1.将Book (由导入程序生成)存储为HttpServletRequest属性。2.使用电子表格将请求(保持请求不变)转发给JSP。3.在Composer.doAfterCompose() ((HttpServletRequest)Excuctions.getCurrent().getNativeRequest()).getAttribute()中获取图书
另一种方法是: 1.直接将xls文件存储在特定的文件夹中。2.将文件名作为查询字符串传递。3.使用电子表格4将请求转发给JSP。获取查询字符串(文件名由HttpServletRequest.getParameter() 5.导入文件)
检查这个例子,这是简单的,但显示的想法。
@Wire在Servlet中不工作
@Wire是一个ZK注释,它只在ZKSelectorComposer中工作。
https://stackoverflow.com/questions/59329554
复制相似问题