一尘不染

通过单选按钮将值传递给动作类

jsp

我有一个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>**

而且我使用以下功能来标记出席者:public void 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循环中的错误已用斜体显示。我应该如何纠正此代码,以便为每个员工存储正确的出勤状态?


阅读 248

收藏
2020-06-10

共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’id来完全匹配该属性。

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

  1. 您确定要创建一个新的Employee,而不是更新现有的Employee吗?
  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())%>'
2020-06-10