Java EE基础知识学习(四)

当我们在查看一个JSP页面所对应生成的Servlet代码时,我们会发现它为我们定义了一些常用的对象来供我们使用,在这一节中,我们将要介绍这些变量的用法。

一、JSP脚本中的九个内置对象
打开任意的Servlet代码,我们可以在这个代码的_jspService方法中找到以下代码:

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;

上面就是JSP脚本中内置的一部分对象,这些对象会由JSP规范对他们进行默认的初始化,我们可以在代码中直接使用这些对象,而不用单独的再去声明。这里我们主要介绍以下九个JSP内置对象:

application: javax.servlet.ServletContext的实例。这个实例代表JSP所属的Web应用本身,可以用于JSP页面或者在Servlet之间交换信息。
config: javax.servlet.ServletConfig的实例,该实例代表该JSP的配置信息。
exception: java.lang.Throwable的实例,该实例代表了其他页面中的异常和错误。
out: javax.servlet.jsp.JspWriter的实例,该实例代表JSP页面的输出流,用于输出内容并且形成HTML页面。
page: 代表该页面本身,想到与Servlet中的this。
pageContext: javax.servlet.jsp.PageContext的实例,该对象代表这个JSP页面的上下文,使用它可以访问页面中的共享数据。
request: javax.servlet.http.HttpServletRequest的实例,该对象封装了一次请求,客户端的请求数据都封装在这个对象中。
response: javax.servlet.http.HttpServletResonse的实例,代表了服务器对客户端的响应。
session: javax.servlet.http.HttpSession的实例,该对象代表了一次会话。

接下来我们将介绍这些对象的简单用法。

1、application
application主要有以下两个方法:
setAttribute(String attrName,Object value);
getAttribute(String attrName);
这两个方法可以帮助我们将一个参数存入到application中,并且可以在整个Web应用中都获取这个参数的值。
示例:
a.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
application.setAttribute("year", 2017);
%>
</body>
</html>

b.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%=application.getAttribute("year")%>
</body>
</html>

在上面的例子中,我们在a.jsp中将一个参数”year=2017”存入到了application中,并且在b.jsp中使用getAttribute方法获取这个参数的值并输出。

application还可以帮助我们获取web.xml文件中的一些参数配置,具体我们可以使用application.getInitParameter()方法来获取。

2、config
config可以帮助我们获取JSP的配置信息,具体可以使用config.getInitParameter(String paramName)方法,该方法会返回我们所需要的配置信息。
示例:
a.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%=config.getInitParameter("year") %>
</body>
</html>

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instancehttp://www.springmodules.org/schema/cache/springmodules-cache.xsd http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="WebApp_ID" version="3.1">
    <display-name>WebTest</display-name>
    <servlet>
        <servlet-name>config</servlet-name>
        <jsp-file>a.jsp</jsp-file>
        <init-param>
            <param-name>year</param-name>
            <param-value>2017</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>config</servlet-name>
        <url-pattern>/config</url-pattern>
    </servlet-mapping>
</web-app>

这样我们在web.xml中配置了一个参数”year=2017”,并且在a.jsp中获取并输出了这个参数。

3、exception

exception对象是Throwable的实例,它代表了JSP脚本中产生的错误和异常。例如在下面的代码中我们将b.jsp设置为a.jsp页面的错误处理页面,当a.jsp页面出现异常,我们将在b.jsp中捕获并输出这个异常。

示例:
a.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ page errorPage="b.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
int a=3;
int b=0;
int c=a/b;
%>
</body>
</html>

b.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ page isErrorPage="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
异常类型为:<%=exception.getClass() %><br/>
异常信息是:<%=exception.getMessage() %><br/>
</body>
</html>

当我们运行a.jsp的时候a中发生异常会跳转到错误处理页面b.jsp中,并且在b中会输出a中异常的类型和信息。

4、out

out对象是一个页面的输出流,它和输出表达式的功能是一样的,所以我们在使用输出表达式的地方都可以使用out来替换。

示例:
a.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
out.println("Hello World");
%>
<%-- 等价于下面 --%>
<%="Hello World" %>
</body>
</html>

5、pageContext

pageContext对象代表页面的上下文,可以用于访问JSP中间的共享数据,使用pageContext对象可以访问page、request、session和application范围内的对象。

我们可以使用pageContext.setAttribute(String attrName,Object Value,int scope)方法来将指定的变量放入到scope范围内。也可以使用pageContext.getAttribute(String attrName,int scope)来获取scope范围内的变量。其中scope有四个值分别是:
PageContext.PAGE_SCOPE:对应page范围。数值为1。
PageContext.REQUEST_SCOPE:对应request范围。数值为2。
PageContext.SESSION_SCOPE:对应session范围。数值为3。
PageContext.APPLICATION_SCOPE:对应application范围。数值为4。
同时我们可以使用pageContext.getAttributeScope(String attrName)方法来获取变量的范围,该方法返回int类型。

示例:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
pageContext.setAttribute("year", 2017, pageContext.PAGE_SCOPE);
out.println("变量year的值为"+pageContext.getAttribute("year", pageContext.PAGE_SCOPE));
out.println("变量的范围为"+pageContext.getAttributesScope("year"));
%>

</body>
</html>

运行上面的代码,浏览器会显示两行内容,第一行是year的值“2017”,第二行是year的范围“1”。

6、request

request对象封装着用户的一次请求,并且请求的所有参数都封装在request对象中。
request主要有以下几个方法:
String getParameter(String paramName):获取paramName请求参数的值。
Map getParameterMap():获取所有请求参数名和请求参数值组成的Map对象。
Enumeration getParameterNames():获取所有请求参数名所组成的Enumeration对象。
String[] getParameterValues(String name):返回paramName请求的的参数值,若为多个值,则返回数组。
String getHeader(String name):获取指定请求头的值。
java.util.Enumeration getHeaderNames():获取所有请求头的名称。
java.util.Enumeration getHeaders(String name):获取指定请求头的多个值。
int getIntHeader(String name):获取指定请求头的值,并转为整数。

无论客户端使用Post还是GET方法传递过来的参数都使用上面的方法来进行处理。

示例:
a.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
form id="form1" action="b.jsp" method="post">
用户名:<input type="text" name="username">
密码:<input type="text" name="password">
<input type="submit" value="登录">
</form>
</body>
</html>

b.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
String username=request.getParameter("username");
String password=request.getParameter("password");
%>

</form>
</body>
</html>

上面的代码中,我们在a.jsp中设置了一个表单让用户填写用户名和密码,然后点击登录按钮就会进入到b.jsp中,在b.jsp中我们用两个字符串分别存储用户的用户名和密码。如果获取的是中文字符,我们还要对字符进行一定的编码。

7、response

response代表服务器对客户端的响应,大部分的响应我们都可以通过使用out输出流来输出,但是有些特殊的非字符内容我们无法通过out来输出,这时我们就需要使用response来输出。

例如传输一张图片我们可以使用以下代码:

ImageIO.Write(BufferedImage image,String imageType,response.getOutputStream());

同时我们也可以使用response来重定向,代码如下:

response.sendRedirect("*.jsp");

或者我们可以为一个客户端增加Cookie,代码如下:

String name=request.getParameter("name");
Cookie c=new Cookie("username",name);
c.setMaxAge(24*3600);//设置Cookie的生存周期
response.addCookie(c);

服务器端可以用以下代码获取Cookie:

Cookie[] cookie=request.getCookies();
for(Cookie c:cookies)
{
    if(c.getName().equals("username")
        out.println(c.getValue());
}

8、session

session对象代表了一次会话,它为我们提供了如下两个常用的方法:
setAttribute(String attrName,Object value):设置session范围内attName属性的值。
getAttribute(String attrName):获取session范围内attName属性的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值