我试图将来自HTML表单的未知数字输入提交给Action类,并通过使用Action类中的request Method(Used ServletActionContext)来获取Input参数信息。
但是它的投掷
Unexpected Exception caught setting 'xx' on 'class classname Error setting expression 'xx' with value ['yy', ]
由于表单中的输入元素是使用JS动态添加的,因此我无法在Action类中使用getter和setter。
如何处理Action类而没有任何异常?
JSP:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Team Activity Log</title> <SCRIPT language="javascript"> function addRow(tableid) { var table = document.getElementById(tableid); var rowCount = table.rows.length; var row = table.insertRow(rowCount); var cell1 = row.insertCell(0); var element1 = document.createElement("select"); element1=document.getElementById("sele").cloneNode(true); element1.type="select"; cell1.appendChild(element1); var cell2=row.insertCell(1); var element2 = document.createElement("input"); element2.type="text"; element2.setAttribute("placeholder","E.g:1234"); cell2.appendChild(element2); var cell3=row.insertCell(2); var element3 = document.createElement("input"); element3.type="text"; element3.setAttribute("placeholder","Brief your work"); cell3.appendChild(element3); var cell4=row.insertCell(3); var element4 = document.createElement("input"); element4.type="text"; element4.setAttribute("placeholder","MM min"); cell4.appendChild(element4); var cell5=row.insertCell(4); var element5 = document.createElement("img"); element5.src="close.png"; element5.setAttribute("id","delete"); element5.setAttribute("onclick","changeImage(this)"); cell5.appendChild(element5); } function changeImage(temp) { (temp.parentElement).parentElement.remove(); } function convert(tableid,temp2) { var table=document.getElementById(tableid); console.log(table.rows.length); var hidelement=document.getElementById(temp2); hidelement.setAttribute("value",table.rows.length-1); for(var i=1;i<table.rows.length;i++) { var tt="tt"+i; var rf="rf"+i; var des="des"+i; var eff="eff"+i; console.log("executing function"); var elemen=table.rows[i].cells[0].querySelector("*"); elemen.setAttribute("name",tt); elemen=table.rows[i].cells[1].querySelector("*"); elemen.setAttribute("name",rf); elemen=table.rows[i].cells[2].querySelector("*"); elemen.setAttribute("name",des); elemen=table.rows[i].cells[3].querySelector("*"); elemen.setAttribute("name",eff); } } </script> </head> <body> <INPUT type="button" value="Add Row" onclick="addRow('matrix')" /> <%@ taglib uri="/struts-tags" prefix="s" %> <s:url id="myActionUrl" action="timesheetprocess" /> <form action=<s:property value="%{myActionUrl}" />> <input type="hidden" id="taskcount" value="5"> <table id="matrix"> <tr> <th>Task Type</th> <th>Reference ID</th> <th>Description</th> <th>Efforts</th> <th></th> </tr> <tr> <td> <select id="sele"> <option value="" disabled selected>Select your option</option> <option value="SR">SR</option> <option value="CR">CR</option> <option value="ALM">ALM</option> <option value="INCIDENT">INCIDENT</option> <option value="OTHER">OTHER</option> </select></TD> <td> <INPUT type="text" placeholder="E.g:1234"/> </td> <td> <INPUT type="text" placeholder="Brief your work"/> </td> <td> <INPUT type="text" placeholder="MM min" /> </td> <td> <img id="delete" src="close.png" onclick="changeImage(this)"> </td> </tr><tr> <td> <select id="sele"> <option value="" disabled selected>Select your option</option> <option value="SR">SR</option> <option value="CR">CR</option> <option value="ALM">ALM</option> <option value="INCIDENT">INCIDENT</option> <option value="OTHER">OTHER</option> </select></TD> <td> <INPUT type="text" placeholder="E.g:1234"/> </td> <td> <INPUT type="text" placeholder="Brief your work"/> </td> <td> <INPUT type="text" placeholder="MM min" /> </td> <td> <img id="delete" src="close.png" onclick="changeImage(this)"> </td> </tr> <tr> <td> <select id="sele"> <option value="" disabled selected>Select your option</option> <option value="SR">SR</option> <option value="CR">CR</option> <option value="ALM">ALM</option> <option value="INCIDENT">INCIDENT</option> <option value="OTHER">OTHER</option> </select></TD> <td> <INPUT type="text" placeholder="E.g:1234"/> </td> <td> <INPUT type="text" placeholder="Brief your work"/> </td> <td> <INPUT type="text" placeholder="MM min" /> </td> <td> <img id="delete" src="close.png" onclick="changeImage(this)"> </td> </tr> <tr> <td> <select id="sele"> <option value="" disabled selected>Select your option</option> <option value="SR">SR</option> <option value="CR">CR</option> <option value="ALM">ALM</option> <option value="INCIDENT">INCIDENT</option> <option value="OTHER">OTHER</option> </select></TD> <td> <INPUT type="text" placeholder="E.g:1234"/> </td> <td> <INPUT type="text" placeholder="Brief your work"/> </td> <td> <INPUT type="text" placeholder="MM min" /> </td> <td> <img id="delete" src="close.png" onclick="changeImage(this)"> </td> </tr> <tr> <td> <select id="sele"> <option value="" disabled selected>Select your option</option> <option value="SR">SR</option> <option value="CR">CR</option> <option value="ALM">ALM</option> <option value="INCIDENT">INCIDENT</option> <option value="OTHER">OTHER</option> </select></TD> <td> <INPUT type="text" placeholder="E.g:1234"/> </td> <td> <INPUT type="text" placeholder="Brief your work"/> </td> <td> <INPUT type="text" placeholder="MM min" /> </td> <td> <img id="delete" src="close.png" onclick="changeImage(this)"> </td> </tr> </table> <INPUT type="button" value="Submit" onclick="convert('matrix','taskcount')" /> </form> </body> </html>
struts.xml中的动作标签
<action name="timesheetprocess" class="com.App.Controller.Timesheet.Timeprocess" method="execute"> <result name="success">Time.jsp</result> </action>
我的动作课:
import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; public class Timeprocess { public String execute() { HttpServletRequest request = ServletActionContext.getRequest(); String tt="tt"; String rf="rf"; String des="des"; String eff="eff"; for(int i=0;i<Integer.parseInt(request.getParameter("taskcount"));i++) { System.out.println("Task Type :"+ request.getParameter(tt+String.valueOf(i))); System.out.println("Task Type :"+ request.getParameter(rf+String.valueOf(i))); System.out.println("Task Type :"+ request.getParameter(des+String.valueOf(i))); System.out.println("Task Type :"+ request.getParameter(eff+String.valueOf(i))); } return "success"; } }
您可以通过在操作配置中覆盖拦截器来控制Struts2填充参数的过程。
<action name="timesheetprocess" class="com.App.Controller.Timesheet.Timeprocess" method="execute"> <interceptor-ref name="defaultStack"> <param name="params.excludeParams">.*</param> </interceptor-ref> <result name="success">Time.jsp</result> </action>
在那里,您可以修改拦截器的excludeParams属性,params以从OGNL处理中排除所有参数。
excludeParams
params
您不应以此方式获得任何异常,但请确保已配置 struts.devMode=false
struts.devMode=false
<constant name="struts.devMode" value="false" />
它应该从输出中删除不必要的警告。如果在日志中仍然收到任何警告或异常,则应配置日志记录框架以抑制输出中的这些警告或错误。