【问题标题】:Passing values to action class from radio button从单选按钮将值传递给操作类
【发布时间】:2013-04-08 09:49:55
【问题描述】:

我有一个 jsp 表单,我必须在其中标记每个员工的出勤率并将结果存储在数据库中。我标记考勤的jsp sn-p如下:

<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 循环中,我用斜体表示。我应该如何更正此代码,以便为每个员工存储正确的出勤状态?

【问题讨论】:

    标签: jsp radio-button liferay-6


    【解决方案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. 您确定要创建新员工,而不是更新现有员工吗?
    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())%>'
    

    【讨论】:

    • 感谢您的回复。 :) 那么我正在更新考勤表。我将在使用服务生成器时进行您建议的更改。我是 liferay 的新手,正在为我的实习做这个项目。我不明白我应该如何在动作类中迭代同一个 EmployeeAttendanceDetails 数组
    • 在 jsp 中,您正在使用一个名为“EmployeeAttendanceDetails”的变量。我不知道你是如何得到它的(从你的 jsp 代码中丢失)。关键是你应该在你的动作类上使用相同的数组
    • 我已经更新了我的代码,而 EmployeeAttendanceDetails 是一个变量。只需检查我上面的代码。
    • 我该如何调用我的动作类 EmployeeAttendanceDetails,它是一个列表类型的变量。直到没有,我只使用 getparameter 来获取值..
    • 我已经更新了我的答案,以帮助您遍历 Employee 值。请注意,我故意删除了与 Employee 更新相关的代码,因为这是另一个问题。
    猜你喜欢
    • 1970-01-01
    • 2011-08-11
    • 2012-09-11
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    相关资源
    最近更新 更多