什么是隐式对象?

这里写图片描述

我们可以在_jspService方法中找到对应的局部变量,这些变量我们称之为隐式对象(又叫内置对象)。
提供内部隐式对象的目的是为了简化JSP开发
JSP 隐式对象是 Web 容器加载的一组类
不需要由JSP的编写者实例化,它们由JSP容器实现和管理。在所有JSP页面中都能使用内部对象。
内部对象只对表达式和Scriptlet有用,在声明中不能使用。
隐式对象的名称是 JSP 的保留字

<%! int out = 0; %>/*声明成员变量*/

<% int out = 0; %>/*定义局部变量,但是out已经定义过了,不能重复定义*/

<%! void t(){
    System.out.println(request.getParameter(“userName”));
}/*声明成员方法,但是request是_jspService方法中的局部变量,不能在成员方法中引用*/
%>


[面试题] jsp 有哪些域对象和内置对象及他们的作用?

四大域对象:
(1)pageContext    page 域-指当前页面,在当前 jsp 页面有效,跳到其它页面失效,相当于java类中的类;
(2)request    request 域-指一次请求范围内有效,从 http 请求到服务器处理结束,返回响应的整个过程,在这个过程中使用 forward(请求转发)方式跳转多个 jsp,在这些页面里你都可以使用这个变量,相当于java类中方法的局部变量;
(3)session    session 域-指当前会话有效范围,浏览器从打开到关闭过程中,转发、重定向均可以使用;
(4)application    context 域-指只能在同一个 web 中使用,服务器未关闭或者重启,数据就有效,相当于java类中的静态全局变量。

9大内置对象:
这里写图片描述

隐式对象的分类

这里写图片描述

输入输出对象


作用:

  1. 控制页面的输入和输出
  2. 访问与所有请求和响应有关的数据

request
接收客户端的请求参数,包括来自GET/POST方法的参数;
实现javax.servlet.http.HttpServletRequest接口。

这里写图片描述

request.setAttribute("User", name);//在第一个JSP页面,然后在第二个JSP页面用request.getAttribute("User")
request.getRequestDispatcher("index.jsp").forward(request, response);//请求转发

该对象的常用方法:

String getParameter(String name)
String[] getParameterValues(String name)
void setAttribute(String key, Object value)
Object getAttriubte(String key)
void setCharacterEncoding(String enc)
getSession()

如下:

request.setCharacterEncoding("utf-8");//针对post请求,解决乱码问题,是设置从request中取得的值或从数据库中取出的值
//username可以是表单中input输入框中的name值,也可以是<a>标签href中的值
<a href="main.jsp?username=lisi&password=123">点击</a>
String name = request.getParameter("username");

//登录成功 跳到首页 地址栏url不变
request.setAttribute("User", name);//第一个位置必须是字符串,第二个位置是个object  request.getRequestDispatcher("index.jsp").forward(request, response);//请求转发
Object obj=request.getAttribute("User");
String path=request.getSession().getServletContext().getRealPath("/");
out.println(path);//获得“D:\apache-tomcat-7.0.82\webapps\Message\ ”即相对于tomcat的物理路径

StringBuffer url=request.getRequestURL();//获得“http://localhost/Message/New.jsp”的路径
out.println(url.toString()+"<br>");
String uri=request.getRequestURI();//获得“/Message/New.jsp ”的路径
out.println(uri);

response
负责生成对客户端的响应内容;
实现javax.servlet.http.HttpServletResponse 接口;
JSP引擎把客户端的请求信息封装在request对象中,然后交由服务端组件进行处理,组件处理完毕后通过response设置响应信息。

该对象的常用方法:

void setContentType (String name)
设置作为响应生成的内容的类型和字符编码
void sendRedirect (String name)
发送一个响应给浏览器,指示其应请求另一个URL
void setCharacterEncoding(String charset)
设置响应内容的字符集

response.setContentType("text/xml;charset=utf-8");//是设置页面中为utf-8编码,指定了 HTTP 响应的编码,同时指定了浏览器显示的编码. 

//密码错误  错误详细到login页面
session.setAttribute("result", "密码错误");//第一个位置必须是字符串,第二个位置是个object  
response.sendRedirect("login.jsp");//重定向 地址栏url改变
Object obj = session.getAttribute("result");

response.setCharacterEncoding("utf-8");//设置HTTP 响应的编码,如果之前使用response.setContentType设置了编码格式,则使用response.setCharacterEncoding指定的编码格式覆盖之前的设置

当服务器端调用response.sendRedirect (“http://www.g.cn”)时,服务器将向客户端发出如下响应结果:

HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
Location: http://www.g.cn
Content-Length: 0
Date: Fri, 17 Apr 2009 04:18:05 GMT

客户端收到响应后重新请求Location指定的位置。

out

out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。

常见方法:
write()、print()、println()

<% 
out.print("欢迎来到 JSP:隐式对象"+"<br>") ;
out.write("欢迎隐式对象") ;
out.write(97);//a
out.print(48);//48
response.getWriter().write("123");//123
%>

运行结果:
123欢迎来到 JSP:隐式对象
欢迎隐式对象a4848

write()和print()方法的区别:
(1)、write():仅支持输出字符类型数据,字符、字符数组、字符串等
(2)、print():可以将各种类型(包括Object)的数据通过默认编码转换成bytes字节形式,这些字节都通过write(int c)方法被输出

response.getWriter()和out的区别:
(1)、out和response.getWriter的类不一样,一个是JspWriter,另一个是java.io.PrintWriter。
(2)、执行原理不同:JspWriter相当于一个带缓存功能的printWriter,它不是直接将数据输出到页面,而是将数据刷新到response的缓冲区后再输出,
response.getWriter直接输出数据(response.print()),所以(out.print)只能在其后输出。
(3)、out为jsp的内置对象,刷新jsp页面,自动初始化获得out对象,所以使用out对象是需要刷新页面的,
而response.getWriter()响应信息通过out对象输出到网页上,当响应结束时它自动被关闭,与jsp页面无关,无需刷新页面
形象的比喻:当我们调用response.getWriter()这个对象同时获得了网页的画笔,这时你就可以通过这个画笔在网页上画任何你想要显示的东西。
(4)、out的print()方法和println()方法在缓冲区溢出并且没有自动刷新时候会产生IOException,
而response.getWrite()方法的print和println中都是抑制IOException异常的,不会有IOException

out.println(“”); 方法并不能使页面布局换行,只能利用html代码换行,要实现页面布局换行可以:out.println(“”)。

请求转发和重定向的区别:
第一:
  重定向时浏览器上的网址改变;
  请求转发时浏览器上的网址不变;
第二:
  重定向实际上产生了两次请求;
请求转发只有一次请求;

详解:
重定向:
  发送请求 –>服务器运行–>响应请求,返回给浏览器一个新的地址与响应码–>浏览器根据响应码,判定该响应为重定向,自动发送一个新的请求给服务器,请求地址为之前返回的地址–>服务器运行–>响应请求给浏览器。
请求转发:
  发送请求 –>服务器运行–>进行请求的重新设置,例如通过request.setAttribute(name,value)–>根据转发的地址,获取该地址的网页–>响应请求给浏览器。
  
  形象的来说就是去银行办理业务,也许这个窗口并不办理这项业务,请求转发就是柜台人员通知办理人员过来为你办理,而重定向就是柜台人员通知你到另一个窗口去办理,所以,请求转发实际上只执行一次,而重定向则执行了2次。
  

第三:
  重定向时的网址可以是任何网址;
  请求转发的网址必须是本站点的网址;
  
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
请求转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

request.getRequestDispatcher("apage.jsp").forward(request, response);//转发到apage.jsp
response.sendRedirect("apage.jsp");//重定向到apage.jsp

【表单提交的编码问题】
1.post请求:
在获取数据String name = request.getParameter(“name”)之前使用:
request.setCharacterEncoding(“utf-8”);
2.get请求:
在获取数据String name = request.getParameter(“name”)之后使用:
name = new String(name.getByte(“iso-8859-1”),”utf-8”);
3.response.setCharacterEncoding(“utf-8”);这个方法是正对服务器要响应发送客户端的数据的中文编码。
注意:超链接的请求是get请求。

作用域通信对象

页面(page)
对应的隐式对象pageContext

该对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
在这个范围内定义的对象只与当前页面相关

pageContext.setAttribute(“name”,value);
pageContext.getAttribute(“name”);

会话(session)

session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以是复杂的对象类型,而不仅仅局限于字符串类型。

这里写图片描述

Session常用方法:
void setAttribute(name);
Object getAttribute(name);
void removeAttribute(name);//移除指定的会话
void invalidate();

<%
session.setAttribute("result", "密码错误");
response.sendRedirect("login.jsp");//重定向 地址栏url改变
%>
---login.jsp-------
<%
  Object obj = session.getAttribute("result");
  if (obj == null) {

} else {
%>
<%=obj%>
<%
 session.invalidate();//是使session失效
}
%>


[面试题]cookie 和session 的区别:

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用cookie。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
所以个人建议:
将登陆信息等重要信息放在session中, 其他信息如果需要保留,可以放在cookie中。

这里写图片描述

application对象

实现javax.servlet.ServletContext接口

application 对象表示 JSP 页面所属的应用程序,它可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效,它是使用范围最广的上下文状态。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。

application对象最常用的方法:
void setAttribute(String name,Object value)
void getAttribute(String name)

<%
Integer a = (Integer)application.getAttribute("t");
a  =  (a == null) ? new Integer(1):new Integer(a+1);
application.setAttribute("t", a);
out.println(a);
%>
exception对象

是 java.lang.Throwable 类的实例

exception 对象的作用是显示异常信息,只有在包含 isErrorPage=”true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。

<%@ page isErrorPage="true" %>
<html>
    <head>
        <title>隐式对象</title>
    </head>
    <body>
        <h1>隐式对象:异常</h1>
        已检测到以下错误:br>
        <b><%= exception %></b><br>
        <% exception.printStackTrace(out); %>
    </body>
<html>
-------------------------------
<%@ page isErrorPage="true" %>
<html>
    <head><title> 处理错误 </title></head>
    <body>
        <% if ( exception != null ) {
                   out.write(“\n 发生错误。\n");
               }else {
                   out.write(“\n 您已访问此页面,但是没有可用的错误信息\n");
               } 
        %>
    </body>
</html>
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐