2013-04-08 165 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