2013-03-11 32 views
7

W moim JSP mam następujący kod:Liferay <portlet: actionURL>

<portlet:actionURL name="addDetails" var="addDetailsURL" /> 
<aui:form name="addDetails" action="<%=addDetailsURL.toString() %>" method="post" > 
     <aui:input type="text" label="name:" name="name" value="" /> 
     <aui:input type="text" label="surname:" name="surname" value="" /> 
     <aui:input type="text" label="age:" name="age" value="" /> 
     <aui:button type="submit" value="addDetails" /> 
</aui:form> 

używam Liferay. Chcę przesłać te dane, które będą przetwarzane w klasie java. Moja klasa Java ma kilka funkcji. jak określić w powyższym jsp, że powinien on uzyskać dostęp do określonej funkcji w java po przesłaniu formularza?

Odpowiedz

14

Jeśli portlet dziedziczy MVCPortlet, wystarczy utworzyć metodę publiczną o tej samej nazwie „” jako actionURL, które odbywają się ActionRequest i ActionResponse argumentu:

public void addDetails(ActionRequest req, ActionResponse rsp) { 
    // ... 
} 
+0

perp: tak w moim actionURL powyżej: nazwa to addDetails, więc moja nazwa funkcji powinna być addDetails, tak? –

+0

@ya k: Masz to. – perp

+0

Dzięki! oczyściłem moje wątpliwości –

6

Jeśli chcesz obsługiwać tylko jedno działanie:

Portlet

@Override 
public void processAction(ActionRequest actionRequest, ActionResponse actionResponse) throws IOException, PortletException 
{ 
    // TODO Auto-generated method stub 
    super.processAction(actionRequest, actionResponse); 
} 

JSP

<form action="<portlet:actionURL />" method="post"> 
    <aui:button type="submit" value="addDetails" /> 
</form> 

Jeśli chcesz więcej niż jedną metodę Działanie:

public void myAction(ActionRequest request, ActionResponse response) 
{ 
    Long id = ParamUtil.getLong(request, "myParam"); 
    // TODO 
} 

JSP

<portlet:actionURL name="myAction" var="myActionVar"> 
    <portlet:param name="myParam" value="${currentElement.id}"></portlet:param> 
</portlet:actionURL> 

<a href="${myActionVar}">Click Me!</a> 

ale prawdopodobnie zrobi:

Portlet

@Override 
public void serveResource(ResourceRequest request, ResourceResponse response) throws IOException 
{ 
    String action = request.getParameter("action"); 

    if(action.equalsIgnoreCase("myAction")){ 
     // handle AJAX call 
    } 
} 

JSP

<portlet:resourceURL var="resourceUrl" /> 
<input id="resourceURL" type="hidden" value="${resourceUrl}" /> 

JavaScript

$.post($('#resourceURL').val(),{ 
    action : 'myAction' 
}).done(function(result){ 
    alert('Action completed successfully!') 
}); 
+0

Co jeśli mam wiele funkcji w klasie Java? jak to będzie wiedzieć, do której funkcji należy się udać? –

+0

Zaktualizowałem moją odpowiedź. Zaakceptuj to, jeśli jest to pomoc :) – kayz1

9

Tylko dla rekordu, można również użyć adnotacji. Na przykład, trzeba to jsp:

<portlet:actionURL var="urlAction"> 
    <portlet:param name="javax.portlet.action" value="myAction"/> 
</portlet:actionURL> 

<aui:form action="${urlAction}" method="post"> 
    <aui:input type="text" label="name:" name="name" value="" /> 
    <aui:button type="submit" value="Submit" /> 
</aui:form> 

a ta metoda Java w swojej MVCPortlet:

@ProcessAction(name = "myAction") 
public void method(ActionRequest actionRequest, ActionResponse actionResponse) { 
    // ... 
} 
3

Jeśli nie używasz MVCPortlet ale coś w rodzaju GenericPortlet dodaj param do actionURL jak ta :

<portlet:actionURL name="addDetails" var="addDetailsURL" > 
<portlet:param name="method" value="addDetails"/> 
</portlet:actionURL> 

Następnie w metodzie processAction, uchwyt sprawdzanie typu metoda w ten sposób:

public void processAction(ActionRequest aReq, ActionResponse aResp) throws IOException, 
      PortletException { 

     final String method = aReq.getParameter("method"); 

     if (method != null && method.equals("addDetails")) 
     { 
      addDetails(aReq, aResp); 

     } 
1

Jeśli twoja klasa Java rozszerza MVCPortlet, tylko nazwa metody powinna pasować do nazwy akcjiURL, tj. AddDetails. Jeśli klasa rozszerza GenericPortlet, musisz podać wartość annotaion na górze swojej metody, np. @ProcessAction (name = "addDetails"). W tym przypadku nazwa twojej metody może być inna.

2

Wklej to w swojej klasie kontrolera

public void addDetails(ActionRequest actionRequest, ActionResponse actionResponse) { 
    //this method will be called on submitting the form 
    System.out.println("addDetails"); 
} 

lub można go używać jako

@ProcessAction(name="addDetails") 
public void myaddDetails(ActionRequest actionRequest, ActionResponse actionResponse) { 
    //this method will be called on submitting the form 
    System.out.println("addDetails"); 
}