版权声明:欢迎朋友们的观摩,标注原创的文章,如应用,请标明出处,谢谢。 https://blog.csdn.net/qq_37012770/article/details/82585670
我们首先知道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>SimpleCalculater</title>
</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);
}
}