【问题标题】:Struts 2 - Unexpected Exception caught setting 'xx'Struts 2 - 意外异常捕获设置'xx'
【发布时间】:2016-01-16 21:41:21
【问题描述】:

我正在尝试将未知数字输入从 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";

}
}

【问题讨论】:

标签: java jsp configuration struts2 interceptor


【解决方案1】:

您可以通过在动作配置中覆盖拦截器来控制 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>

您可以在此处修改params 拦截器的excludeParams 属性,以将所有参数从通过OGNL 的处理中排除。

这样你应该不会得到任何异常,但请确保你已经配置了struts.devMode=false

<constant name="struts.devMode" value="false" />

它应该从输出中删除不必要的警告。如果您仍然在日志中收到任何警告或异常,那么您应该配置您的日志框架以抑制输出中的这些警告或错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多