2015-04-02 80 views
2

我只想知道,如果我可以在一個jsp中有兩個<portlet:actionURL var="wakeup">動作網址。這將根據填充的輸入和JS提交此表單來調用。例如:兩個動作網址在一個jsp

JS:

function startActions() { 
    if (document.getElementById("shut").checked || 
     document.getElementById("reboot").checked) {  
     document.getElementById("shutdownRebootForm").submit(); 
    } 
    if (document.getElementById("wake").checked) { 
     document.getElementById("wakeUpForm").submit(); 
    } 
} 

HTML:

<portlet:actionURL var="shutdownReboot"> 
    <portlet:param name="action" value="shutdown-reboot" /> 
</portlet:actionURL> 
<form id="shutdownRebootForm" method="post" action="${shutdownReboot}"> 
    //some HTML code 
</form> 

<portlet:actionURL var="wakeup"> 
    <portlet:param name="wakeaction" value="wakeup" /> 
</portlet:actionURL> 
<form id="wakeUpForm" method="post" action="${wakeup}"> 
    //some HTML code 
</form> 

我使用Spring MVC的...這是可能實現?它會按預期工作嗎?

+0

爲什麼,有沒有嚴格的需要放置兩個形式?雖然你可以使用單個實現這個! – 2015-04-02 14:33:10

+0

比方說,我開始研究一個已經實現了從一個actionURL調用方法的項目......最簡單的方法是實現另一個方法,從另一個actionURL調用,以避免重新實現第一個方法並將後端代碼調用分爲兩個控制器方法,但是我想從portlet中的一個jsp頁面調用此方法。 – 2015-04-02 15:34:17

+0

我有一個想法,將這個jsp頁面分割成單獨的jsps,每個jsp都有actionURL,然後只是簡單地將一個jsp包含到另一個jsp中,不知道它是否可以工作,但可以在明天嘗試。 – 2015-04-02 15:41:24

回答

4

Liferay的文檔:

爲您在portlet想你可以有很多的動作。實施每個 一個作爲接收兩個參數的方法:ActionRequestActionResponse。將方法命名爲任何您想要的,但請注意,方法名稱必須與指向它的URL名稱匹配。

因此,基於合適的JSP,動作和腳本結構,您可以在單個portlet中放置儘可能多的actionURL。重要的一點是將URL標記上指定的name屬性的值與方法名稱相匹配。

如果您指定了name屬性,那麼您需要在偵聽器類中實現單獨的操作方法。

模式1:

看,你actionURLs將類似於以下內容:

<portlet:actionURL var="shutdownRebootURL" name="shutdownReboot"> 
    <portlet:param name="action" value="shutdown-reboot" /> 
</portlet:actionURL> 

<portlet:actionURL var="wakeupURL" name="wakeup"> 
    <portlet:param name="wakeaction" value="wakeup" /> 
</portlet:actionURL> 

所以,你的行動slass應該包含以下方法:

public void shutdownReboot(ActionRequest actionRequest, ActionResponse actionResponse) 
    throws IOException, PortletException { 
     // Your shutdownReboot logic goes here 
} 

public void wakeup(ActionRequest actionRequest, ActionResponse actionResponse) 
    throws IOException, PortletException { 
     // Your wakeup logic goes here 
} 

然而,沒有硬n快的需要放置兩個表單/ actionURL,您可以通過在偵聽器c中實現一個動作方法來實現您的要求根據參數的值進行過濾。 在每個操作上,該參數將標識哪個操作已被調用。

圖案2:

考慮下面的例子:

HTML:

<form action="<portlet:actionURL />" method="post"> 
    <input type="hidden" name="action" id="action" value="" /> 

    <table> 
     <tr> 
      <td>shutdown checkbox</td> 
      <td>reboot checkbox</td> 
      <td>wakeup checkbox</td> 
     </tr> 
     <tr> 
      <td> 
       <!-- show specific button based on checkbox checked --> 
       <button type="submit" id="shutdownReboot" onclick="startActions('shutdownReboot');">Shutdown/Reboot</button> 
       <button type="submit" id="wakeup" onclick="startActions('wakeup');">Wakeup</button> 
      </td> 
     </tr> 
    </table> 
</form> 

使用Javascript:

function startActions(action) { 
    document.getElementById('action').value = action; 
    /* set other required parameters */ 
} 

操作方法:

String action = ""; 
public void processAction(ActionRequest actionRequest, ActionResponse actionResponse) 
     throws IOException, PortletException { 

    if(actionRequest.getParameter("action") != null && actionRequest.getParameter("action") != ""){ 
      action = actionRequest.getParameter(action); 
    } 

    if(action.equals("shutdownReboot")){ 
     // shutdown-reboot logic 
    }else if(action.equals("wakeup")){ 
     // wakeup logic 
    }else{ 
     // default logic 
    }  
} 
+0

好的和有用的答案謝謝。 – 2015-04-03 06:25:50

+0

我的榮幸,快樂編碼! – 2015-04-03 06:28:05