一、内置对象介绍
JSP内置对象:可以不用声明和创建,就可以直接在JSP页面脚本(Java程序片和Java表达式)中使用的成员变量。
那为什么不用生命和创建就可以直接使用呢?这是因为,内置对象必须由支持JSP的容器去创建。例如Tomcat就是一个容器。
JSP共有以下9大内置对象:
前四个是重点,后五个了解即可。这九个内置对象中,有四个作用域:request、session、application、page。作用域即这个对象的生命周期的范围。
二、内置对象out
类型:Javax.servlet.jsp.JspWriter
作用:主要用来向客户端输出数据
作用域:page。也就是说,每个页面都有一个自己的out对象。
重要方法:print()/println()/write() 向客户端页面输出数据
举例:
out.write("文字内容");
我们再到D:\apache-tomcat-8.0.14\work\Catalina\localhost目录中去看一下生成的Java源代码:
完整版代码如下:
View Code
在这里,我们可以这样理解,一个Jsp文件编译之后就是一个类,而out就对应一个页面对象。
三、内置对象request
类型:Javax.servlet.http.HttpServletRequest
描述:来自客户端的请求经Servlet容器处理后,由request对象进行封装。注:客户端和服务器的一次通信就是一次请求(发送请求或得到相应)。
作用域:request。说明,这次请求结束后,它的生命周期 就结束了。
重要方法:
getParameter(key) 获取提交表单的数据 getParameterValues(key) 获取提交表单的一组数据 request.getRequestDispatcher("list.jsp").forward(request,response) 转发(通过代码的方式进行转发) request.setAttribute(key,object) 设置请求对象的属性 request.gettAttribute(key) 获取请求对象的属性 request.setCharacterEncoding("UTF-8") 对请求数据重新编码
我们接下来将每个方法都介绍一下。
(1)getParameterValues(key) 获取提交表单的数据
举例:输入用户名密码,并验证正确性。
新建JavaWeb工程Test04,新建request.jsp文件,代码如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 4 5 6 7Insert title here 8 9 10 16 17
10至15行:添加表单,在里面输入用户名密码,然后将数据发送至request-receiver.jsp页面来处理(第10行的action里面的内容)。
新建request-receiver.jsp文件:
1 <% 2 //获取请求数据 3 String name = request.getParameter("user"); 4 String pwd = request.getParameter("pwd"); 5 System.out.println(name+","+pwd); 6 7 if("smyh".equals(name) && "007".equals(pwd)) { 8 out.println("登陆成功"); 9 }else{ 10 out.println("errors"); 11 } 12 %>
像request-receiver.jsp这样的页面,如果不需要显示在网页上,可以把自动生成的html代码全部删除。
整个过程是这样的:
运行程序,当我们在网页输入正确的用户名之后,效果如下:
然后点击“提交”,效果如下:
【乱码问题的解决】
显然我们已经登录成功了,但是这里出现了乱码。原因是:Tomcat默认编码为:iso8859-1。request.jsp页面发出去的数据是UTF-8编码,经过tomcat服务器后,变成了iso8859-1编码,所以需要在request-receiver.jsp将数据再转回来,变成UTF-8编码(这个问题涉及到另外一个内置对象,稍后再讲)。
另外一个问题是,如果我们输入的是中文的用户名,也可能出现乱码,可以在request-receiver.jsp文件里,加一句代码让用户名、密码在控制台输出显示,看一下就知道了。
为解决乱码的问题,我们需要在request-receiver.jsp文件中加一句话:
//设置请求方式的编码
request.setCharacterEncoding("UTF-8");
这样的话,就将获取到的数据改为了UTF-8编码。
此时,如果在控制台输出的用户名还出现乱码,是因为还涉及到了另外一个问题:在request.jsp中发送请求,默认是采用get方式,这个时候,参数就会作为url的一部分一起发给服务器(见上方图片中的url地址),而url的编码很显然不是UTF-8。所以,我们需要将其改为post方式。总而言之,完整版代码如下:
request.jsp:输入用户名密码,并提交给request-receiver.jsp:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 4 5 6 717 18Insert title here 8 9 10
第10行,将提交方式改为post,而非默认的get方式。
request-receiver.jsp:验证用户名、密码的正确性
1 <% 2 //获取请求数据 3 //设置请求方式的编码 4 request.setCharacterEncoding("UTF-8"); 5 String name = request.getParameter("user"); 6 String pwd = request.getParameter("pwd"); 7 System.out.println(name+","+pwd); 8 9 if("smyh".equals(name) && "007".equals(pwd)) { 10 out.println("登陆成功"); 11 }else{ 12 out.println("errors"); 13 } 14 %>
第4行,将获取到的请求数据还原为UTF-8的方式。
(2)getParameterValues(key) 获取提交表单的一组数据
我们现在往request.jsp中添加一组单选按钮:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 4 5 6 721 22Insert title here 8 9 10
13至15行是添加的三个单选按钮,构成了数组“likes”。
然后在request-receiver.jsp中获取这个数组,并在控制台输出:
1 <% 2 //获取请求数据 3 //设置请求方式的编码 4 request.setCharacterEncoding("UTF-8"); 5 String name = request.getParameter("user"); 6 String pwd = request.getParameter("pwd"); 7 System.out.println(name+","+pwd); 8 9 String[] likes = request.getParameterValues("likes"); 10 for(int i =0;i13 14 if("smyh".equals(name) && "007".equals(pwd)) { 15 out.println("登陆成功"); 16 }else{ 17 out.println("errors"); 18 } 19 %>
运行后,输入对应值:
后台输出如下:
(3)request.getRequestDispatcher("list.jsp").forward(request,response) 转发(通过代码的方式进行转发)
(4)request.setAttribute(key,object) 设置请求对象的属性
(5)request.gettAttribute(key) 获取请求对象的属性
现在的情形是,request.jsp负责发数据,request-receiver.jsp负责处理数据(判断用户名密码的正确性),如果用户名密码正确,那我们就通过request.getRequestDispatcher(request-success.jsp),将请求转发给request-success.jsp页面,显示出“登陆成功”的效果。
request.jsp代码不变:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 4 5 6 717 18Insert title here 8 9 10
request-receiver.jsp代码如下:
1 <% 2 //获取请求数据 3 //设置请求方式的编码 4 request.setCharacterEncoding("UTF-8"); 5 String name = request.getParameter("user"); 6 String pwd = request.getParameter("pwd"); 7 System.out.println(name+","+pwd); 8 9 if("smyh".equals(name) && "007".equals(pwd)) { 10 out.println("登陆成功"); 11 request.setAttribute("age", "22"); 12 request.getRequestDispatcher("request-success.jsp").forward(request, response); 13 14 }else{ 15 out.println("errors"); 16 } 17 %>
12行:如果用户名密码正确,就将这个请求转发给"request-success.jsp"。forward(request, response)表示当前的请求对象和当前的响应对象。
11行:在转发之前,我们可以给这个请求添加一些属性,然后在request-success.jsp页面中接收。
新建request-success.jsp,代码如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 4 5 6 7Insert title here 8 9 10 欢迎你,<%=request.getParameter("user") %>
11 年龄:<%=request.getAttribute("age") %> 12 13 14
10行:获取之前的用户名,显示“欢迎你”,表示登陆成功。
11行:获取获取请求对象的属性。
运行程序,输入用户名密码后,提交,出现如下界面:(注意url)
如果在request-receiver.jsp中没有加入第01、02行的编码方式(即页面的编码方式),最终显示的页面将会出现乱码:
四、内置对象resonpse
类型:Javax.servlet.http. HttpServletResponse
描述:它封闭了JSP 的响应,然后被发送到客户端以响应客户的请求。
作用域:page
重要方法:
response.sendRedirect("页面"):页面跳转。注意,之前的forward是转发,这里是跳转,注意区分。 response.setCharacterEncoding("gbk"):设置响应编码
注意,response.sendRedirect("页面")这个方法,是实现页面跳转,而不是转发。
【举例】现在需要做的是,如果登陆失败,我们就跳到另外一个界面,而不再是转发了。
request.jsp的代码依然不变。
request-receiver.jsp的代码如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 //获取请求数据 5 //设置请求方式的编码 6 request.setCharacterEncoding("UTF-8"); 7 String name = request.getParameter("user"); 8 String pwd = request.getParameter("pwd"); 9 System.out.println(name+","+pwd); 10 11 12 if("smyh".equals(name) && "007".equals(pwd)) { 13 out.println("登陆成功"); 14 request.setAttribute("age", "22岁"); 15 request.getRequestDispatcher("request-success.jsp").forward(request, response); 16 17 }else{ 18 //out.println("errors"); 19 response.setCharacterEncoding("UTF-8"); //设置响应的编码 20 //设置响应内容的类型 21 response.setContentType("text/html;charset=UTF-8"); 22 response.sendRedirect("response.jsp"); 23 } 24 %>
19行至22行是添加的代码:如果用户名、密码错误,就调到response.jsp页面去。
新建response.jsp,代码如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 4 5 6 7Insert title here 8 9 10 不好意思,登陆失败。 11 12
注意第06行的“content=text/html”,表示:指定服务器返回的数据类型。
运行程序,当输入的用户名、密码错误后,效果如下:(注意url)
重定向和转发:
重定向的意思是说,当页面进行跳转之后,request和response的生命周期已经结束,完全交给下一个页面去处理了(连url都变了);而转发的时候,还可以往request里面添加携带参数(url不变)。
五、session(会话)
类型:Javax.servlet.http.HttpSession
描述:表示一个会话,用来保存用户信息,以便跟踪每个用户的状态。(不要用来保存业务数据,request)
定义:是指在一段时间内客户端和服务器之间的一连串的相关的交互过程。
作用域:session。
如果是第一次接触“会话”这个概念,需要重复一下。说白了,客户端与服务器之间可能需要不断地进行数据交互(请求与相应),这个过程就可以理解为一段回话。Tomcat默认的会话时间为30分钟,这段时间内如果没有交互,会话结束;下次客户端一旦发送请求,重新创建会话。当客户端第一次发送请求的时候,才会创建一个会话。session的生命周期比request长
重要方法:
session.getid():取得session的id号.id由tomcat自动分配。 session.isnew():判断session时候是新建的 session.setAttribute(key,object):往当前会话中设置一个属性 session.getAttribute(key):获取当前会话中的一个属性 session.removeAttribute(key):删除当前会话中的属性 session.setMaxInactiveInterval(1000*60*30):设置当前会话失效时间(ms) 。Tomcat默认的会话时间为30分钟。 session.invalidate():初始化当前会话对象(一般在推出的时候使用,可以删除当前会话的数据)
会话结束的条件之一:
【举例】为保持用户登录的状态,我们可以把用户的数据信息保存在session中。
request.jsp登录表单的代码如下:用户登录界面
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 4 5 6 716 17Insert title here 8 9 10
session.jsp代码如下:(核心代码)
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 //获取请求数据 5 //设置请求方式的编码 6 request.setCharacterEncoding("UTF-8"); 7 String name = request.getParameter("user"); 8 String pwd = request.getParameter("pwd"); 9 10 if("smyh".equals(name) && "007".equals(pwd)) { 11 //将用户名、密码保存到当前会话当中 12 session.setAttribute("name", name); 13 session.setAttribute("pwd", pwd); 14 //如果登陆成功,就跳到session-success.jsp页面 15 response.sendRedirect("session-success.jsp"); 16 17 System.out.println(session.getId()); //获取当前回话的id 18 //session.setMaxInactiveInterval(1000*60*30); //设置当前session的有效时间 19 //session.invalidate() //设置session重新初始化,在系统退出时使用 20 }else{ 21 response.sendRedirect("fail.jsp"); 22 } 23 %>
12、13行:将用户名、密码保存到当前会话当中,只要这段会话没有结束,就可以从session中获取值。
15行:如果用户名密码正确,就跳到session-success.jsp界面
18行:设置当前session的会话时间,不过一般不在代码里设置,而是在web.index里设置:
1 23 Test04 45 12 13 14index.html 6index.htm 7index.jsp 8default.html 9default.htm 10default.jsp 1115 1730 16
14行至16行是我设置的会话时间,单位为min。
session-success.jsp代码如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 4 5 6 7Insert title here 8 9 10 <% 11 String name = (String)session.getAttribute("name"); 12 String pwd = (String)session.getAttribute("pwd"); 13 out.println("登陆成功"); 14 out.println(name+","+pwd); 15 System.out.println(session.getId()); //获取当前回话的id 16 %> 17 18 19
15行:获取当前会话的id,这个id和session.jsp中18行的id应该是同一个。
登录失败的界面fail.jsp的代码我就不写了。
运行程序,输入用户名密码,提交,会跳到session-success.jsp:
因为是同一个会话,所以后台输出的id也是同一个:
现在我们明白了,request中可以存数据,session中也可以存数据。如果是保存用户名信息等,可以存到session中;如果只需要传递数据(从这个页面传到另一个页面),就可以放在request中转发出去,避免内存浪费。
六、内置对象pageContext
类型:javax.servlet.jsp.PageContext
描述:本JSP的页面上下文。
作用域:page
注:上下文的理解:上下文可以联系到当前页面所有的信息。
我们先来回顾一下原始的request.jsp代码:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 4 5 6 716 17 18Insert title here 8 9 10
现在将上面的代码改成下面的这个样子:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 4 5 6 716 17Insert title here 8 9 10
20至23行:通过PageContext上下文对象获取当前页面的其他内置对象
24行:通过request.getContextPath()获取当前文件的绝对路径。此时,可以在第10行写上session.jsp文件的绝对路径(),以前都是用相对路径写的,是因为文件都在同一目录下。如果jsp文件在其他的文件夹,通过request.getContextPath()来获取路径就相当方便了,避免书写错误。程序运行后,效果如下:
七、内置对象application
类型:javax.servlet.ServletContext
描述:从servlet配置对象获得的servlet上下文
作用域:application
这个对象的生命周期是最长的。服务器启动的时候就会创建application对象。从服务器存在到服务器终止,都一直存在,且只保留一个对象,所有用户共享一个application。不是很常用。
举例:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 4 5 6 7Insert title here 8 9 10 11application对象
12 <% 13 //一个应用程序只有一个application对象 14 //在服务器启动时创建,到服务器关闭时销毁 15 //所有客户端共享一份 16 String serverPath = application.getContextPath();//获取当前应用程序的路径 17 out.println(serverPath); 18 //向application对象添加数据 19 application.setAttribute("", ""); 20 21 %> 22 23 24
八、内置对象config
类型:javax.servlet.ServletConfig
描述:本JSP的 ServletConfig
作用域:page
注:代表配置对象,基本用不到。
九、内置对象page
类型:java.1ang.Object
描述:实现处理本页当前请求的类的实例(javax.servlet.jsp.HttpJspPage),转换后的Servlet类本身
作用域:page
十、内置对象exception
类型:java.lang.Exception
描述:本JSP页面的异常对象
作用域:page
JSP常见错误状态码:
403:禁止访问。比如IP地址被拒绝,站点访问被拒绝等
404:找不到。没有找到文件或目录
500:服务器由于遇到错误而不能完成该请求,Web服务器太忙
举例:
新建一个错误页面error.jsp:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8" isErrorPage="true"%> 3 4 5 6 7Insert title here 8 9 10错误信息
11 错误信息为:<%=exception%> 12 13
第02行:必须通过isErrorPage="true"指定此页面为错误页面,否则出现了第11行的exception,程序就会报错。
新建另外一个页面use-eception.jsp:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8" errorPage="error.jsp" %> 3 4 5 6 7Insert title here 8 9 10 <% 11 int[] num = {9,2,3,2,8}; 12 for(int i =0;i<=num.length;i++){ 13 out.println(num[i]); 14 } 15 %> 16 17 18
我们故意在11至14行写一段错误的代码;
02行:命令 errorPage="error.jsp",表示指定错误页面为error.jsp,如果本页面发生错误,就会跳到error.jsp页面中去。
程序运行后,效果如下:
不过,实际程序中,一般不这么写,因为业务是写在类里,如果发生错误,将采取其他的办法来处理,那就以后再说咯~~~
【声明】
欢迎转载,但请保留文章原始出处→_→
生命壹号:http://www.cnblogs.com/smyhvae/
文章来源:http://www.cnblogs.com/smyhvae/p/4065790.html