JSP 域对象
JSP 四大域对象介绍[作用:存取数据]
- pageContext (域对象,存放的数据只能在当前页面使用),
- request (域对象,存放的数据在一次 request 请求有效)
- session(域对象,存放的数据在一次会话有效)
- application(域对象,存放的数据在整个 web 应用运行期间有效, 范围围更大)
应用实例
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. 演示请求转发标签使用,如图
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 完成一个简单的计算器,
需求
- 要求在前端页面对输入的 num1 和 num2 进行校验必须是整数
- 验证成功, 提交数据给服务器, 能够显示结果
- 点击超链接, 可以返回界面如果用户这样提交http://localhost:8080/jsp/calServletnum1=aaa&num2=90
需要你返回 calUI.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>