我正在尝试通过JavaScript将字段的值发送到Struts2后端,但它返回NullpointerException
。
<input type="hidden" id="employee.payslip.id" name="employee.payslip.id" value="5"/>
....
提交表单后,请求将被发送到以下JavaScript方法以发送到后端。
function payslipPayment(){
var formValues = $('#myform').serialize();
....
xmlhttp.open("get","../payslip/pay?"+formValues,false);
xmlhttp.send();
}
将创建请求并按以下方式发送
http://localhost/payslip/pay/employee.payslip.id=5&employee.payslip.year=2013&....
但是在后端,当我尝试显示它返回的值时NullPointerException
。
Java
public class payslip {
private Employee employee;
public String pay{
System.out.println("Id:"+employee.payslip.id):
System.out.println("Year:"+employee.payslip.year;
...
}
getter and setter
}
课程
public class Employee {
private Payslip payslip;
....
getter and setter
}
public class Payslip{
private long id;
...
getter and setter
}
答案 0 :(得分:3)
空指针异常表示未初始化员工或工资单。如果你使用struts2,那么使用param拦截器和模型驱动的方法应该可以解决你的问题。
答案 1 :(得分:2)
答案 2 :(得分:2)
您可以像Alexey所说的那样做,或者您可以遵循这种方法。您可以使用ServletRequestAware和ServletResponseAware接口,然后使用request.getParameter()来获取传递的值。以下是如何执行此操作的示例。
Action class struts config
<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);
}
答案 3 :(得分:2)
您使用的是框架,还是只使用普通的servlet?如果你使用像struts这样的框架,那么所有这些答案都太复杂了。
我认为你只是通过它的外观使用一个映射的servlet,这意味着上面的答案是正确的通过url传递命名参数。你可以使用post隐藏这些命名参数,而不是通过它。
以下是我只使用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>
正如在另一篇文章中所提到的,除非你做了一些单独的字符串列表,否则你必须单独获取(并在post或get data中)所有参数。这样做并不是一件荒谬的事情,因为无论如何你都需要将所有这些值分成他们自己的变量。
编辑:
上面的答案实际上说明了你需要做什么,但也许有助于使其更清晰。在struts配置文件中,您可以在其中定义操作,例如
<action class="org.example.Payslip" name="payslip">
<interceptor-ref name="params"/>
<result name="success">/success.jsp</result>
</action>
确保那里有params拦截器。它将使服务器将params映射到setter。然后,您不需要为发送的每个内容执行getparameter调用。
此外,网址应该是... / payslip.action!pay?payslipid = 1234&amp; employeeid = 1234如果您将其映射为如上所示。这告诉它使用payslip.class和pay函数。
答案 4 :(得分:2)
Struts2使用params
拦截器来填充HTTP请求提交的表单值。
建议使用POST
方法,因此,如果您有敏感数据,并且您希望它不会反映在网址中。
拦截器使用参数名称来传递OGNL运行时,以评估应该在valueStack
中查找引用的表达式。
你有NullPointerException
,因为你没有初始化或注入依赖关系到OGNL评估引用的对象。因为您正在使用嵌套bean,所以应该可以访问和初始化所有嵌套属性(或者至少Struts2知道如何创建这些对象),并且属于放置在值堆栈的top
上的操作类。
答案 5 :(得分:2)
为Employee&amp; amp;实现可序列化界面工资单。另外,确保两者都有空构造函数。
为其他日志启用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>
答案 6 :(得分:2)
在action标签中添加输入参数;它允许您将参数从struts操作类传递到表单/ .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
}
因为,它是一个隐藏变量,不属于valuestack的一部分,你可以尝试这样传递它。
如果这不是你的问题;我认为你必须将bean注入Action类。 @Inject员工; bean进入Action类会有所帮助。
同时调试valuestack。
答案 7 :(得分:1)
您需要使用ModelDriven界面。实现ModelDriven并覆盖其方法,然后使用modelDriven方法返回对象。