2010-11-06 38 views
17

Questa è una sorta di continuazione del mio previous question, ma ritengo che meritasse di essere autonomo, soprattutto per la risposta molto dettagliata che ho ricevuto.Calcolatrice semplice con JSP/Servlet e Ajax

Vorrei creare una semplice calcolatrice in jsp. Ci saranno due caselle di testo per i numeri e un pulsante Aggiungi. Idealmente, voglio che la risposta appaia nella pagina senza ricaricare, ma dalla risposta che ho ottenuto, sembra troppo grande per la mia scala. Posso pensare a: 1) stampare la risposta a una terza casella di testo (è possibile?) O in qualche modo caricare la stessa pagina (con il pulsante Aggiungi e tutti) con la risposta (e poter inserire numeri diversi e così via) .

Puoi suggerire un buon modo per farlo?

+0

È possibile creare senza alcun servlet. Solo con html + javascript. Un altro modo: effettuare calcoli sul server. Qui è necessario l'Ajax per evitare il ricaricamento della pagina. Con il modo in cui preferisci e dove hai problemi? –

risposta

23

sembra troppo grande per il mio scala

Che in realtà dipende dal contesto e le esigenze funzionali. È piuttosto semplice e banale però. Sembra che siano "troppe informazioni" per te e che tu abbia effettivamente bisogno di imparare i concetti separati (HTTP, HTML, CSS, JS, Java, JSP, Servlet, Ajax, JSON, ecc.) singolarmente in modo che il un'immagine più grande (la somma di tutte quelle lingue/tecniche) diventa più ovvia. È possibile trovare this answer utile quindi.

In ogni caso, ecco come si potrebbe fare con un semplice JSP/Servlet senza Ajax:

calculator.jsp:

<form id="calculator" action="calculator" method="post"> 
    <p> 
     <input name="left"> 
     <input name="right"> 
     <input type="submit" value="add"> 
    </p> 
    <p>Result: <span id="result">${sum}</span></p> 
</form> 

con CalculatorServlet che viene mappato su un url-pattern di /calculator:

@Override 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    Integer left = Integer.valueOf(request.getParameter("left")); 
    Integer right = Integer.valueOf(request.getParameter("right")); 
    Integer sum = left + right; 

    request.setAttribute("sum", sum); // It'll be available as ${sum}. 
    request.getRequestDispatcher("calculator.jsp").forward(request, response); // Redisplay JSP. 
} 

Fare Ajaxica Anche le cose da lavorare non sono così difficili. E 'una questione di includere le seguenti JS all'interno HTML del JSP <head> (si prega di scorrere verso destra per vedere i commenti di codice che spiega ciò che ogni singola riga fa):

<script src="http://code.jquery.com/jquery-latest.min.js"></script> 
<script> 
    $(document).ready(function() {             // When the HTML DOM is ready loading, then execute the following function... 
     $('#calculator').submit(function() {           // Locate HTML element with ID "calculator" and execute the following function on its "submit" event... 
      $form = $(this);               // Wrap the form in a jQuery object first (so that special functions are available). 
      $.post($form.attr('action'), $form.serialize(), function(responseText) { // Execute Ajax POST request on URL as set in <form action> with all input values of the form as parameters and execute the following function with Ajax response text... 
       $('#result').text(responseText);          // Locate HTML element with ID "result" and set its text content with responseText. 
      }); 
      return false;               // Prevent execution of the synchronous (default) submit action of the form. 
     }); 
    }); 
</script> 

e cambiando le ultime due righe di doPost come segue:

response.setContentType("text/plain"); 
    response.setCharacterEncoding("UTF-8"); 
    response.getWriter().write(String.valueOf(sum)); 

si può anche fare un controllo condizionale in modo che il modulo lavora ancora per il caso che l'utente ha disabilitato JS:

if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) { 
     // Ajax request. 
     response.setContentType("text/plain"); 
     response.setCharacterEncoding("UTF-8"); 
     response.getWriter().write(String.valueOf(sum)); 
    } else { 
     // Normal request. 
     request.setAttribute("sum", sum); 
     request.getRequestDispatcher("calculator.jsp").forward(request, response); 
    } 
+0

un seguito per i primi frammenti: se aggiungo un altro pulsante che esegue una sottrazione, come posso dire al servlet quale è stato premuto? –

+1

Anche il nome e il valore del pulsante vengono inviati come parametro di richiesta. Controlla la sua presenza e/o il suo valore. Vedi anche [questa risposta] (http://stackoverflow.com/questions/954327/hidden-features-of-html/1978039#1978039). – BalusC

+0

@BalusC: come passare il valore del pulsante con l'esempio JS (JQuery non lo fa per gli elementi di input "submit")? – AndrewBourgeois

2

probabilmente, il modo più semplice sarà creare form con due campi e pulsante di invio. Sul lato server è possibile aggiungere due numeri e stamparlo. Smt piace:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.setContentType("text/html"); 
    int a = Integer.valueOf(request.getParameter("a")); 
    int b = Integer.valueOf(request.getParameter("b")); 
    int res = a + b; 
    response.getWriter().println(res); 
} 
1

Questo può assolutamente essere fatto e può essere fatto usando semplice html e javascript. È possibile evitare l'uso del calcolo Java lato server per questo.

A mio parere, dovremmo provare a mantenere meno carico sul server. Perché caricare il server quando questo può essere fatto dal lato client?

Calcoli semplici come addizione, sottrazione, moltiplicazione e divisione possono essere raggiunti scrivendo funzioni javascript come add (a, b), sub (a, b), mul (a, b), div (a, b). E queste funzioni possono essere richiamate da eventi di clic del pulsante Dfferent.

+0

Come puoi immaginare, ho fatto questa domanda (tanto tempo fa) non perché volevo creare un avvio basato su calcolatrici online, ma perché volevo learn JSP. –

+0

Ok. Capito :). Ho appena provato ad aiutare. In mia difesa ho appena iniziato a utilizzare StackOverflow per scrivere risposte. In precedenza per me era solo di sola lettura. :). Quindi non ho notato che questa domanda è stata posta molto tempo fa. –

+0

Va bene. Benvenuto nella community :) –

3

io non sono sicuro se questo può aiutare, ma è atleast un programma semplice calcolatrice

 protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    /*READ THE FIRST NUMBER FROM TEXTBOX NAMED num1*/ 
    Integer num1= Integer.parseInt(request.getParameter("num1")); 

    /*READ THE SECOND NUMBER FROM TEXTBOX NAMED num2*/ 
    Integer num2=Integer.parseInt(request.getParameter("num2")); 

    /*READ THE OPERATOR VALUE FROM SELECT TAG NAMED operator*/ 
    String operator=request.getParameter("operator"); 

    /*THE FINAL RESULT*/ 
    Integer result=0; 

    /*THE RESPONSE TO THE CLIENT WILL BE IN HTML FORMAT*/ 
    response.setContentType("text/html"); 
    PrintWriter out = response.getWriter(); 
    try { 
     /*ALTERNATIVELY IF STATEMENT CAN ALSO BE USED 
        if("+".equals(operator)) 
     { 
      result = num1 + num2; 
     } 
     else if("-".equals(operator)) 
     { 
      result = num1 - num2; 
     } 
     else if("*".equals(operator)) 
     { 
      result = num1 * num2; 
     } 
     else if ("/".equals(operator)) 
     { 
      result = num1/num2; 
     } 

     */ 
     switch(operator) 
     { 
      case("+"): /*IF PLUS*/ 
       result=num1+num2; 
       break; 
      case("-"): /*IF MINUS*/ 
       result=num1-num2; 
       break; 
      case("*"): /*IF MULTIPLICATION*/ 
       result=num1*num2; 
       break; 
      case("/"): /*IF DIVISION*/ 
       result=num1/num2; 
       break; 
     } 

     /* TODO output your page here. You may use following sample code. */ 
     out.println("<!DOCTYPE html>"); 
     out.println("<html>"); 
     out.println("<head>"); 
     out.println("<title>Servlet ServletCalculator</title>");    
     out.println("</head>"); 
     out.println("<body>"); 
     /*THE PART OF OUTPUT TO THE CLIENT*/ 
     out.println("<h1>" + num1 +" "+operator+" "+num2+" = " + result+"</h1>"); 
     out.println("</body>"); 
     out.println("</html>"); 
    } finally {    
     out.close(); 
    } 
} 

e l'HTML è

<!DOCTYPE html> 
    <html> 
     <body> 
      <form action="ServletCalculator"> 
       enter first number <input name="num1" type="text"/> 
     <select name="operator"> 
      <option value="+"> + </option> 
      <option value="-"> - </option> 
      <option value="*"> * </option> 
      <option value="/">/</option> 
     </select> 
     enter second number <input name="num2" type="text"/> 
     <button type="submit"> Calculate </button> 
      </form> 
     </body> 
    </html>