我正在处理 MVC Portlet,我正在保存的文档不会被 db

I am working on a MVC Portlet and the document i am saving is not going to db

这是我的操作 Class,我必须在其中将任何文档保存到数据库,但它无法正常工作并在控制台中出现错误 NoSuchMethodException (javax.portlet.ActionRequest, javax.portlet.ActionResponse)

package com.test.docupload;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.portlet.PortletException;

import com.liferay.counter.service.CounterLocalServiceUtil;
import com.liferay.portal.kernel.captcha.CaptchaMaxChallengesException;
import com.liferay.portal.kernel.captcha.CaptchaTextException;
import com.liferay.portal.kernel.captcha.CaptchaUtil;
import com.liferay.portal.kernel.dao.jdbc.OutputBlob;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.kernel.upload.UploadRequest;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.util.PortalUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;
import com.test.docup.model.Doc;
import com.test.docup.service.DocLocalServiceUtil;

/**
 * Portlet implementation class DocumentUploadAction
 */
public class DocumentUploadAction extends MVCPortlet {

    public void addDoc(ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws IOException, PortletException {

        UploadRequest uploadRequest = PortalUtil.getUploadPortletRequest(resourceRequest);
        File docImage = uploadRequest.getFile("doc");
        String title = ParamUtil.getString(uploadRequest, "firstName");
        InputStream fis = new FileInputStream(docImage);
        OutputBlob dataOutputBlob = new OutputBlob(fis, docImage.length());
        try {
            Doc doc = DocLocalServiceUtil.createDoc(CounterLocalServiceUtil.increment());
            doc.setDocName(title);
            doc.setOwner(10199);
            doc.setData(dataOutputBlob);
            doc = DocLocalServiceUtil.addDoc(doc);
            if (doc != null) {
                SessionMessages.add(resourceRequest.getPortletSession(), "document-added-success");
                System.out.println("document-added-success");

            } else {
                SessionErrors.add(resourceRequest.getPortletSession(), "document-added-failed");
                System.out.println("document-added-failed::");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这是我的jsp

<%@page import="com.liferay.portal.kernel.servlet.SessionMessages"%>
<%@ include file="init.jsp" %>

<c:if test='<%=SessionMessages.contains(renderRequest.getPortletSession(),"document-added-success")%>'>
    <liferay-ui:success key="document-added-success" message="Document has been added successfully." />
</c:if>

<c:if test='<%=SessionMessages.contains(renderRequest.getPortletSession(),"document-added-failed")%>'>
    <liferay-ui:error key="document-added-failed" message="Document Uploaded failed." />
</c:if>

<portlet:actionURL  var="addDocActionURL" name="addDoc"></portlet:actionURL>
<aui:form action="<%= addDocActionURL %>" method="post" name="fm" enctype="multipart/form-data">
    <aui:input name="title" value="" label="Doc Title"/>
    <aui:input  name="Doc" value="" type="file" label="Select Doc"/>
    <aui:button-row>
        <aui:button type="submit" />
    </aui:button-row>
</aui:form>

我已将 ActionRequest 更改为 ResourceRequest,但仍然无法正常工作。

您的代码中存在某些错误:

  1. 您忘记在 JSP 中包含 aui 的标签参考。

  2. 文件类型输入的属性名称为 name="Doc",您在操作中获取的参数值为

File docImage = uploadRequest.getFile("doc");

在视图和操作中 "Doc" / "doc" 应该保持一致。

  1. 您使用 <portlet:actionURL> 标签创建了 URL,但将其链接到操作类型:

public void addDoc(ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws IOException, PortletException {

这对使用 <portlet:resourceURL> 标签创建的 URL 有效。对于 actionURL 你的 action 方法应该是:

public void addDoc(ActionRequest actionRequest, ActionResponse actionResponse) throws IOException, PortletException {

  1. 将所有resourceRequest替换为actionRequest

  2. UploadRequest 应该是 UploadPortletRequest

  3. Link 你的行动 class <portlet-class> 到 JSP in portlet.xml as,

com.test.docupload.DocumentUploadAction

因此,以下是更新后的代码:

Portlet.xml

<?xml version="1.0"?>

<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" 
             version="2.0">
    <portlet>
        <portlet-name>document</portlet-name>
        <display-name>Document Portlet</display-name>
        <portlet-class>com.test.docupload.DocumentUploadAction</portlet-class>
        <init-param>
            <name>view-template</name>
            <value>/view.jsp</value>
        </init-param>
        <expiration-cache>0</expiration-cache>
        <supports>
            <mime-type>text/html</mime-type>
        </supports>
        <portlet-info>
            <title>Document Portlet</title>
            <short-title>Document Portlet</short-title>
            <keywords>Document Portlet</keywords>
        </portlet-info>
        <security-role-ref>
            <role-name>administrator</role-name>
        </security-role-ref>
        <security-role-ref>
            <role-name>guest</role-name>
        </security-role-ref>
        <security-role-ref>
            <role-name>power-user</role-name>
        </security-role-ref>
        <security-role-ref>
            <role-name>user</role-name>
        </security-role-ref>
    </portlet>
</portlet-app>

JSP:

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://alloy.liferay.com/tld/aui" prefix="aui" %>

<portlet:defineObjects />

<%@page import="com.liferay.portal.kernel.servlet.SessionMessages"%>
<%@ include file="init.jsp" %>

<c:if test='<%=SessionMessages.contains(renderRequest.getPortletSession(),"document-added-success")%>'>
    <liferay-ui:success key="document-added-success" message="Document has been added successfully." />
</c:if>

<c:if test='<%=SessionMessages.contains(renderRequest.getPortletSession(),"document-added-failed")%>'>
    <liferay-ui:error key="document-added-failed" message="Document Uploaded failed." />
</c:if>

<portlet:actionURL var="addDocActionURL" name="addDoc"></portlet:actionURL>
<aui:form action="<%= addDocActionURL %>" method="post" name="fm" enctype="multipart/form-data">
    <aui:input name="title" value="" label="Doc Title"/>
    <aui:input name="doc" value="" type="file" label="Select Doc"/>
    <aui:button-row>
        <aui:button type="submit" />
    </aui:button-row>
</aui:form>

文档上传操作:

package com.test.docupload;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.portlet.PortletException;

import com.liferay.counter.service.CounterLocalServiceUtil;
import com.liferay.portal.kernel.captcha.CaptchaMaxChallengesException;
import com.liferay.portal.kernel.captcha.CaptchaTextException;
import com.liferay.portal.kernel.captcha.CaptchaUtil;
import com.liferay.portal.kernel.dao.jdbc.OutputBlob;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.util.PortalUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;

import com.liferay.portal.kernel.upload.UploadPortletRequest;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;

/**
 * Portlet implementation class DocumentUploadAction
 */
public class DocumentUploadAction extends MVCPortlet {

    public void addDoc(ActionRequest actionRequest, ActionResponse actionResponse) throws IOException, PortletException {

        UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(actionRequest);
        File docImage = uploadRequest.getFile("doc");
        String title = ParamUtil.getString(uploadRequest, "firstName");
        InputStream fis = new FileInputStream(docImage);
        OutputBlob dataOutputBlob = new OutputBlob(fis, docImage.length());
        try {
            Doc doc = DocLocalServiceUtil.createDoc(CounterLocalServiceUtil.increment());
            doc.setDocName(title);
            doc.setOwner(10199);
            doc.setData(dataOutputBlob);
            doc = DocLocalServiceUtil.addDoc(doc);
            if (true) {
                SessionMessages.add(actionRequest.getPortletSession(), "document-added-success");
                System.out.println("document-added-success");

            } else {
                SessionErrors.add(actionRequest.getPortletSession(), "document-added-failed");
                System.out.println("document-added-failed::");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}