jsp内置对象

jsp内置对象

1、jsp提供了9个内置对象,这些对象将由容器为用户进行实例化,用户能够直接使用,java须要new对象,这里直接使用就行。

对象 描述
request HttpServletRequest 接口的实例
response HttpServletResponse 接口的实例
out JspWriter类的实例,用于把结果输出至网页上
session HttpSession类的实例
application ServletContext类的实例,与应用上下文有关
config ServletConfig类的实例
pageContext PageContext类的实例,提供对JSP页面全部对象以及命名空间的访问
page 相似于Java类中的this关键字
Exception Exception类的对象,表明发生错误的JSP页面中对应的异常对象

2、4种做用域

在jsp中提供了4种属性的保存范围,所谓的保存范围,指的就是一个内置对象,能够在多少个页面中保存而且继续使用。
做用域 功能
pageContext 做用域仅限于当前页面对象,能够近似于理解为java的this对象,离开当前JSP页面(不管是redirect仍是forward),则pageContext中的全部属性值就会丢失。
request 做用域是同一个请求以内,在页面跳转时,若是经过forward方式跳转,则forward目标页面仍然能够拿到request中的属性值。若是经过redirect方式进行页面跳转,因为redirect至关于从新发出的请求,此种场景下,request中的属性值会丢失。(适用于请求转发,在重定向中会失去被赋予的值)
session session的做用域是在一个会话的生命周期内,会话失效,则session中的数据也随之丢失。
application 做用域是最大的,只要服务器不中止,则application对象就一直存在,而且为全部会话所共享。(定义的对象被存储在服务器,因此少使用该对象,否则会增长服务器负载,影响服务器性能)
使用setAttribute("id","value",[服务器跳转后该id的做用域]);来设置属性以及做用域。
  1. 设置属性
<%--
  Created by IntelliJ IDEA.
  User: YOONA
  Date: 2019/10/21/021
  Time: 17:23
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>setAttribute</title>
</head>
<body>
<%
pageContext.setAttribute("name","taeyeon",PageContext.REQUEST_SCOPE);//只有pageContext才有第三个参数,session,application,request都没有第三个参数.
    
%>
<jsp:forward page="getAttribute.jsp"/>

</body>
</html>
  1. 获取属性
<%--
  Created by IntelliJ IDEA.
  User: YOONA
  Date: 2019/10/21/021
  Time: 17:27
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>getAttribute</title>
</head>
<body>
<%
String s= (String) request.getAttribute("name");
out.println(s);
%>
<%=s%>
</body>
</html>
  1. 输出
taeyeon  taeyeon

当没有设置pageContext.setAttribute()中没有添加这一参数==PageContext.REQUEST_SCOPE==。就会输出null null。由于page域中设置的参数只能在本页面有做用,因此当页面跳转后就获取不到name的属性值。html


3、request对象

当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,由于这些信息是做为HTTP信息头的一部分来传送的。您能够查阅HTTP协议来得到更多的信息。
下表列出了浏览器端信息头的一些重要内容,在之后的网络编程中将会常常见到这些信息:
信息 描述
Accept 指定浏览器或其余客户端能够处理的MIME类型。它的值一般为 image/png 或 image/jpeg
Accept-Charset 指定浏览器要使用的字符集。好比 ISO-8859-1
Accept-Encoding 指定编码类型。它的值一般为 gzip 或compress
Accept-Language 指定客户端首选语言,servlet会优先返回以当前语言构成的结果集,若是servlet支持这种语言的话。好比 en,en-us,ru等等
Authorization 在访问受密码保护的网页时识别不一样的用户
Connection 代表客户端是否能够处理HTTP持久链接。持久链接容许客户端或浏览器在一个请求中获取多个文件。Keep-Alive 表示启用持久链接
Content-Length 仅适用于POST请求,表示 POST 数据的字节数
Cookie 返回先前发送给浏览器的cookies至服务器
Host 指出原始URL中的主机名和端口号
If-Modified-Since 代表只有当网页在指定的日期被修改后客户端才须要这个网页。 服务器发送304码给客户端,表示没有更新的资源
If-Unmodified-Since 与If-Modified-Since相反, 只有文档在指定日期后仍未被修改过,操做才会成功
Referer 标志着所引用页面的URL。好比,若是你在页面1,而后点了个连接至页面2,那么页面1的URL就会包含在浏览器请求页面2的信息头中
User-Agent 用来区分不一样浏览器或客户端发送的请求,并对不一样类型的浏览器返回不一样的内容
request对象的经常使用方法:
方法 做用
Cookie[] getCookies(); 取得客户端传递的Cookie信息
String getHeader(String str); 取得请求头信息,根据请求头名称取得对应的值
Enumeration<String> getHeaderNames(); 按照枚举的方式取得全部请求头信息
String getMethod(); 取得请求的方式
String getPathInfo(); 取得额外路径
String getContextPath(); 去的当前项目的根路径
String getQueryString(); 取得URL地址?后面的参数
String getRequestURI(); 取得URL地址
String getServletPath(); 取得Servlet的映射路径
HTTPSession getSession(); 取得Session内置对象
String getRealPath(); 取得项目的真实路径
String getRemoteHost(); 取得主机名称
String getParameter(String name); 取得表单提交的参数,适用于每次接收一个参数,会出现空指针异常
String getParameterValues(String name); 取得表单提交的参数,适用于接收多个参数,好比复选框的值。会出现空指针异常
void setAttribute(String key,Object value); 以键值对形式保存数据
void getAttribute(String key); 获取保存的数据属性值
void getRequestDispatcher(String loc).forward(HttpServletRequest req, HttpServletResponse resp); 服务器跳转
1.解决乱码问题

除了前面介绍的两种解决乱码问题,咱们也能使用request对象来解决乱码问题,使用request。setCharacterEncoding("编码格式");来设置全局的编码格式。java

2.接收请求数据

全部参数不必定都要用表单的形式来传递,也可使用url重写的方式进行传递,格式以下: 动态页面地址?参数名称 1=参数内容 1&参数名称 2=参数内容 2&....mysql

在这个例子中,咱们会使用HttpServletRequest类的getHeaderNames()方法来读取HTTP信息头。这个方法以枚举的形式返回当前HTTP请求的头信息。
获取Enumeration对象后,用标准的方式来遍历Enumeration对象,用hasMoreElements()方法来肯定何时中止,用nextElement()方法来得到每一个参数的名字。
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>requestTest(runoob.com)</title>
</head>
<body>
<h2>HTTP 头部请求实例</h2>
<table width="100%" border="1" align="center">
<tr bgcolor="#949494">
<th>Header Name</th><th>Header Value(s)</th>
</tr>
<%
   Enumeration headerNames = request.getHeaderNames();
   while(headerNames.hasMoreElements()) {
      String paramName = (String)headerNames.nextElement();
      out.print("<tr><td>" + paramName + "</td>\n");
      String paramValue = request.getHeader(paramName);
      out.println("<td> " + paramValue + "</td></tr>\n");
   }
%>
</table>
</body>
</html>
输出


4、response对象

Response响应对象主要将JSP容器处理后的结果传回到客户端。能够经过response变量设置HTTP的状态和向客户端发送数据,如Cookie、HTTP文件头信息等。
一个典型的响应看起来就像下面这样:
HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
  (空行)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>
状态行包含HTTP版本信息,好比HTTP/1.1,一个状态码,好比200,还有一个很是短的信息对应着状态码,好比OK。
下表摘要出了HTTP1.1响应头中最有用的部分,在网络编程中您将会常常见到它们:
响应头 描述
Allow 指定服务器支持的request方法(GET,POST等等)
Cache-Control 指定响应文档可以被安全缓存的状况。一般取值为 public,private 或no-cache 等等。 Public意味着文档可缓存,Private意味着文档只为单用户服务而且只能使用私有缓存。No-cache 意味着文档不被缓存。
Connection 命令浏览器是否要使用持久的HTTP链接。close值 命令浏览器不使用持久HTTP链接,而keep-alive 意味着使用持久化链接。
Content-Disposition 让浏览器要求用户将响应以给定的名称存储在磁盘中
Content-Encoding 指定传输时页面的编码规则
Content-Language 表述文档所使用的语言,好比en, en-us,,ru等等
Content-Length 代表响应的字节数。只有在浏览器使用持久化 (keep-alive) HTTP 链接时才有用
Content-Type 代表文档使用的MIME类型
Expires 指明啥时候过时并从缓存中移除
Last-Modified 指明文档最后修改时间。客户端能够 缓存文档而且在后续的请求中提供一个 If-Modified-Since请求头
Location 在300秒内,包含全部的有一个状态码的响应地址,浏览器会自动重连而后检索新文档
Refresh 指明浏览器每隔多久请求更新一次页面。
Retry-After 与503 (Service Unavailable)一块儿使用来告诉用户多久后请求将会获得响应
Set-Cookie 指明当前页面对应的cookie
response 对象是 javax.servlet.http.HttpServletResponse 类的一个实例。就像服务器会建立request对象同样,它也会建立一个客户端响应。
response对象定义了处理建立HTTP信息头的接口。经过使用这个对象,开发者们能够添加新的cookie或时间戳,还有HTTP状态码等等。
下表列出了用来设置HTTP响应头的方法,这些方法由HttpServletResponse 类提供:
S.N. 方法 描述
1 String encodeRedirectURL(String url) 对sendRedirect()方法使用的URL进行编码
2 String encodeURL(String url) 将URL编码,回传包含Session ID的URL
3 boolean containsHeader(String name) 返回指定的响应头是否存在
4 boolean isCommitted() 返回响应是否已经提交到客户端
5 void addCookie(Cookie cookie) 添加指定的cookie至响应中
6 void addDateHeader(String name, long date) 添加指定名称的响应头和日期值
7 void addHeader(String name, String value) 添加指定名称的响应头和值
8 void addIntHeader(String name, int value) 添加指定名称的响应头和int值
9 void flushBuffer() 将任何缓存中的内容写入客户端
10 void reset() 清除任何缓存中的任何数据,包括状态码和各类响应头
11 void resetBuffer() 清除基本的缓存数据,不包括响应头和状态码
12 void sendError(int sc) 使用指定的状态码向客户端发送一个出错响应,而后清除缓存
13 void sendError(int sc, String msg) 使用指定的状态码和消息向客户端发送一个出错响应
14 void sendRedirect(String location) 使用指定的URL向客户端发送一个临时的间接响应,重定向
15 void setBufferSize(int size) 设置响应体的缓存区大小
16 void setCharacterEncoding(String charset) 指定响应的编码集(MIME字符集),例如UTF-8
17 void setContentLength(int len) 指定HTTP servlets中响应的内容的长度,此方法用来设置 HTTP Content-Length 信息头
18 void setContentType(String type) 设置响应的内容的类型,若是响应还未被提交的话
19 void setDateHeader(String name, long date) 使用指定名称和值设置响应头的名称和内容
20 void setHeader(String name, String value) 使用指定名称和值设置响应头的名称和内容
21 void setIntHeader(String name, int value) 指定 int 类型的值到 name 标头
22 void setLocale(Locale loc) 设置响应的语言环境,若是响应还没有被提交的话
23 void setStatus(int sc) 设置响应的状态码
接下来的例子使用setIntHeader()方法和setRefreshHeader()方法来模拟一个数字时钟:
<%@ page import="java.util.Calendar" %>
<%@ page import="java.util.Locale" %>
<%@ page import="com.mysql.jdbc.util.TimezoneDump" %>
<%@ page import="java.util.TimeZone" %><%--
  Created by IntelliJ IDEA.
  User: YOONA
  Date: 2019/10/22/022
  Time: 14:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>response对象的示例Refresh</title>
</head>
<body>
<h2>自动刷新,response</h2>
<%
    response.setIntHeader("Refresh",2);
    Calendar calendar=Calendar.getInstance(TimeZone.getDefault());
   int hour=calendar.get(Calendar.HOUR);
   int min=calendar.get(Calendar.MINUTE);
   int s=calendar.get(Calendar.SECOND);
   String am_pm="";
   if(calendar.get(Calendar.AM_PM)==0)//AM==0;PM==1
       am_pm="AM";
else
       am_pm="PM";
String time=hour+":"+min+":"+s+am_pm;
%>
<h2><%=time%></h2>
</body>
</html>
将以上代码保存为main.jsp,而后经过浏览器访问它。它将会每隔5秒显示一下系统当前时间。
输出

浏览器技术Cookie

Cookie一般在HTTP信息头中设置(虽然JavaScript可以直接在浏览器中设置cookie)好比:Set-Cookie: name=runoob; expires=Friday, 04-Feb-17 22:03:38 GMT; path=/; domain=runoob.com(Set-Cookie 信息头包含一个键值对,一个 GMT(格林尼治标准)时间,一个路径,一个域名。键值对会被编码为URL。有效期域是个指令,告诉浏览器在何时以后就能够清除这个 cookie。)的形式体现;cookie是浏览器所提供的一种技术,一些信息存储在客户端,使用时能够不用经过网络传输,而获取信息,提升网页的处理效率,减小服务器的负载。可是因为存储在客户端,因此安全性不好。
全部的cookie是由服务器端设置到客户端的,因此要使用response对象来增长cookie对象。response.addCookie(Cookie cooke)
大多数直接增长的cookie并非存储在客户端的,而是存储在浏览器,因此当关闭浏览器后再打开就会发现cookie中的信息为空。因此咱们要设置cookie的保存时间,来作到真正的保存在客户端。当咱们设置为可存储的cookie时,咱们再次向服务器发送请求时,会将以前服务器返回的cookie再次发送给服务器。
cookie经常使用的方法
序号 方法 描述
1 public void setDomain(String pattern) 设置 cookie 的域名,好比 runoob.com
2 public String getDomain() 获取 cookie 的域名,好比 runoob.com
3 public void setMaxAge(int expiry) 设置 cookie 有效期,以秒为单位,默认有效期为当前session的存活时间
4 public int getMaxAge() 获取 cookie 有效期,以秒为单位,默认为-1 ,代表cookie会活到浏览器关闭为止
5 public String getName() 返回 cookie 的名称,名称建立后将不能被修改
6 public void setValue(String newValue) 设置 cookie 的值
7 public String getValue() 获取cookie的值
8 public void setPath(String uri) 设置 cookie 的路径,默认为当前页面目录下的全部 URL,还有此目录下的全部子目录
9 public String getPath() 获取 cookie 的路径
10 public void setSecure(boolean flag) 指明 cookie 是否要加密传输
11 public void setComment(String purpose) 设置注释描述 cookie 的目的。当浏览器将 cookie 展示给用户时,注释将会变得很是有用
12 public String getComment() 返回描述 cookie 目的的注释,若没有则返回 null
使用jsp设置Cookie
  1. 建立一个 cookie 对象: 调用 cookie 的构造函数,使用一个 cookie 名称和值作参数,它们都是字符串。
  2. 设置有效期:调用 setMaxAge() 函数代表 cookie 在多长时间(以秒为单位)内有效。下面的操做将有效期设为了 24 小时。
  3. 将 cookie 发送至 HTTP 响应头中:调用 response.addCookie() 函数来向 HTTP 响应头中添加 cookie。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>建立cookie</title>
</head>
<body>
<%
Cookie cookie1=new Cookie("name","teayeon");//建立cookie对象
Cookie cookie2=new Cookie("age","18");
cookie1.setMaxAge(60*60*24);//设置最大生存时间
cookie2.setMaxAge(60*60*24);
response.addCookie(cookie1);//添加到相应的报文头中
response.addCookie(cookie2);
%>
<h2><a href="getCookie.jsp">点我</a>跳转到获取Cookie信息</h2>
</body>
</html>
获取cookie的值
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>获取cookie的值</title>
</head>
<body>
<%!
    String name;
    String value;
%>
<%
Cookie cookies[]=request.getCookies();
for(int x=0;x<cookies.length;x++){
    name=cookies[x].getName();
    value=cookies[x].getValue();

%>
     <h2><%=name%>---><%=value%></h2>
<%
    }
%>
</body>
</html>
输出
name--->teayeon
age--->18
JSESSIONID--->5C600F1372097AE7A09ED74D1274FAC5
当某个界面设置了增长Cookie的代码后,在浏览器上运行了该页面,服务器就会返回这个Cookie信息,保存在客户端。能够看见这里我没有设置JSESSIONID的键值对,可是服务器也给返回了。这个JSESSIONID是系统自动生成的。在每个客端访问服务器时,服务器为了明确区分每个客户端,都会自动设置一个JSESSIONID的cookie,表示用户的惟一身份标识。
可使用设置报文头的方式为客户端加入Cookie。
<%
response.setHeader("Set-Cookie","name=teayeon");
%>
使用jsp删除cookie
  • 可使用cookie1.setMaxAge(xx);设置最大生存时间.这里的xx能够设置为0,cookie是你前面建立的cookie对象;
  • 也能够在浏览器中手动删除cookie。

注意:通常一个客户端最多保存300多个cookie,当数据量太大时将没法使用cookie。web


5、session

Http是无状态协议,这意味着每次客户端检索网页时,都要单独打开一个服务器连接,所以服务器不会记录下先前客户端请求的任何信息。有三种方式解决这种问题:
  • Cookies:服务器能够指定一个惟一的session ID做为cookie来表明每一个客户端,用来识别这个客户端接下来的请求。
  • 重写URL:你能够在每一个url后面添加一些额外的数据来区分会话,服务器可以根据这些数据来关联session标识符,就算浏览器不支持cookies也能工做,可是必须为每个url动态指定一个session ID,就算是静态的html页面。
  • session对象:JSP利用servlet提供的HttpSession接口来识别一个用户保存在服务器端,存储这个用户的所访问信息。默认状况下,jsp容许会话跟踪,一个新的HttpSession对象将会自动得为新的客户端实例化,禁止会话跟踪须要显式的关掉它,经过page指令中的session属性:
<%@page session="false" %>
  • 隐藏表单域 一个网络服务器能够发送一个隐藏的HTML表单域和一个惟一的session ID,就像下面这样: <input type="hidden" name="sessionid" value="12345"> 这个条目意味着,当表单被提交时,指定的名称和值将会自动包含在GET或POST数据中。每当浏览器发送一个请求,session_id的值就能够用来保存不一样浏览器的轨迹。 这种方式多是一种有效的方式,但点击<AHREF>标签中的超连接时不会产生表单提交事件,所以隐藏表单域也不支持通用会话跟踪。因此说只有三种方式支持会话

提问:session是否能够在服务器从新启动后继续使用?sql

回答:能够经过序列化的方式保存session对象。apache

下表列出session对象的一些经常使用方法:
S.N. 方法 描述
1 public Object getAttribute(String name) 返回session对象中与指定名称绑定的对象,若是不存在则返回null
2 public Enumeration getAttributeNames() 返回session对象中全部的对象名称
3 public long getCreationTime() 返回session对象被建立的时间, 以毫秒为单位,从1970年1月1号凌晨开始算起
4 public String getId() 返回session对象的ID
5 public long getLastAccessedTime() 返回客户端最后访问的时间,以毫秒为单位,从1970年1月1号凌晨开始算起
6 public int getMaxInactiveInterval() 返回最大时间间隔,以秒为单位,servlet 容器将会在这段时间内保持会话打开
7 public void invalidate() 将session无效化,解绑任何与该session绑定的对象
8 public boolean isNew() 返回是否为一个新的客户端,或者客户端是否拒绝加入session
9 public void removeAttribute(String name) 移除session中指定名称的对象
10 public void setAttribute(String name, Object value) 使用指定的名称和值来产生一个对象并绑定到session中
11 public void setMaxInactiveInterval(int interval) 用来指定时间,以秒为单位,servlet容器将会在这段时间内保持会话有效
使用HttpSession对象来获取建立时间和最后一次访问时间。咱们将会为request对象关联一个新的session对象,若是这个对象还没有存在的话。
<%@ page import="java.util.Date" %><%--
  Created by IntelliJ IDEA.
  User: YOONA
  Date: 2019/11/4/004
  Time: 22:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>session</title>
</head>
<%
    out.print("--------");
    //获取session的建立时间
    Date createdate = new Date(session.getCreationTime());
//获取session最后一次使用的时间
    Date lastdate = new Date(session.getLastAccessedTime());
    Integer count = Integer.valueOf(0);
    String countKey = String.valueOf("count");
    String userid = String.valueOf("teayeon");
    String userKey = String.valueOf("name");
    if (session.isNew()) {
        session.setAttribute(countKey, count);
        session.setAttribute(userKey, userid);
    } else {
        count = (Integer) session.getAttribute(countKey);
        count += 1;
        userid = (String) session.getAttribute(userKey);
        session.setAttribute(countKey, count);
    }
%>
<body>
<h1>Session 跟踪</h1>
<table border="1" align="center">
    <tr bgcolor="#949494">
        <th>Session 信息</th>
        <th>值</th>
    </tr>
    <tr>
        <td>id</td>
        <td><% out.print(session.getId()); %></td>
    </tr>
    <tr>
        <td>建立时间</td>
        <td><% out.print(createdate); %></td>
    </tr>
    <tr>
        <td>最后访问时间</td>
        <td><% out.print(lastdate); %></td>
    </tr>
    <tr>
        <td>用户 ID</td>
        <td><% out.print(userid); %></td>
    </tr>
    <tr>
        <td>访问次数</td>
        <td><% out.print(count); %></td>
    </tr>
</table>
</body>
</html>
第一次浏览
Session信息
id 2AF9C0F94869D5049E786A6ECDA8DF8A
建立时间 Mon Nov 04 22:53:52 CST 2019
最后访问时间 Mon Nov 04 22:53:52 CST 2019
用户 ID teayeon
访问次数 0
第二次.....。同一个浏览器在session的生命周期内,只要不清理浏览器历史记录,服务器不重启,这个次数会一直加1.
Session信息
id 2AF9C0F94869D5049E786A6ECDA8DF8A
建立时间 Mon Nov 04 22:53:52 CST 2019
最后访问时间 Mon Nov 04 22:53:52 CST 2019
用户 ID teayeon
访问次数 1
删除Session数据

当处理完一个用户的会话数据后,您能够有以下选择:编程

  • 移除一个特定的属性:调用public void removeAttribute(String name) 方法来移除指定的属性。浏览器

  • 删除整个会话:调用public void invalidate() 方法来使整个session无效。缓存

  • 设置会话有效期:调用 public void setMaxInactiveInterval(int interval) 方法来设置session超时。tomcat

  • 登出用户:支持servlet2.4版本的服务器,能够调用logout()方法来登出用户,而且使全部相关的session无效。

  • 配置web.xml文件:若是使用的是Tomcat,能够向下面这样配置web.xml文件:

<session-config>
    <session-timeout>15</session-timeout>
  </session-config>

==超时以分钟为单位,Tomcat中的默认的超时时间是30分钟。==

Servlet中的getMaxInactiveInterval()方法以秒为单位返回超时时间。若是在web.xml中配置的是15分钟,则getMaxInactiveInterval( ) 方法将会返回900。


6、application对象

application对象直接包装了servlet的ServletContext类的对象,是javax.servlet.ServletContext 类的实例。咱们也可使用this.getServletContext()来代替ServletContext类的对象(jsp中不可以使用,java中存在)
这个对象在JSP页面的整个生命周期中都表明着这个JSP页面。这个对象在JSP页面初始化时被建立,随着jspDestroy()方法的调用而被移除。
经过向application中添加属性,则全部组成您web应用的JSP文件都能访问到这些属性。
  1. application对象中提供了getAttributeNames()方法,能够取得所有属性的名称,下面利用此方法列出所有的属性名称和内容。
<%@ page import="java.util.*" %><%--
  Created by IntelliJ IDEA.
  User: YOONA
  Date: 2019/11/6/006
  Time: 13:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>获取所有的属性名称及内容</title>
</head>
<body>
<%
    Enumeration enu = application.getAttributeNames();
    while (enu.hasMoreElements()) {
        String name = (String) enu.nextElement();
%>
<h3><%=name%>-----><%=application.getAttribute(name)%>
</h3>
<%
    }
%>
</body>
</html>
输出
javax.servlet.context.tempdir----->D:\taeyeon\weblearn\target\tomcat\work\Tomcat\localhost\_
org.apache.catalina.resources----->org.apache.naming.resources.ProxyDirContext@7f6dafb
                         ......
  1. 网站计数器:
  • 由于访问网站的人会不少,有可能超过20位,因此使用Integer类——Integer完成
  • 用户每次的第一次访问时才须要进行计数,使用isNew()判断。
  • 在进行更改、保存时须要同步操做。
经过application.getRealPath("/")能够获取当前工程的真实路径(D:\taeyeon\weblearn\src\main\webapp\),到webapp结束。参数"/"是当前操做系统设置的路径分隔符。
<%@ page import="java.math.BigInteger" %>
<%@ page import="java.io.File" %>
<%@ page import="java.util.Scanner" %>
<%@ page import="java.io.FileOutputStream" %>
<%@ page import="java.io.FileInputStream" %>
<%@ page import="java.io.PrintStream" %>

<%--
 Created by IntelliJ IDEA.
 User: YOONA
 Date: 2019/11/6/006
 Time: 14:59
 To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>网站计数器</title>
</head>
<body>
<%--浏览人数保存在文件中,每次访问都会去读取该文件中的数据,而后判断当前用户是否为新用户,来给流量加一--%>
<%!
   Integer count = null;//建立存放浏览人数的对象
   File file1 = null;
%>
<%!
   public Integer load(File file) {//返回当前保存的浏览量
       try {
           Scanner scanner = null;
           file1 = new File(file + "/count.txt");
           if (file.exists()) ;
           else {
               file.mkdir();
           }
           if (file1.exists()) {//判断当前文件是否存在
               scanner = new Scanner(new FileInputStream(file1));
               if (scanner.hasNext()) {
                   count = Integer.valueOf(scanner.next());
               }
               scanner.close();
           } else {
               count = 0;
               save(file, count);
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
       return count;
   }

   //用来保存每一判断后的浏览量
   public void save(File file, Integer count) {
       try {
           if (file.exists()) ;
           else {
               file.mkdir();
           }
           PrintStream ps = new PrintStream(new FileOutputStream(file1));
           ps.println(count);
           ps.close();
       } catch (Exception e) {
           e.printStackTrace();
       }
   }

%>
<%
   String filePath = application.getRealPath("/");
   File file = new File(filePath + "/file");
   if (session.isNew()) {
       synchronized (this) {
           count = load(file);
           System.out.println(count);
           count = count + 1;
           save(file, count);
       }
   }
  session.setMaxInactiveInterval(1);
   response.setHeader("refresh","1");
%>
<H2>你是第<%=count == null ? "0" : count%>个访客!</H2>
</body>
</html>
由于是保存到txt文件里的数据,因此该访问量不会由于服务器的重启而初始为0;

7、config对象

config是javax.servlet.ServletConfig接口的实例对象,主要功能是取得一些初始化的配置信息,全部的初始化信息都在web.xml中配置。

config对象经常使用方法有:

方 法 说 明
  getServletContext()   获取Servlet上下文
  getServletName()    获取servlet服务器名
  getInitParameter()    获取服务器全部初始参数名称,返回值为java.util.Enumeration对象
  getInitParameterNames()    获取服务器中name参数的初始值
  1. 初始化一个参数name
<servlet>
    <servlet-name>initmsg</servlet-name>
    <jsp-file>/WEB-INF/config.jsp</jsp-file>
    <init-param>
      <param-name>name</param-name>
      <param-value>teayeon</param-value>
    </init-param>
  </servlet>
  1. 获取初始化的参数值
<%= config.getInitParameter("name")%>
在web目录中必须存在一个WEB-INFO文件夹,这个目录是受保护的,其中的内容没法被外部所访问到,安全性很高,若是将一个页面jsp文件保存在该目录下,那么在浏览器中用户是访问不到该页面的。因此咱们就要经过配置WEB-INFO下的web.xml文件了,进行映射操做。
  1. 不配置web.xml
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>config安全性</title>
</head>
<body>
<h3>我在WEB-INFO下面</h3>
</body>
</html>
输出
HTTP状态404-
类型状态报告

信息

描述 所请求的资源不可用。

Apache Tomcat / 7.0.47
  1. 配置了web.xml,就能够经过虚拟路径进行访问了(servlet-name不能重复)。
<servlet>
    <servlet-name>config</servlet-name>
    <jsp-file>/WEB-INF/config.jsp</jsp-file>
  </servlet>
  <servlet-mapping>
    <servlet-name>config</servlet-name>
    <url-pattern>/config</url-pattern>
  </servlet-mapping>

注意:咱们在书写web.xml文件时,<servlet>节点必定要放在<servlet-mapping>的前面。好比:

<servlet>

</servlet>

<servlet-mapping>

</servlet-mapping>

<servlet>

</servlet>

<servlet-mapping>

</servlet-mapping>

这样书写会报错的,正确方式以下:

<servlet>

</servlet>

<servlet>

</servlet>

<servlet-mapping>

</servlet-mapping>

<servlet-mapping>

</servlet-mapping>

8、out对象

out对象是javax.servlet.jsp.JspWriter类的实例化对象,主要功能是完成页面的输出操做,使用println();print()方法输出。建议你们多使用表达式<%=%>输出页面内容。

9、pageContext对象

经常使用方法:
方法 描述
forward(String relativeUrlPath): 将当前页面转发到另一个页面或者Servlet组建上;
getRequest(): 返回当前页面的request对象;
getResponse(): 返回当前页面的response对象;
getServetConfig(): 返回当前页面的servletConfig对象;
getServletContext(): 返回当前页面的ServletContext对象,这个对象是全部的页面共享的.
getSession(): 返回当前页面的session对象;
findAttribute(): 按照页面,请求,会话,以及应用程序范围的属性实现对某个属性的搜索;
setAttribute(): 设置默认页面范围或特定对象范围之中的对象.
removeAttribute(): 删除默认页面对象或特定对象范围之中的已命名对象.
pageContext对象是javax.servlet.jsp.PageContext 类的实例,用来表明整个JSP页面。
  1. 这个对象主要用来访问页面信息,同时过滤掉大部分实现细节。

  2. 这个对象存储了request对象和response对象的引用。application对象,config对象,session对象,out对象能够经过访问这个对象的属性来导出。

  3. pageContext对象也包含了传给JSP页面的指令信息,包括缓存信息,ErrorPage URL,页面scope等。

  4. PageContext类定义了一些字段(访问域int类型),包括PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE, APPLICATION_SCOPE。它也提供了40余种方法,有一半继承自javax.servlet.jsp.JspContext 类。

pageContext.setAttribute(String s,Object b,int i);//s为key,b为value,i为域
  1. 其中一个重要的方法就是removeArribute(),它可接受一个或两个参数。好比,pageContext.removeArribute("attrName")移除四个scope中相关属性,可是下面这种方法只移除特定scope中的相关属性:
pageContext.removeAttribute("attrName", PAGE_SCOPE);

获取request对象:pageContext.getRequest();

获取application对象:pageContext.getServletContext();

. . . . . . . 这样的方式就能够等价的获取到对象,而后使用该实例。


10、page对象

page对象是当前jsp页面自己,也就是this。是java.lang.Object类的实例。因此他的经常使用方法就是Object类的方法。

11、exception对象

exception 对象包装了从先前页面中抛出的异常信息。它一般被用来产生对出错条件的适当响应。

总结

除了学好每一个内置对象外,咱们还要熟练的使用这些内置对象所继承或者实现的接口名。这样咱们才能在servlet中熟练使用这些对象,在servlet中可没有这些内置对象,想要使用就必须去找到他们的类或者接口,去建立本身的实例。
相关文章
相关标签/搜索