简介
- JSP脚一包含9个内置对象,即JSP脚本规范对它们进行了初始化,可以直接使用。
- JSP内置对象的实质:request与response是对应Servlet的_jspService()方法的形参,其它则是该方法的局部变量。
1.application
- application对象是ServletContext的实例。
- 在Servlet中没有application对象,可通过如下代码获取
ServletContext application = getServletConfig().getServletContext();
- application可用于在JSP脚本中获取web.xml中使用
<context-param>
配置的参数。如:
<% String user = application.getInitParameter("user");%>
这也能说明<context-param>
配置的参数对整个web应用有效。对应web.xml部分代码:
<context-param>
<param-name>user</param-name>
<param-value>zhangchunling</param-value>
</context-param>
4. Jsp与Servlet之间如何交换数据?
Web服务器提供了4个类似Map结构的容器:application、session、request、page
2. config
- config对象是ServletConfig的实例,用得较少。
- 配置JSP也是在web.xml中配置的(比如为Jsp页面设置另一个URL)。config对象可在JSP脚本中获取web.xml中使用
<init-param>
配置的对数。
web.xml中对应的配置JSP的代码:
<servlet>
<servlet-name>config</servlet-name>
<jsp-file>/configTest.jsp</jsp-file>
<init-param>
<param-name>keyName</param-name>
<param-value>keyValue</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>config</servlet-name>
<url-pattern>/config</url-pattern>
<!-- config是可访问configTest.jsp的另一路径-->
</servlet-mapping>
对应JSP脚本代码:
<%=config.getInitParameter("keyName")%>
//以上结果是:keyValue
- 注意:
如果JSP页面希望获取web.xml中的配置信息,则必须通过为该JSP配置的路径(/config)来访问该JSP,因为只有这亲,jsp页面才会让配置对数起作用。
如:localhost:8080…/config的访问结果是:keyValue,
而localhost:8080…/configTest.jsp访问的结果是:null。
3. exception
- exception对象是Throwable的实例。
- exception对象仅在异常处理页面有效,它常用的两个方法:getMessage()和printStackTrace();
- Jsp页面生成的Servlet类里的catch部分由异常处理页面生成负责,catch块里的异常对象就是exception对象。
- JSP的异常处理机制对JSP声明不起作用,依然需要处理checked异常。
- 当jsp页面page指令的isErrorPage属性为true时,该jsp页面就是异常处理页面,所以该页面也就会提供exception对象。
4.out
- out对象是JspWriter的实例
- out对象代表一个页面输出流,输出内容到HTML页面。如
out.println("<h1>h1号的字体</h1>");
的结果是:<h1>h1号的字体</h1>
- 输出表达式<%=…%>可替代out,因为输出表达式的底层就是out.write(“…”);
5.pageContext
- pageContext对象是PageContext的实例。可访问application、session、request、page的变量。
- 添加值的两个方法:
setAttribute(String name);
setAttribute(String name,int scope); //取指定范围内的name属性的值。scope代表4个范围:
pageContext.APPLICATION_SCOPE,值为4
pageContext.SESSION_SCOPE,值为3
pageContext.REQUEST_SCOPE,值为2
pageContext.PAGE_SCOPE,值为1 - 两个对应的取值的方法:
getAttribute(String name);
getAttribute(String name,int Scope); //取指定范围的name属性的值 - pageContext对象可获取的其他内置对象:
对象名 | 对象类型 | 获取方法 |
---|---|---|
request | ServletRequest | getRequest() |
response | ServletResponse | getResponse() |
config | ServletConfig | getServletConfig() |
application | ServletContext | getServletContext() |
session | HttpSession | getSession() |
6. request
- request对象是HttpServletReques的实例,每个request对象都封装着一次用户的请求,且所有请求参数都封装在其中。
- 服务器通过JSP或Servlet解析请求头或请求参数,而JSP或Servlet获取请求参数或请求头的途径就是request。我们有时会获取请求头的内容,所以request很重要。
- 不是每个form表单都会生成请求参数,而是有name属性的表单才会生成。表单和请求参数的关系注意如下几点:
- 一个name属性对应一个请求参数。
- 如果有多个name属性同名,则请求参数将以逗号拼接成串生成一个请求参数。
- 如果某个name表单域里设置了disabled=”disabled”,则该表单域不再生成请求参数。
- request执行forward或include
- 使用:getRequestDispatcher(String path)方法返回的RequestDispatcher实例对象后调用forward()或include()方法实现,path以斜线开头。
- 将a.jsp页面include到本页面:
getRequestDispatcher(“a.jsp”).include(request,response); - 转发请求到b.jsp页面:
getRequestDispatcher(“b.jsp”).forward(request,response);
- POST请求与GET请求
- GET方式请求:直接在地址栏里输入访问地址的请求,以及提交form表单默认的请求(或是设form元素的method为get)都是GET请求。GET方式请求在地址栏里能看到请求参数名和值(不好),且该方式传送数据量小,一般不大小2KB。
- POST方式请求:要提交的表单的form元素的method属性设为post的请求。该种方式请求传输的数据量比GET方式大,取决于服务器的限制。POST请求要发送的请求参数和对应的值都放在HTML HEADER中传输,地址栏里看不到,相对安全。
- GET方式请求处理中文参数乱码:
将得到的内容用URLDecoder类的decode()方法,
即:String dstr = URLDecoder.decode(request.getParameter(“userName”), “UTF-8”); - POST方式请求处理中文参数乱码:
需要在获取请求参数之前调用setCharacterEncoding()方法设置编码的字符集,
即:request.setCharacterEncoding(“GBK”);
String name = request.getParameter(“userName”); - 可在获取请求参数值后对乱码的参数值重新编码得到正确的值。方法是将值转换成字节数组,然后重新解码成字符串:
String name = request.getParameter(“userName”);
byte[] b = name.getBytes(“ISO-8859-1”);
String rightName = new String(b,”UTF-8”);
- 获取cookie
request.getCookies()方法能获取请求里的所有cookie组成的数组。通过判断cookie的名字判断是哪个cookie。
7.response
- response是HttpServletResponse的实例,代表服务器端对客户端的响应。
- response有响应、重定向、向客户端添加cookie等作用。
- 一般使用out对象生成简单的响应,但out对象是Writer类的子类,而Writer是字符流,无法输出字节流。所以如果是图片(或是PDF文档,Excel)这类字节流还是得需要response作为响应输出。
- 重定向:response.sendRedirect(“c.jsp”);
与forward不同的是,因为重定向将生成第二次请求,所以会丢失第一次请求的所有请求参数和request范围的属性。 - 添加cookie
//创建Cookie对象
Cookie c = new Cookie("username","zhangchunling");
//设置Cookie对象的生命周期:1天,如果设置生命周期,则Cookie会随浏览器关闭而消失
c.setMaxAge(24*60*60);
//向客户端添加Cookie对象
response.addCookie(c);
Cookie值默认不允许出现中文字符,如果有中文字符,则需要编码:
Cookie c = new Cookie("username",java.net.URLEncoder.encode("张春玲","GBK"));
c.setMaxAge(24*3600);
response.addCookie(c);
在得到cookie后,又用java.netURLDecoder解码cookie值即可。
8. session
- session对象是HttpSession的实例,代表一次用户会话
一次用户会话:浏览器连接服务开始到与服务器断开的过程。所以浏览器关闭,session就消失。 - session常用于跟踪用户的会话信息,如判断是否登录或是购物车购买的商品等。其他信息一般不会放在session里。
- session机制通常用于保存客户端的状态信息,这些状态信息需要被保存到Web服务器的硬盘上,所以要求session里的属性值必须是可序列化的,否则会有不可序列化的异常。session里的属性值可以是任何可序列化的Java对象。
- 每个session都有一个ID,当服务器与客户建立会话后,session就会在内存中保存一个jsessionId,然后放在响应的header里给客户端保存,客户端继续访问时,会将jsessionId封装进request当中,这样服务器就能判断是新的会话还是已建立的会话。
所以,只要每次请求把服务器生成的jsessionId带过去,服务器端就会认为是同一个会话。
9. page
page对象代表页面本身(即Servlet中的this),没多大用处,它的类型就是生成的Servlet类,能用page的地方就能用this。