JSP内置对象
1、JSP内置对象有9个:application,config,exception,out,page,pageContext,request,response,session.
2、request请求对象
request请求对象封装了由客户端生成的HTTP请求的所有细节,包括HTTP头信息、系统信息、请求方式和请求参数等。通过request提供的方法,可以处理客户端浏览器提交的HTTP请求中的各项参数。
1) 获取访问请求参数:通过超链接的形式发送请求时,可以用?和&加上参数信息,接收的页面可以通过request对象的getParameter方法获得此参数。
2) 获取表单提交的信息:通过getParameter方法获取表单的信息,以相对应的name值进行传递,返回参数类型是String,有时候也用getParameterValues方法获取参数。
3) 解决中文乱码问题
获取请求参数时乱码:将获取到的字符串数据用String类的构造方法,用UTF-8或者GBK重新构造一个String对象,才可以正确显示中文。String user=new String(request.getParameter("user").getBytes("iso-8859-1"),"utf-8");
获取表单信息时乱码:可以在page指令下方加上request对象的setCharacterEncoding("utf-8")方法。
4) 进行数据传递:通过request对象的getAttribute(String name,Object object);方法把数据保存在request对象中,通过getAttribute(String name).toString();将数据取出。
index.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>request练习</title> </head> <body> <!--先用try捕获页面一次,catch进行异常处理 ,转向错误显示页面--> <% try { int a=12; int b=0; request.setAttribute("result",a/b); } catch(Exception e) { request.setAttribute("request", "您的页面错误!"); } %> <jsp:forward page="deal.jsp" /> </body> </html>
deal.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>错误页面</title> </head> <body> <% String message=request.getAttribute("request").toString(); %> <%=message %> </body> </html>
5) 获取客户端信息
6) 获取cookie:它是互联网上的小段的文本信息,在网络服务器上生成,并发送给浏览器。浏览器将cookie以key/value的形式保存到和客户端的某指定目录中。
7) 显示国际化信息
3、response对象:response对象用于响应客户请求,向客户端发送响应信息。请求的信息可以是数据类型也可以是文件。response对象在JSP页面内有效。
1) 实现重定向页面:重定向操作支持将地址重定向到不同的主机上,重定向后,request中的属性全部失效,并且开始一个新的request对象。方法是sendRedirect(String url)。
重定向和请求转发(<jsp:forward page="">)的不同是前者不会改变浏览器的地址值,而后者是会跳转到其它页面,地址会改变。
2) 处理HTTP文件头:可以设置HTTP响应报头
设置响应的内容类型:response.setContentType(String type);,type用于指定响应的内容类型。
禁用缓存:代码是<%response.setHeader("Cache-Control","no-store"); response.setDateHeader("Expires",0);%>
设置页面自动刷新:<%response.setHeader("refresh","10");%>
定时跳转网页:<%response.setHeader("refresh","5;URL=login.jsp");%>
3) 设置输出缓冲:通常,服务器要输出到客户端的内容不会直接写到客户端,而是要先输出到一个缓冲区中,然后满足一定条件才会把内容输出到客户端。条件便是:
JSP页面的全部信息都写到缓冲区中了;
缓冲区已满;
在JSP页面中调用了response对象的flushbuffer()方法或out对象的flush()方法。
4、out对象:用于向客户端输出信息,并管理应用服务器上的输出缓冲区。注意及时关闭输出流。
1) 向客户端输出数据:print()方法和JSP表达式效果一样,println()有一个换行,但实际情况下两者效果一样,看不到换行,需要用预格式化标签<pre></pre>来处理。
2) 管理相应的缓冲区:clear方法清除缓冲区内容,但提交了内容是要报异常IOException,用clearBuffer()方法是不会报异常的。
5、session对象:session在网络中叫会话,由于http协议是单纯的请求和访问,并不会保存活动状态,为弥补此缺点,session对象就是保存用户的信息,让用户可以在web间跳转都可以保持会话,不会中断,直到关闭浏览器。会话的时间长度是由服务器来设置的。
1) 创建和获取客户的session:用户名或者购物车需要用到session对象。将信息保存在session中的方法是session.setAttribute(String name,Object object),获取session用session.getAttribute(String name);
2) 从会话中移除某一个对象:session.removeAttribute(String name);
3) 设置session的有效时间:session.setMaxInactiveInterval(int time),参数单位是秒。
4) 销毁会话:session.Invalidate();
6、application应用对象:用于保存所有应用程序中的公有数据。它在服务器启动时自动创建,在停止时自动销毁。它类似于全局变量。
1) 访问应用程序初始化参数:应用程序的初始化参数存放在web.xml中,比如Mysql数据库配置的字符串可以存放在web.xml文件中。application对象提供了两种方法来访问应用程序初始化参数。其实际上是在访问web.xml中的数据。两个方法是application.getInitParameter(String name);和application.getAttributeNames();返回枚举类型的数据。
2) 应用程序环境属性管理:通过application对象可以存储、读取或者移除应用程序环境属性。方法有setAttribute(String name,Object object);,getAttribute(String name)和getAttributeNames();和removeAttribute(String name);
7、应答与请求的page对象:page对象代表JSP本身,在jsp页面内才是合法的,page对象本质上是包含当前Servlet接口引用的变量,可以看作this关键字的别名。
8、获取页面上下文的pageContext对象:通过它可以获取JSP页面的request、response、session、application、Exception等对象。
9、获取web.xml配置信息的config对象。
10、获取异常信息的Exception对象:用来处理JSP页面所有的异常和错误。只有在page指令中设置为isErrorPage属性值为true的页面才可以被使用。如果在JSP页面中出现没有捕捉到的异常,就会生成Exception对象,并把Exception对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的Exception对象。
11、session的例子
index.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% /* 用session对话编写登录程序: index.jsp页面用于收集用户登录信息;deal.jsp页面用于模拟用户登录,创建session对象, 如果用户登录成功,将用户名保存在session范围内的变量中,并将页面重定向到main.jsp页面中,否则将页面重定向到index.jsp 页面中,重新登录;编写main.jsp显示保存在session中的变量,然后加入一个退出超链接;编写一个exit.jsp,销毁session, 重新定向到index.jsp */ %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>首页</title> </head> <body> <form name="form1" method="post" action="deal.jsp"> 用户名:<input type="text" name="username" id="username"> 密码:<input type="password" name="pwd" id="pwd"> <input type="submit" name="submit1" value="登录"> </form> </body> </html>
deal.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ page import="java.util.*" %> <% //定义一个存储用户数据的二位数组,用来和用户登录数据进行比对 String[][] userList={{"user1","pwd1"},{"user2","pwd2"},{"user3","pwd3"}}; request.setCharacterEncoding("UTF-8"); //保证中文用户名正常输入 String user=request.getParameter("username"); //获取用户名 String pwd=request.getParameter("pwd"); //获取密码 boolean tag=false; //设置登录状态,默认是未登录 //遍历存储的用户数据,进行比对 for(int i=0;i<userList.length;i++) { if(userList[i][0].equals(user) && userList[i][1].equals(pwd)) { tag=true; //如果用户名和密码匹配,为登录状态 break; } } if(tag) { //将用户名和密码保存在session会话中,保证页面跳转都能能在登录状态 session.setAttribute("user", user); //session.setAttribute("pwd", pwd); response.sendRedirect("main.jsp"); } else { response.sendRedirect("index.jsp"); } %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>模拟登陆页面</title> </head> <body> </body> </html>
main.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String user=(String)session.getAttribute("user"); //String pwd=(String)session.getAttribute("pwd"); %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>登录成功显示</title> </head> <body> <%= "您好!欢迎"+user+"访问!" %> <a href="exit.jsp">退出登录</a> </body> </html>
exit.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>销毁会话退出登录</title> </head> <body> <% session.invalidate();//销毁会话 response.sendRedirect("index.jsp"); //重定向到首页 %> </body> </html>
12、有验证码登录的例子
index.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 带验证码的用户登录 --> <!-- 设计步骤: 1、设置用户名、密码、验证码框 2、设计随机数 3、设计隐藏域文本框 4、显示验证码图片,将随机数值和图片名称匹配 5、设置重置和提交按钮 6、用js验证表单是否为空 7、设置支持中文的编码 8、用request对象获得表单数据,判断验证码和用户名密码的合法性 9、登录结果用js代码给出提示界面 --> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>用户登录设计</title> <style> .submit2 {} </style> <!-- 验证表达是否为空 --> <script type="text/javascript"> function mycheck() { if (form1.username.value == "") { //判断用户名是不为空 alert("请输入用户名!"); form1.username.focus(); return; } if (form1.pwd.value == "") { //判断密码是否为空 alert("请输入密码!"); form1.pwd.focus(); return; } if (form1.yanzheng.value == "") { //判断验证码是否为空 alert("请输入验证码!"); form1.yanzheng.focus(); return; } if (form1.yanzhengma.value != form1.hidden1.value) { //判断验证码是否正确 alert("请输入正确的验证码!!"); form1.yanzhengma.focus(); return; } } </script> </head> <body> <!-- 设置用户名密码验证码文本框 --> <form name="form1" method="post" action="check.jsp"> 用户名:<input type="text" name="username"><br><br> 密码: <input type="password" name="pwd"><br><br> 验证码:<input type="text" name="yanzhengma" size="8"> <!-- 设置随机数 --> <% int num1=(int)(Math.random()*10); int num2=(int)(Math.random()*10); int num3=(int)(Math.random()*10); int num4=(int)(Math.random()*10); String sumNum=""+num1+num2+num3+num4; %> <!-- 设计隐藏域文本 --> <input type="hidden" name="hidden1" value="<%=sumNum%>"> <!-- 显示验证码图片 --> <img src="num/<%= num1%>.GIF"> <img src="num/<%= num2%>.GIF"> <img src="num/<%= num3%>.GIF"> <img src="num/<%= num4%>.GIF"> <br><br> <input type="submit" name="submit1" class="submit2" value="登录" onclick="mycheck()"> <input type="reset" name="reset1" class="submit2" value="重置"> </form> </body> </html>
deal.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% request.setCharacterEncoding("UTF-8"); //中文保证输入 String username=request.getParameter("username"); //获取用户名 String pwd=request.getParameter("pwd"); //获取密码 String message; if(!request.getParameter("hidden1").equals(request.getParameter("yanzhengma"))) { message="您输入的验证码不正确!"; } else if(username.equals("joe") && pwd.equals("shine")) { message="可以登录系统!"; } else { message="您输入的用户名或密码不正确!"; } %> <script type="text/javascript"> alert("<%=message%>"); window.location.href="index.jsp"; </script>