likes
comments
collection
share

JSP 域对象详细讲解

作者站长头像
站长
· 阅读数 38

JSP 域对象

JSP 四大域对象介绍[作用:存取数据]

  1. pageContext (域对象,存放的数据只能在当前页面使用),

JSP 域对象详细讲解

  1. request (域对象,存放的数据在一次 request 请求有效) JSP 域对象详细讲解

  2. session(域对象,存放的数据在一次会话有效)

JSP 域对象详细讲解

  1. application(域对象,存放的数据在整个 web 应用运行期间有效, 范围围更大)

JSP 域对象详细讲解 JSP 域对象详细讲解

应用实例

scope.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>scope文件</title>
</head>
<body>
<%
    //在不同的域对象中,放入数据
    //1. 因为四个域对象,是不同的对象,因此name(key) 相同时,并不会冲突
    pageContext.setAttribute("k1", "pageContext数据(k1)");

    request.setAttribute("k1", "request数据(k1)");

    session.setAttribute("k1", "session数据(k1)");

    application.setAttribute("k1", "application数据(k1)");

    //做一个请求转发的操作
    //request.getRequestDispatcher("/scope2.jsp").forward(request, response);

    //做一个重定向
    String contextPath = request.getContextPath();//返回的就是 web路径=>/jsp

    //response.sendRedirect("/jsp/scope2.jsp");
    response.sendRedirect(contextPath + "/scope2.jsp");
%>
<h1>四个域对象,在本页面获取数据的情况</h1>
pageContext-k1: <%=pageContext.getAttribute("k1")%><br/>

request-k1: <%=request.getAttribute("k1")%><br/>

session-k1: <%=session.getAttribute("k1")%><br/>

application-k1: <%=application.getAttribute("k1")%><br/>
</body>
</html>

scope2.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>scope2.js</title>
</head>
<body>

<h1>在scope2页面获取数据的情况</h1>
pageContext-k1: <%=pageContext.getAttribute("k1")%><br/>

request-k1: <%=request.getAttribute("k1")%><br/>

session-k1: <%=session.getAttribute("k1")%><br/>

application-k1: <%=application.getAttribute("k1")%><br/>
</body>
</html>

SP 四大域对象注意事项和细节

1. 域对象是可以像 Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存储范围

2. **从存储范围(**作用域范围看) pageContext < request < session < app

JSP 请求转发标签

1. 演示请求转发标签使用,如图

JSP 域对象详细讲解

aa.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>aa.jsp</title>
</head>
<body>
<h1>aa.jsp</h1>
<%--
1. jsp提供了很多标签,但是因为jsp不是重点,这里就演示一个常用forward
2. jsp:forward 本质就是 等价 request.getRequestDispatcher("/bb.jsp").for...
--%>
<jsp:forward page="/bb.jsp"></jsp:forward>
</body>
</html>

bb.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>bb.jsp</title>
</head>
<body>
<h1>bb.jsp页面</h1>
</body>
</html>

使用 jsp 完成一个简单的计算器,

需求

  1. 要求在前端页面对输入的 num1 和 num2 进行校验必须是整数

  2. 验证成功, 提交数据给服务器, 能够显示结果

  3. 点击超链接, 可以返回界面如果用户这样提交http://localhost:8080/jsp/calServletnum1=aaa&num2=90

    需要你返回 calUI.jsp , 并给出提示信

JSP 域对象详细讲解

JSP 域对象详细讲解

● 思路分析(程序框架图)

JSP 域对象详细讲解

calUI.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSP计算器</title>
    <!--使用js+正则表达式完成数据校验-->
    <script type="text/javascript">
        function check() {
            //得到 num1 和 num2值
            var num1 = document.getElementById("num1").value;
            var num2 = document.getElementById("num2").value;

            //验证 正则表达式, 整数
            var reg = /^[-]?([1-9]\d*|0)$/;
            if (!reg.test(num1)) {//如果不满足验证条件
                alert("num1 不是一个整数");
                return false;//放弃提交
            }
            if (!reg.test(num2)) {//如果不满足验证条件
                alert("num2 不是一个整数");
                return false;//放弃提交
            }
            return true;//提交到action指定的位置
        }
    </script>
</head>
<body>
<h1>JSP计算器</h1>
<form action="<%=request.getContextPath()%>/calServlet"
      method="post" onsubmit="return check()">
    num1: <input type="text" id="num1" name="num1"> num1错误:xx <br/>
    num2: <input type="text" id="num2" name="num2"> num2错误:xx<br/>
    运算符号:
    <select name="oper">
        <option value="+">+</option>
        <option value="-">-</option>
        <option value="*">*</option>
        <option value="/">/</option>
    </select><br/>
    <input type="submit" value="提交计算">
</form>
</body>
</html>

CalCLServlet.java

public class CalServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("CalServlet 被调用...");
        //1. 是Servlet
        //2. 接收数据
        //String num1 = request.getParameter("num1");
        //String num2 = request.getParameter("num2");
        //进行转换->int
        double num1 = WebUtils.parseDouble(request.getParameter("num1"), 0);
        double num2 = WebUtils.parseDouble(request.getParameter("num2"), 0);
        String oper = request.getParameter("oper");
        double res = 0; //使用变量来接收运算结果
        //防止跳过jsp验证在这里可以在用正则表达式判断一次
        //如果错误就重定向并且提示错误让用户重新输入
        //3. 完成计算
        if ("+".equals(oper)) {
            res = num1 + num2;
        } else if ("-".equals(oper)) {
            res = num1 - num2;
        } else if ("*".equals(oper)) {
            res = num1 * num2;
        } else if ("/".equals(oper)) {
            res = num1 / num2;
        } else {
            System.out.println(oper + " 不正确...");
        }

        //4. 把结果保存到域对象[request, session, servletContext]
        //   因为一次请求对应一次计算, 所以我建议将结果保存到request
        //  把结果组织到一个字符串中., 方便我们在下一个页面显示

        String formatRes = String.format("%s %s %s = %s", num1, oper, num2, res);
        request.setAttribute("res", formatRes);

        //System.out.println("formatRes= " + formatRes);
        //5. 转发到显示页面 calRes.jsp

        request.getRequestDispatcher("/cal/calRes.jsp").forward(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

calRes.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>计算结果</title>
</head>
<body>
<h1>计算结果</h1>
<%=request.getAttribute("res")%><br/>
<%--<a href="/jsp/cal/calUI.jsp">返回重新来玩一把</a>--%>
<a href="<%=request.getContextPath()%>/cal/calUI.jsp">返回重新来玩一把~</a>
</body>
</html>