首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZK框架:从Servlet将xls加载到ZK Spreadseet

ZK框架:从Servlet将xls加载到ZK Spreadseet
EN

Stack Overflow用户
提问于 2019-12-13 20:43:05
回答 1查看 457关注 0票数 0

寻找如何使用servlet加载xls,并将此xls设置为电子表格。我不能将电子表格连接到servlet中,因为它总是空的。另外,我不能让bean EventComposer使用

EventComposer loadFileServlet = (EventComposer)SpringUtil.getBean("eventComposer");

不知何故,我需要在servlet中使用一个电子表格,并将xls传递到其中。

或简单地说:如何从servlet中的Composer (jsp)获取Speradseet

我有jsp文件:

代码语言:javascript
复制
<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

代码语言:javascript
复制
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

代码语言:javascript
复制
@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

代码语言:javascript
复制
<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);在请求中:

代码语言:javascript
复制
    private void processShowBook(FileItem item, HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException {
    request.setAttribute("string", getPathString(item));
    request.getRequestDispatcher("/index.jsp").forward(request,response);
}
  1. 加到作曲家身上 公共空doAfterCompose(组件comp)抛出异常{ super.doAfterCompose(comp);字符串s=doAfterCompose (s != null) { showBook(s);} } showBook(String s)抛出IOException { Path = Paths.get(s);文件文件= path.toFile();导入程序= Importers.getImporter();图书=importer.imports(getStreamData(文件),“隐藏”);ss.setBook(书籍); }

我已经尝试了两个版本,从章节通过请求的方式,我有书,或字符串路径。电子表格也可用,但没有更新。为什么?

另一方面,如果我向onStopEditing方法添加@Listen("onStopEditing = #ss"),并传递路径字符串、编辑exl和prees,则电子表格将被更新。

UPD 2:问题是,当ss被加载时,它有id 8418 (例如)。当我发送请求,并调用doAfterCompose id是8452。当我再次编辑单元格和triger onCellSelection id时。并且有不同的会话。

当servlet将请求重定向到index.jsp/zul时,我在调用doAfterCompose时创建新的对象ss,但仍然具有旧的活动ss。我怎么才能避免这种情况?

我在发送请求时有什么在做后缀()

当我选择同一窗口上的单元格而不重新加载时

EN

回答 1

Stack Overflow用户

发布于 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中工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59329554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档