0
votes

I'm learning Spring MVC 3 and I'm stuck on I guess a simple issue. I have a View calculator that takes 2 integers in a form. These are passed into my form pojo. My Controller adds and then prints to Catlina.out log. I want to pass my int sum; back to the view how can I acheive this.

Here's initial View

<table>
<tr>
    <td><form:label path="a">First Number</form:label></td>
    <td><form:input path="a" /></td>
</tr>
<tr>
    <td><form:label path="b">Second Number</form:label></td>
    <td><form:input path="b" /></td>
</tr>

<tr>
    <td colspan="2">
        <input type="submit" value="Add Numbers"/>
    </td>
</tr>

here's my controller:

@RequestMapping(value = "/addNumbers", method = RequestMethod.POST)

    public String addNumbers(@ModelAttribute("calculator")
    Calculator calculator, BindingResult result) {

        System.out.println(calculator.getA() + calculator.getB());
        return "redirect:calculator.html";

    }

Updated After initial question was answered, I have added a new view to display result and changed my controller:

<%@ include file="/WEB-INF/jsp/include.jsp" %>
<html>
<head>
    <title>Syed Shah</title>
</head>
<body>
<h2>Results</h2>

 ${calculator.A}

<a href="calculator.html">Back to Calculator</a>
</body>
</html>

My Calculator Instance:

package webcalculator.form;


//import webcalculator.domain.Numbers;

public class Calculator {


    private int A;
    private int B;
    private int sum;

    public int getA() {
        return A;
    }
    public void setA(int a) {
        A = a;
    }


    public int getB() {
        return B;
    }
    public void setB(int b) {
        B = b;
    }


    public int getAddSum(){
        sum = A+B;
        return sum;
    }


}

My new controller:

public class CalculatorController {

    @RequestMapping(value = "/addNumbers", method = RequestMethod.POST)
    public String addNumbers(Calculator calculator, BindingResult result, Model model) {

        //System.out.println(calculator.getA() + calculator.getB());
        model.addAttribute("calculator", calculator);
        return "result"; // notice no redirect

    }

Stack Trace:

org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/jsp/result.jsp at line 9

6: 7:

Results

8: 9: ${calculator.getAddSum} 10:
11: Back to Calculator 12:

Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:521) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:430) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238) org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:264) org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208) org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838) javax.servlet.http.HttpServlet.service(HttpServlet.java:637) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

javax.el.PropertyNotFoundException: Property 'getAddSum' not found on type webcalculator.form.Calculator javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:214) javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:191) javax.el.BeanELResolver.property(BeanELResolver.java:300) javax.el.BeanELResolver.getValue(BeanELResolver.java:81) javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54) org.apache.el.parser.AstValue.getValue(AstValue.java:123) org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:938) org.apache.jsp.WEB_002dINF.jsp.result_jsp._jspService(result_jsp.java:69) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238) org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:264) org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208) org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838) javax.servlet.http.HttpServlet.service(HttpServlet.java:637) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

2
Your form doesn't seem to match your handler method. Look into flash attributes since you are doing a redirect.Sotirios Delimanolis
Sotirios I am recieving the data from the form ok, as System.out.println(calculator.getA() + calculator.getB()); prints out the sum of these values. What I really want is to pass the sum back to the view not Catalina.logSyed

2 Answers

0
votes

Typically how you would do this is add your Object to the Model and return a view name.

@RequestMapping(value = "/addNumbers", method = RequestMethod.POST)
public String addNumbers(Calculator calculator, BindingResult result, Model model) {

    System.out.println(calculator.getA() + calculator.getB());
    model.addAttribute("calculator", calculator);
    return "myViewName"; // notice no redirect

}

Here, I assume your Calculator object contains the sum like calculator.getSum(). In a jsp, you can then do

${calculator.sum}

to retrieve the sum.

The above would also (probably) work without the Model and with the @ModelAttribute that you previously had. However, a ModelAttribute is only good for the scope of one request. All model attributes are added to the request attributes at some point during Spring's processing and are then available in the jsp you dispatch to.

However, since you do a redirect, a new request is made and your request attributes are lost. If you still want to do a redirect, you will have to use RedirectAttributes/FlashAttributes which are temporarily "persisted" in the session. Ctrl+F for them here.

0
votes

The root cause of your exception is deeper down the stacktrace.

javax.el.PropertyNotFoundException: Property 'getAddSum' not found on type webcalculator.form.Calculator

So your calculator does not have this method.

Also: since your calculator is a modelattribute already you dont have to add it again as far as i know.