89514

Passing values to action class from radio button

Question:

I am having a jsp form where I have to mark attendance for each employee and store the results in the database. My jsp snippet for marking attendance is as follows:

<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>**

And I use the following functions to mark the attendance: public void updateDailyAttendance(ActionRequest areq, ActionResponse aRes) throws Exception{

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"); }

The problem that I am facing is that whatever attendance I mark for the first employee (Present/Absent) the same is stored for the other employees. The error I think is in the above for loop which I have italicized. How should I rectify this code such that for each employee the correct attendance status is stored?

Answer1:

Considering your jsp is correct, the code

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

will create an array of properties named like updateattendance101, updateattendance102, updateattendance201, updateattendance301 etc

The code

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

gets the first matching property, therefore you get the same value always. So what you need to do, is use the same array you used to feed the search-container (array 'EmployeeAttendanceDetails' ), iterate through all it's objects and use the 'getEmpId' id to exact match the property.

Secondly, I see some bad practices on the usage of the ServiceBuilder.

<ol><li>Are you sure you want to create a new Employee, instead of updating the existing ones ?</li> <li>Even if you want to create/update an Employee Entry, you should make a wrapping function in AttendanceLocalServiceImpl, instead of manually editing all attributes/ increase persistence counters etc inside your client's code</li> </ol>

Edit : you can replace your posted java code with this, I hope you can understand to do

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"); }

Edit 2: replace

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

with

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

Recommend

  • three.js gif image loader on before model load
  • ASP.NET: Shadowing Issues
  • Convert jcalendar Date into XMLGregorianCalendar Getting Null Value
  • Transfer Search Box From Old Website to New Website
  • Disable close button in windows form
  • knockout.js save form to json
  • returning all comments by a specific user without other document fields using mongoose
  • Why doesn't asyncio always use executors?
  • Access values displayed in Search Container in another jsp
  • Access Association Details of NavigationProperty
  • how to remove a div with same ids but display='block' and display='none' in JAVa
  • Yii2: Using Kartik Depdrop Widget?
  • getelement by class name for clicking
  • Is looping through all style sheets and classes a good idea in JavaScript?
  • Is there a way to dynamically embed PDF Files in a JSP pulled from the file system?
  • Switch to popup in python using selenium
  • Who propagate bugfixes across branches (corporate development)?
  • Web.config system.webserver errors
  • ADO and msqli connections very slow
  • How can the INSERT … ON CONFLICT (id) DO UPDATE… syntax be used with a sequence ID?
  • Problems compiling files using JOGL
  • HTTP/2 streams vs HTTP/1.1 connections
  • Replace value with Factor in r data.table
  • Python urlparse: small issue
  • How to access EntityManager inside Entity class in EJB3
  • Repeat a vertical line on every page in Report Builder / SSRS
  • Display issues when we change from one jquery mobile page to another in firefox
  • Deselecting radio buttons while keeping the View Model in synch
  • JSON with duplicate key names losing information when parsed
  • Jquery - Jquery Wysiwyg return html as a string
  • Unanticipated behavior
  • using conditional logic : check if record exists; if it does, update it, if not, create it
  • Windows forms listbox.selecteditem displaying “System.Data.DataRowView” instead of actual value
  • apache spark aggregate function using min value
  • Can't mass-assign protected attributes when import data from csv file
  • Sorting a 2D array using the second column C++
  • Why is Django giving me: 'first_name' is an invalid keyword argument for this function?
  • Binding checkboxes to object values in AngularJs
  • How can I use `wmic` in a Windows PE script?
  • Unable to use reactive element in my shiny app