2013-04-08 164 views
0

我有一個jsp表單,我必須爲每位員工標記出勤人員並將結果存儲在數據庫中。我打標出席JSP代碼片段如下:將值從單選按鈕傳遞到操作類

<portlet:defineObjects /> 
<% 
    List<Employee> EmployeeAttendanceDetails = MISPortalActionUtil.getEmployeeData(); 
%> 



<portlet:renderURL var="viewMarkAttendanceURL"/> 
<!DOCTYPE HTML> 
<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
    <title>mark attendance</title> 
</head> 

<body> 
Mark Attendance for Today: 
<%= new java.util.Date() %> 
<portlet:actionURL name="updateDailyAttendance" var="updateDailyAttendanceURL" /> 


**<aui:form name="updateDailyAttendance" action="<%=updateDailyAttendanceURL.toString()%>" method="post" > 
<portlet:renderURL var="viewEmployeeDataURL"/> 
<liferay-ui:search-container delta="20" emptyResultsMessage="No Results Found"> 
<liferay-ui:search-container-results total="<%= EmployeeAttendanceDetails .size() %>" 
results="<%= ListUtil.subList(EmployeeAttendanceDetails , searchContainer.getStart(),  searchContainer.getEnd()) %>" /> 
<liferay-ui:search-container-row modelVar="search" 
className="com.test.mis.portal.model.Employee"> 
<liferay-ui:search-container-column-text name='Employee Name'  value='<%=String.valueOf(search.getEmpFname()) + " " + String.valueOf(search.getEmpLname())%>' href="" /> 
<liferay-ui:search-container-column-text name='Employee Id' value='<%=String.valueOf(search.getEmpId())%>' href="" /> 
<liferay-ui:search-container-column-text name = "Attendance Status" > 
<label>Present</label><input type = "radio" name ='updateattendance +  <%=String.valueOf(search.getEmpId())%>' value = "present" /> 
<label>Absent</label><input type = "radio" name= 'updateattendance +  <%=String.valueOf(search.getEmpId())%>' value = "absent"/> 
</liferay-ui:search-container-column-text> 
</liferay-ui:search-container-row> 
<liferay-ui:search-iterator searchContainer="<%=searchContainer %>" paginate="<%=true %>" /> 
</liferay-ui:search-container> 
<input type = "submit" value = "Update"/> 
</aui:form>** 

而且我用下面的函數來標記出勤: 公共無效updateDailyAttendance(的ActionRequest AREQ,ActionResponse的ARES)拋出異常{

int totalEmployees = EmployeeLocalServiceUtil.getEmployeesCount(); 
String attendanceValue = getAttendanceValue(areq); 
***for (int i = 0; i < totalEmployees; i++) { 
long attPKey = CounterLocalServiceUtil.increment(Employee.class.getName()); 
Attendance newAttendanceInstance = new AttendanceImpl(); 
newAttendanceInstance.setAttId(attPKey); 
newAttendanceInstance.setAttStatus(attendanceValue); 
AttendanceLocalServiceUtil.addAttendance(newAttendanceInstance); 
}*** 
} 

private String getAttendanceValue(ActionRequest areq) { 
Enumeration parameters = areq.getParameterNames(); 

while (parameters.hasMoreElements()) { 
String parameterName = parameters.nextElement().toString(); 
if (parameterName.startsWith("updateattendance")) { 
return areq.getParameter(parameterName); 
} 
} 
throw new IllegalStateException("Parameter updateattendance is not found"); 
} 

的我面臨的問題是,我爲第一名員工(存在/缺席)標記的任何出勤記錄都存儲在其他員工身上。我認爲錯誤在上面的for循環中,我已經斜體。我應該如何糾正這些代碼,以便爲每個員工存儲正確的出勤狀態?

回答

1

考慮到你的JSP是正確的,代碼

<input type = "radio" name ='updateattendance +  <%=String.valueOf(search.getEmpId())%>' value = "present" /> 

將創建一個名爲像updateattendance101,updateattendance102,updateattendance201,updateattendance301等屬性數組

代碼

if (parameterName.startsWith("updateattendance")) { return areq.getParameter(parameterName); 

得到第一個匹配的屬性,所以你總是得到相同的值。因此,您需要做的是使用您用於提供搜索容器(數組'EmployeeAttendanceDetails')的相同數組,循環遍歷所有對象並使用'getEmpId'標識完全匹配屬性。

其次,我看到一些使用ServiceBuilder的不好做法。

  1. 您確定要創建新員工,而不是更新現有員工嗎?
  2. 即使你想創建/更新員工入職,你應該在AttendanceLocalServiceImpl一個包裝功能部件,而不要手動編輯所有屬性/增加你的客戶端的代碼裏面持續計數器等

編輯:您可以取代與此您發佈的Java代碼,我希望你能理解做

public void updateDailyAttendance(ActionRequest areq, ActionResponse aRes) throws Exception{ 

    List<Employee> employeeAttendanceDetails = MISPortalActionUtil.getEmployeeData(); 

    for (Employee emp: employeeAttendanceDetails) { 


    String name = "updateattendance" + Long.toString(emp.getEmpId()); 


        String value = getAttendanceValue(areq, name); 
        // You don't really need to call call getAttendanceValue, except if you're going to handle the IllegalStateException. 
        //If this is the case, you can just call : 
        //String value = areq.getParameter(name); 



     // Do your stuff with the employee object 


    } 
} 

private String getAttendanceValue(ActionRequest areq, String paramName) { 
Enumeration parameters = areq.getParameterNames(); 

while (parameters.hasMoreElements()) { 
    String parameterName = parameters.nextElement().toString(); 
    if (parameterName.equals(paramName)) { 
     return areq.getParameter(parameterName); 
    } 
} 
throw new IllegalStateException("Parameter updateattendance is not found"); 
} 

編輯2:更換

name ='updateattendance +  <%=String.valueOf(search.getEmpId())%>' 

name ='updateattendance<%=String.valueOf(search.getEmpId())%>' 
+0

感謝您的回覆。 :)那麼我正在更新考勤表。我將在使用服務構建器時進行您所建議的更改。我是liferay的新人,爲我的實習做這個項目。我不明白我應該如何迭代jsp中動作類 – 2013-04-09 07:31:10

+1

中的同一個EmployeeAttendanceDetails數組,您正在使用名爲'EmployeeAttendanceDetails'的變量。我不知道你是如何得到它(從你的jsp代碼丟失)。重點是你應該在你的動作類上使用相同的數組 – yannicuLar 2013-04-09 09:44:09

+0

我已經更新了我的代碼,EmployeeAttendanceDetails是一個變量。只需檢查我的代碼上面。 – 2013-04-09 09:54:48