JSP + servlet + Javabean:使用MVC模式,实现简单计算器

我们首先知道MVC模式是:模型(model)+ 视图(view) + 控制(control)。

在模型层,是对操作对象的封装。写的是java代码:
Cal.java

package Bean;

public class Cal {
    private double num1;
    private double num2;
    private String sign;
    private double result;

    public void setNum1(double num1){
        this.num1 = num1;
    }

    public void setNum2(double num2){
        this.num2 = num2;
    }

    public void setSign(String sign) {
        this.sign = sign;
    }

    public void setResult(double result) {
        this.result = result;
    }

    public double getNum1() {
        return num1;
    }

    public double getNum2() {
        return num2;
    }

    public double getResult() {
        return result;
    }

    public double add(double num1, double num2){
        return num1 + num2;
    }

    public double sub(double num1, double num2){
        return num1 - num2;
    }

    public double mul(double num1, double num2){
        return num1 * num2;
    }

    public double div(double num1, double num2){
        return num1 / num2;
    }

    public String getSign() {
        return sign;
    }


}


在视图层,我们写的是jsp代码:
index.jsp

<%--<%@ page import="Bean.Cal" %>--%>

<%@ page import="Bean.Cal" %>
<%@ page import="java.io.PrintWriter" %>
<%@ page import="com.sun.org.apache.xpath.internal.operations.String" %>

<%--
  Created by IntelliJ IDEA.
  User: 92407
  Date: 2018/9/6
  Time: 15:49
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>SimpleCalculatertitle>
  head>
  <body>
  <div align="center">
    <form action="/CalServlet"   method="post">
      数字一:<input name="num1" type="text" value=${requestScope.cal.num1} >
      <div name="radio">

          <%--这里的checked属性的作用是,在radio中,有checked这个 字段的话,
          就将当前radio设为默认选中,所以要想在后台返回数据,
          此时刷新的页面的情况下还能保持按钮的选中,就用checked。--%>
              <%--${requestScope.xxx.xxx}就是EL表达式的语法,他有一个作用域的功能,该作用域范围就是这几个相互跳转的页面
              .cal 就是 在后台servlet set过的属性,在servlet POST方法的倒数第二行中设置过了,这个对象和那里的对象,是同一个值。
              .sign 就是咱们之前封装过的在Cal.java里的对象值
              这里用到三目运算符,是选中当前的话,就赋予一个checked属性,就相当于选中了。不是当前的话,就是执行 空
              --%>

              <input type="radio" class="r" name="sign" value="1" ${requestScope.cal.sign == "1"?"checked":""}>+
              <input type="radio" class="r" name="sign" value="2" ${requestScope.cal.sign == "2"?"checked":""}>-
              <input type="radio" class="r" name="sign" value="3" ${requestScope.cal.sign == "3"?"checked":""}>*
              <input type="radio" class="r" name="sign" value="4" ${requestScope.cal.sign == "4"?"checked":""}>/
      div>
      数字二:<input name="num2" placeholder=" " type="text" value=${requestScope.cal.num2} ><br>
      <input type="submit" ><br>
      结  果:<input name="result" type="text" readonly value=${requestScope.cal.result} >
    form>

  div>
  body>
html>

在视图层的input获取值时,我使用了一个EL表达式。
El表达式常用于将数据库中获取到的值展示到前台页面上,与request.getParameter()有相似的功能,但后者常用于后台获取值。EL表达式获取不到值时,什么也不显示,而request.getParameter()会显示一个null。

补充:

“EL表达式表达形式简单,在对应的作用域中 对象.属性 就可以得到其值,但是要知道的是,在其内部,是默认调用了属性的getter方法的,所以想要使用这种调用形式,首先保证你要用的值在封装时有它对应的 getter 方法”


在控制层写的是servlet:
Calservlet.java

package Servlter;
import Bean.Cal;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//根据servlet3.0的新特性,不需要配置xml了,使用@的这一句就能解决原来的.xml文件配置问题
@WebServlet(name = "CalServlet", urlPatterns = "/CalServlet")
public class CalServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cal cal = new Cal();
        cal.setNum1(new Double(request.getParameter("num1")));
        cal.setNum2(new Double(request.getParameter("num2")));
        cal.setSign(request.getParameter("sign"));

        switch(cal.getSign().charAt(0)){
//.charAt(0)的意思是,在当前字符串(cal.getSign()取到的字符串)中,取第几个值,0就代表取第一个值,作用是防止手抖,多按了一个0。   
            case '1':cal.setResult(cal.add  (cal.getNum1(),cal.getNum2()));break;
            case '2':cal.setResult(cal.sub  (cal.getNum1(),cal.getNum2()));break;
            case '3':cal.setResult(cal.mul  (cal.getNum1(),cal.getNum2()));break;
            case '4':cal.setResult(cal.div  (cal.getNum1(),cal.getNum2()));
        }
//        将 new 的对象 cal 通过setAttribute()  方法 放到 request 中的, 方便其他地方,不用new这个对象也能用
        request.setAttribute("cal", cal);
//        由于这里没有通过页面重定向传值的,所以也就不需要值,只有定向的页面
        request.getRequestDispatcher("index.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

你可能感兴趣的:(IDEA设置,javaweb)