006 JSP脚本中的9个内置对象

1。application:JSP所属web应用本身,可用于JSP页面,或者在servlet之间交换信息
2。config:该JSP的配置信息(通常无须配置,更多地在servlet中有效)
3。exception:代表其他页面中的异常和错误,当前页面是错误处理页面时,该对象才可以使用
(编译指令page的isErrorPage为true时)
4。out:JSP页面的输出流,用于输出内容,形成HTML页面
5。page:代表页面本身
6。pageContext:该JSP页面上下文,使用该对象可以访问页面中的共享数据
7。request:封装了一次请求(客户端的请求参数都被封闭在该对象中)获取客户端请求参数必须使用该对象
8。response:服务器对客户端的响应(通常很少使用该对象直接响应,而是用out对象,除非需要生成非字符响应)
9。session:代表一次会话(当客户端浏览器与站点建立连连时,会话开始;当客户端关闭浏览器时,会话结束)

request,response两个对象是_jspService()方法的形参,而page、pageContext、application、config、session、out都是_jspService()方法的局部变量
(可以直接在JSP脚本中调用这些对象,无须创建)
只有异常处理页面对应servlet时都会初始化exception对象

1。application对象(ServletContext的实例)
1.让多个JSP、Servlet共享数据
application通过setAttribute(String attrName,Object value)方法将一个值设置成application 的attrName属性,该属性的值对整个web应用有效,访问属性的方法为getAttrbute(String attrName)
(理解为该应用的每个JSP页面或servlet都可以访问该属性)
每个web应用只有一个servletContext实例,在JSP页面中可以通过application内置对象访问该对象,而servlet中则必须通过代码获取,即:
ServletContext sc = getServletConfig().getServletContext();
sc.getAttribute("attrName");
注:通常只把WEB应用的状态数据放入到application里
2.获得web应用配置参数
即配置参数都在web.xml中给出,使用context-param元素配置,每个context-param元素下有两个子元素param-name(配置参数名)param-value(配置参数值),例:
<context-param>
<param-name>zs</param-name>
<param-value>zhangshan</param-value>
</context-param>
…………
application.getInitParameter("zs")访问

2。config对象(ServletConfig的实例)
config对象代表当前JSP配置信息,但JSP页面通常无须配置,所以JSP页面比较少用该对象。但在servlet中用处较大,因为servlet需要在web.xml文件中进行配置,可以指定配置参数。
servlet配置参数使用init-param元素,该元素可以接受param-name和param-value两个子元素,分别定义参数名和参数值,例:
<servlet>
<servlet-name>jspname</servlet-name>(指定servlet名字)
<jsp-file>/jspname.jsp</jsp-file>(指定将那个JSP页面配置成servlet)
<init-param>
<param-name>age</param-name>
<param-value>30</param-value>
</init-param>
…………
</servlet>
<servlet-mapping>
<servlet-name>jspname</servlet-name>
<url-pattern>/jspname</url-pattern>
</servlet-mapping>
获取配置参数的方法是config.getInitParameter(String paramName)

注:如果希望JSP页面可以获取web.xml配置文件中的配置信息,须通过为该JSP路径来访问该页面,因为只有这样访问JSP页面才会让配置参数起作用
(当访问localhost:8080/jspconfigdemo/jspname时可以看到配置参数
而当访问localhost:8080/jspconfigdemo/jspname.jsp时读取信息为null)

3。exception对象(Throwable的实例)
代表JSP脚本中产生的错误和异常,是JSP页面异常机制的一部分(脚本包含的所有可能出现的异常都可以交给错误处理页面处理)
如果该页面的page指令指定了errorPage属性,则将请求forward到errorPage属性的页面,否则使用系统页面来输出异常信息

4。out对象(JspWriter的实例)
代表一个页面输出流,通常用于在页面上输出变量值及常量(在使用输出表达式的地方,都可以使用out对象来达到同样的效果)
注:所有使用out的地方,都可以使用输出表达式来代替,而且使用输出表达式更加简洁<%=…%>表达式本质就是out.writer()

5。pageContext对象(pageContext的实例)
代表页面上下文,主要用于访问JSP之间的共享数据。使用pageContest可以访问page、request、session、application范围的变量
提供了方法来访问page、request、session、application
getAttribute(String name)取得page范围内的name属性
getAttribute(String name,int scope)取得指定范围内的name属性
scope值: PageContext.PAGE_SCOPE page范围
                  PageContext.REQUEST_SCOPE request范围
   PageContext.SESSION_SCOPE    session范围
   PageContext.APPLICATION_SCOPE    application范围
setAttribute(String name,String value)
setAttribute(String name,String value,int scope)

getAttributesScope("属性名")可获取各属性所在范围
1对应page,2对应request,3对应session,4对应application

还可以获取其他内置对象:
ServletRequest getRequest()获取request对象
ServletResponse getResponse()获取response对象
ServletConfig getServletConfig()获取config对象
ServletContext getServletContext()获取application对象
HttpSession getSession()获取session对象
(一旦在JSP、servlet中获取了pageContext对象,就可以通过它提供的上面方法来获取其他内置对象)

6。request对象(HttpServletRequest对象的实例)
封闭着一次用户请求,并且所有的请求参数都被封闭在request对象中,除此之外,可代表本次请求范围,还可用于request范围的属性
1.获取请求头/请求参数
String getParameter(String paramName)获取paramName请求参数的值
Map getParameterMap()获取所有请求参数名和参数值所组成的Map对象
Enumeration getParameterNames()获取所有请求参数名所组成的Enumeration对象
String[] getParameterValues(String name)name请求参数的值,当该请求参数有多个值时,该方法返回多个值组成的数组

HttpServletRequest提供了如下方法来访问请求头:
String getHeader(String name)指定请求头的值
java.util.Enumeration<String> getHeaderNames()获取所有请求头的值
java.util.Enumeration<String> getHeaders(String name)获取指定请求头的多个值
int getIntHeader(String name)获取指定请求头的值,并将该值转换成整数值

客户端发送请求方式两种:GET、POST
GET直接在浏览器地址输入访问地址发送的请求或提交表单时,该表单对应的from元素method属性为GET(默认为GET)传输的数据量一般不能大于2KB
POST通常使用提单表单,且需要设置form元素的method属性为POST,传输数据量大小取决于服务器的限制,安全性相对较高
例:<form id="form1" method=“post” action="request1.jsp">
注:并不是每个表单域都会生成请求参数,而是有name属性的表单域才会生成请求参数。
(每个有name属性的表单域对应一个请求参数
  如果有多个表单域有相同的name属性,则多个表单域只生成一个请求参数,只是该参数有多个值
表单域的name属性指定请求参数名,value指定请求参数值
如果某个表单域设置了disabled="disabled"属性,则该表单域不再生成请求参数)
例:<%// 获取所有请求头的名称
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
String headerName = headerNames.nextElement();
// 获取每个请求、及其对应的值
out.println(headerName + "-->" + request.getHeader(headerName) + "<br/>");
}
out.println("<hr/>");
// 设置解码方式,对于简体中文,使用GBK解码
request.setCharacterEncoding("GBK");   // ①
// 下面依次获取表单域的值
String name = request.getParameter("name");
// 如果某个请求参数有多个值,将使用该方法获取多个值
String[] color = request.getParameterValues("color");
%>
<!-- 下面依次输出表单域的值 -->
您的名字:<%=name%><hr/>
<!-- 输出复选框获取的数组值 -->
您喜欢的颜色:<%for(String c : color)

GET方式发送请求URL和参数之间以”?“做分隔,而多个参数之间以”&“分隔
GET方式包含了中文字符,则获取这些参数比较复杂:
// 获取请求里包含的查询字符串
String rawQueryStr = request.getQueryString();
out.println("原始查询字符串为:" + rawQueryStr + "<hr/>");
// 使用URLDecoder解码字符串
String queryStr = java.net.URLDecoder.decode(rawQueryStr , "UTF-8");
out.println("解码后的查询字符串为:" + queryStr + "<hr/>");
// 以&符号分解查询字符串
String[] paramPairs = queryStr.split("&");
for(String paramPair : paramPairs){
out.println("每个请求参数名、值对为:" + paramPair + "<br/>");
// 以=来分解请求参数名和值
String[] nameValue = paramPair.split("=");
out.println(nameValue[0] + "参数的值是:" +
nameValue[1]+ "<hr/>");
}
或:
//获取原始的请求参数
String rawName = request.getParameter("name");
//将请求参数值使用ISO-8859-1字符分解成字节数组
byte[] rawBytes= rawName.getBytes("ISO-8859-1");
//将字节数组重新解码成字符串
String name = new String(rawBytes, "UTF-8");

2.操作request范围的属性
HttpServletRequest还包含了两个方法,用于设置request范围的属性
setAttribute(String attName,Object attValue)将attValue设置成request范围的属性
Object getAttribute(String attName)获取request范围的属性

3.执行forward或include(forward不会丢失request属性和请求参数)
代替JSP所提供的forward或include动作指令
getRequestDispatcher("/a.jsp").include(request,response);
getRequestDispatcher("/a.jsp").forward(request,response);
作用该方法时,字符串必须以斜线开头

7。response对象(HttpServletResponse接口的实例)
1.生成非字符响应
getOutputStream()方法,该方法返回响应输出字节流
例:// 将图像输出到页面的响应
ImageIO.write(image , "png" , response.getOutputStream());
2.重定向(会丢失所有request属性和请求参数,因为重定向将生成二次请求)
sendRedirect(String path)方法,用于重写向到path资源,即重新向path资源发送请求
例:// 重定向到redirect-result.jsp页面
response.sendRedirect("redirect-result.jsp");
注:与在地址栏里重新输入新地址再按回车键的效果完全一样,即发送了第二次请求
3。增加cookie
用于网站记录客户的某些信息
(cookie和session的不同之处:session会随着浏览器的关闭而失效,而cookie会一直存放在客户端的机器上,除非超出cookie的生命期限)

void addCookie(Cookie cookie):增加cookie
步骤:1创建cookie实例2设置cookie的生命期限3向客户端写入cookie
// 获取请求参数
String name = request.getParameter("name");
// 以获取到的请求参数为值,创建一个Cookie对象
Cookie c = new Cookie("username" , name);
// 设置Cookie对象的生存期限
c.setMaxAge(24 * 3600);
// 向客户端增加Cookie对象
response.addCookie(c);

访问客户端cookie使用request对象
// 获取本站在客户端上保留的所有Cookie
Cookie[] cookies = request.getCookies();
// 遍历客户端上的每个Cookie
for (Cookie c : cookies)
{
// 如果Cookie的名为username,表明该Cookie是需要访问的Cookie
if(c.getName().equals("username"))
{
out.println(c.getValue());
}
}

注:使用cookie必须设置其生存限期,否则cookie将会随浏览器的关闭而自动消失

8。session对象(HttpSession的实例)
代表一次用户会话(客户端连接服务器开始,客户端与服务器断开结束)
setAttribute(String attName,String attValue)
getAttribute(String attName)

注:通常只把与用户会话状态相关的信息放入session范围内
两个页面进行交换信息,可以将该信息放入session范围内,然后forward请求即可

session的属性值可以是任何可序列化的java对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值