空指针异常表示员工或工资单未初始化。如果您使用的是 struts2,那么使用参数拦截器和模型驱动方法应该可以解决您的问题。
你可以像Alexey所说的那样,或者你可以遵循这种方法。您可以使用 ServletRequestAware 和 ServletResponseAware 接口,然后使用 request.getParameter() 获取传递的值。以下是如何执行此操作的示例。
Action类struts配置
<action name="hello" method="execute"
class="com.home.struts2.HelloAction">
<result name="success">hello.jsp</result>
</action>
动作课
public class HelloAction extends ActionSupport implements ServletRequestAware,ServletResponseAware{
HttpServletResponse response;
HttpServletRequest request;
public String execute() {
System.out.println("AjaxCall" + request.getParameter("param"));
String infoXml = "Parameter passed: " + request.getParameter("param");
response.setContentType("text/html");
response.setHeader("Cache-Control", "no-cache");
try {
response.getWriter().write(infoXml);
} catch (IOException ioe) {
ioe.printStackTrace();
}
return null;
}
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public HttpServletRequest getServletRequest() {
return this.request;
}
}
JavaScript
var xmlHttp;
function sendreq(){
var URL = "hello.action?param=sandy";
try{
xmlHttp=new XMLHttpRequest();
}catch (e){
try{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}catch (e){
try{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}catch (e){
alert("Your browser does not support AJAX!");
return false;
}
}
}
xmlHttp.onreadystatechange = showMessage;
xmlHttp.open("GET", URL, true);
xmlHttp.send(null);
}
实现员工和工资单的可序列化接口。另外,请确保两者都有空的构造函数。
启用 struts2 devMode 以获取附加日志。启用后,您将看到 OGNL 异常,了解具体是哪个字段出现问题。该错误必须非常容易处理。 http://www.mkyong.com/struts2/struts-2-development-mode-example/
我猜用于该操作的拦截器堆栈存在一些问题,只需尝试使用defaultStack。
<action name="payslip/pay" class="..."> <interceptor-ref name="defaultStack"/> <result name="success">/success.jsp</result> <result name="input">/error.jsp</result> </action>
您使用的是框架还是普通的 servlet?如果您使用的是像 struts 这样的框架,那么所有这些答案都太复杂了。
从外观上看,我认为您只是使用了映射的 servlet,这意味着上面关于通过 url 传递命名参数的答案是正确的。您可以使用 post 来隐藏这些命名参数,而不是 get through。
以下是我仅使用 servlet 的方法。不过,如果我是你并且正在做一个完整的项目,我会使用 JSF,以便更轻松地传递数据。
java
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String payslipID = request.getParameter("payslipid");
}
js
<script>
var payslipid = $('#employee_payslip_id')
xmlhttp.open("POST","../payslip/pay",false);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("payslipid="+payslipid);
</script>
正如另一篇文章中提到的,您必须单独获取(并放置在帖子中或获取数据)所有参数,除非您执行了一些单独的字符串列表。这样做并不是一件荒谬的事情,因为无论如何您都需要将所有这些值分离到 java 中它们自己的变量中。
编辑:
上面的答案实际上说明了您需要做什么,但也许它会有助于使其更清楚。在您定义操作的 struts 配置文件中,例如
<action class="org.example.Payslip" name="payslip">
<interceptor-ref name="params"/>
<result name="success">/success.jsp</result>
</action>
确保那里有参数拦截器。它将使得服务器将参数映射到设置器。这样您就不需要为您发送的每项内容进行 getparameter 调用。
此外,如果您按照上面的方式进行了映射,则网址应该类似于 .../payslip.action!pay?payslipid=1234&employeeid=1234。这告诉它使用 payslip.class 和 pay 函数。
在action标签中添加输入参数;它允许您将参数从 struts 操作类传递到 form/.jsp
struts.xml
<action name="..." class="UserAction">
<param name="id"></param>
<result name="input">/WEB-INF/jsp/User.jsp</result>
</action>
动作课
public class UserAction {
private int id;
// this is called by the struts.xml to set the value
public void setId(int id) {
this.id = id;
}
//a getter is needed as well to display value in the .jsp
}
因为它是一个隐藏变量,不是值堆栈的一部分,您可以尝试以这种方式传递它。
如果这不是您的问题; 我认为你必须将 bean 注入到 Action 类中。 @注入员工; bean 到 Action 类中会有帮助。
还调试值堆栈。
Struts2 使用
params
拦截器来填充 HTTP 请求提交的表单值。
建议使用
POST
方法,因此如果您有敏感数据并且希望它不反映在URL中。
拦截器使用参数名称通过 OGNL 运行时来评估应该在 valueStack
中找到
引用的表达式。你已经得到了
NullPointerException
,因为你没有初始化或注入依赖关系到由 OGNL 评估引用的对象。因为您使用的是嵌套 bean,所以所有嵌套属性都应该是可访问和初始化的(或者至少 Struts2 知道如何创建这些对象),并且属于放置在值堆栈的
top
上的操作类。