JSP内置对象

2019-05-15

JSP的9大内置对象

内置对象 类型
request javax.servlet.http.HttpServletRequest
response javax.servlet.http.HttpServletResponse
pageContext javax.servlet.jsp.PageContext
session javax.servlet.http.HttpSession
application javax.servlet.jsp.ServletContext
out javax.servlet.jsp.JspWriter
config javax.servlet.ServletConfig
page java.lang.Object
exception java.lang.Throwable

request对象

request对象是客户端向服务器端发送的请求。来自客户端的请求经Servlet容器处理后,由request对象进行封装。每次客户端请求都会产生一个request实例。

获取请求参数

方法 返回值 方法说明
getParameter(String name) String 获得参数名为name的参数值
getParameterNames() Enumeration 获得所有参数的名称
getParameterValues(String name) String[] 获得参数名为name的所有参数值
getParameterMap() Map 获得所有参数封装的Map实例

get与post的不同:

① 传递数据的形式不一样

get方式在url地址后边以请求字符串形式传递参数

 http://网址/index.jsp?name=tom&age=23&addr=beijing

post方式是把form表单的数据以xml形式传递给服务器

② 安全方面,post传递数据较安全

③ 给服务器传递数据量

get方式的发送数据的大小受限于浏览器,每个浏览器的限制不一样 chrome是8K大部分浏览器是2k限制

http://网址/index.jsp?name=tom  此请求通过get方式传递了9个字节的信息

post原则没有限制,有的服务器限制为8M

解决中文提交乱码问题:

针对post方式

request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");

针对post与get方式

String username = request.getParameter("username");
username = new String(username.getBytes("iso-8859-1"),"utf-8");

tomcat8已经对get方式中文乱码进行了处理,只对post方式进行中文乱码处理即可

对于param标签的中文传参,应在参数接收页面使用request.setCharacterEncoding("UTF-8")进行设置

如何通过超链接实现post方式提交?



   

直接进入

执行forward和include

getRequestDispatcher(String path)
//path代表希望forward或者include的目标路径,该方法返回RequestDispatcher调度器对象
    
//该对象提供了如下两个方法:
//执行forward:
forward(ServletRequest request, ServletResponse response) 
//执行include:
include(ServletRequest request, ServletResponse response)

设置request范围的Map属性

request可以设置Map结构的集合,实现同一请求域内的数据共享

request.setAttribute(键, 值);
request.getAttribute(键);
request.removeAttribute(键);

注意事项:

所谓request范围,是指数据在一次请求范围内有效。如果页面从一个页面跳转到另一个页面,分两种情况:

如果是服务器端forward转发,则不会发起新的请求。原请求域有/效。

如果是客户端跳转(如客户单击超链接、通过浏览器地址栏访问、JS跳转)则会发起新的请求。原请求域失效。

获取web应用的绝对路径

out.print(request.getScheme() + "
"); //返回当前页面使用的协议 out.print(request.getServerName() + "
");//返回当前页面所在的服务器的名字 out.print(request.getServerPort() + "
");//返回当前页面所在的服务器使用的端口 out.print(request.getContextPath() + "
");//返回当前页面所在web应用的名字 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort() +request.getContextPath()+"/"; out.print(basePath + "
");//输出当前页面的绝对路径

默认情况下,页面中的链接都是相对于当前页面的相对地址。可以结合HTML中的元素规定页面中所有链接的基准URL。浏览器将使用指定的基准URL来解析所有的相对URL。

<%
    String basePath = request.getScheme()+"://"
        +request.getServerName()+":"+request.getServerPort()+
        request.getContextPath()+"/";       
%>



获取请求报头

发送请求时会附带请求报头信息发送给服务器,服务器端负责解析请求报头,并通过request对象读取请求报头信息。

JSP内置对象_第1张图片
1557971794913.png

session对象

session是一种跟踪客户状态的机制,代表一次用户会话(从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开为止)。当客户端向服务器发出第一个请求时,服务器会开辟一块缓存,用于存储用户状态信息,这块内存就是session。客户端浏览器再访问服务器其它页面期间,始终处于同一个session中。

每个用户(浏览器)都对应一个session对象。当多个客户端访问时,服务器会保存多个客户端的session。当前客户只能获取到自己的session。各客户的session彼此独立,互不可见。但是过多的session存储在服务器内存中,会对服务器造成压力。

方法 返回值 方法说明
getId() String 获得session的ID
getCreationTime() long 获得session生成的时间
getLashAccessedTime() long 获得用户最后通过session发送请求时间
getMaxInactiveInterval() long 取得session生命周期,如果超过这个时间则失效(具体销毁时间由Tomcat容器所决定)。
setMaxInactiveInterval() void 设置session生命周期,以秒为单位。如果超过这个时间则失效。设置为负数则不限制。
invalidate() void 清空session内容(手动销毁)
isNew() boolean 判断session是否为“新”的

sessionID

客户端首次与服务器连接时,服务器会为之分配session,每个session都具有sessionID,此ID作为Cookie保存在客户端浏览器缓存中(禁用cookie时则以get方式附在请求url中),用以标识该用户身份。每当用户向服务器发生请求时,服务器可以从request中读取sessionID,从而读取相应session中的用户信息。

实际开发中,sessionID常用于记录用户访问日志信息。

sessionID保存在客户端的Cookie中,该Cookie默认关闭浏览器即死亡,并且仅在当前浏览器内有效,各浏览器窗口间不共享。因此同一机器的两个浏览器窗口访问服务器时会产成两个不同的session。但是浏览器窗口内超链接打开的新窗口会共享父窗口的Cookie,共享一个session

session生命期

当浏览器关闭时,用户session并没有死亡。以下情况session将结束生命期:

  • 服务器进程停止
  • 服务器端调用了session的invalidate()方法(注意清除缓存)
  • session过期:为防止过多用户访问服务器造成内存溢出,服务器会把长时间内没有活跃(active)的session从内存中删除。这个时间可以在web.xml中自行设置(单位:分钟,TomCat默认为30分钟,设置为-1为无限制)
       
    30       
   

session范围的Map属性

session可以设置Map结构的集合,实现当前浏览器窗口内同一会话范围内的数据共享。

session.setAttribute(键, 值);
session.getAttribute(键);
session.removeAttribute(键);

response对象

页面请求重定向

重定向即客户端跳转。与forward不同,重定向将生成第二次请求,与在地址栏重新输入新地址效果一样,会在地址栏上显示目标地址。

response.sendRedirect(目标url);
forward sendRedirect
显示的URL始终是原始请求的URL 显示的URL是重定向之后的URL
使用同一个request 使用不同的request
假设有Web应用http://localhost:8080/myapp forward中的"/test.jsp "表示相对于WEB应用根路径:http://localhost:8080/myapp/test.jsp; sendRedirect("/test.jsp")表示相对于服务器根路径:http://localhost:8080/test.jsp 应添加当前web应用名称 request.getContextPath()
服务器内部转发,同一Web应用范围 可以跨WEB应用
不可带参数 可以传参数,直接写在url后面

中文传参问题

String username = "张三";
username = java.net.URLEncoder.encode(username);
response.sendRedirect("second.jsp?username=" + username);

页面自动刷新跳转

通过对response对象的setHeader()方法添加refresh报头,可以实现页面定时自动刷新及跳转。

response.setHeader("refresh", "1");  // 一秒后刷新页面
response.setHeader("refresh", "1;URL=目标url");  // 一秒后跳转到指定页面

设置浏览器缓存

设置浏览器缓存时间为24小时

response.setDateHeader("expires", System.currentTimeMillis() + 24 * 60 * 60 * 1000);

清空浏览器缓存

response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// 或者



设置浏览器输出方式

Cookie对象

Session与Cookie同属服务器会话跟踪技术。session在服务器端记录客户信息,Cookie在客户端记录客户信息。

Cookie实际上是一个键值对,当客户端访问服务器时,如果服务器需要记录该用户信息,就使用response向客户端浏览器颁发一个Cookie,存放于浏览器缓存中。当浏览器再请求该服务器时,浏览器会把请求的网址连同该Cookie一同提交给服务器,服务器可以进行辩认和修改。

Java把Cookie封装成了javax.servlet.http.Cookie类。Cookie对象使用key-value属性对的形式保存用户信息。

Cookie cookie_name =new Cookie(键,值);
返回类型 方法名 方法解释
String getComment() 返回cookie中注释,如果没有注释将返回空值.
String getDomain() 返回cookie中Cookie适用的域名. 使用getDomain() 方法可以指示浏览器把Cookie返回给同 一域内的其他服务器,而通常Cookie只返回给与发送它的服务器名字完全相同的服务器。注意域名必须以点开始(例如.yesky.com)
int getMaxAge() 返回Cookie的有效时间,以秒计算。
String getName() 返回Cookie的名字
String getPath() 返回Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下的所有页面。
boolean getSecure() 如果浏览器通过安全协议发送cookies将返回true值,如果浏览器使用标准协议则返回false值。
String getValue() 返回Cookie的值。
int getVersion() 返回Cookie所遵从的协议版本。
void setComment(String urpose) 设置cookie中注释。
void setDomain(String pattern) 设置cookie中Cookie适用的域名
void setMaxAge(int expiry) 以秒计算,设置Cookie的有效期,默认-1, 是在当前浏览器有效,关闭浏览器即消失。
void setPath(String uri) 指定Cookie适用的路径。
void setSecure(boolean flag) 指出浏览器使用的安全协议,例如HTTPS或SSL传输Cookie
void setValue(String newValue) cookie创建后设置一个新的值。
void setVersion(int v) 设置Cookie所遵从的协议版本。

写入Cookie

  
//创建Cookie对象
Cookie c = new Cookie("username", "James");
//设置Cookie对象的生存期限为24小时
c.setMaxAge(24 * 3600);
//向客户端增加Cookie对象
response.addCookie(c);

注意:

Cookie的MaxAge默认为-1。如果为负数,则为临时Cookie,保存在浏览器内存中,关闭浏览器即失效。如果为正数,则存于硬盘上,在指定时间内有效。设置MaxAge为Integer.MAX_VALUE可以永久有效。

Cookie机制没有提供删除方法,只能新建一个同名的Cookie进行覆盖,通过设置即时失效(MaxAge为0)实现删除效果。

读取Cookie

//获取本站在客户端上保留的所有Cookie
   Cookie[] cookies = request.getCookies();
   //遍历Cookie
   for (Cookie c : cookies) {
     if (c.getName().equals("username")) {
         out.println(c.getValue());
     }
   }

写入Cookie解决中文编码问题

// 写入
Cookie c = new Cookie("username", URLEncoder.encode("张三", "UTF-8"));
c.setMaxAge(24 * 3600);
response.addCookie(c);

// 读取
Cookie[] cookies = request.getCookies();
for (Cookie c : cookies) {
   if (c.getName().equals("username")) {
      out.print(URLDecoder.decode(c.getValue(), "UTF-8"));
   }
}

保存SessionID

浏览器关闭时保存在浏览器Cookie中的sessionId将删除,因此重新打开浏览器窗口访问服务器时,将无法读取原Sesion,服务器将会向用户浏览器的Cookie回写新的sessionId。

String sessionid=session.getId();
Cookie cookie=new Cookie("JSESSIONID",sessionid);
cookie.setPath("/Web应用名称"); 
cookie.setMaxAge(30*60);
response.addCookie(cookie);

设置Cookie的domain

Cookie不可跨域访问,但Cookie的domain属性可以让网站中二级域共享Cookie

现在希望在这些主机之间共享Cookie(例如在www.baidu.com中响应的cookie,可以在news.baidu.com请求中包含)只需要下面两步:

c.setPath("/");
c.setDomain(".baidu.com")。

application对象

application对象代表Web应用本身。其生命周期是服务器启动产生直到服务器关闭为止。容器中的所有用户共享一个application对象。服务器启动后自动创建application对象,直到服务器关闭销毁。

设置application范围属性

Web服务器为application提供了Map结构的集合。一旦JSP、Servlet将数据放入application中,该数据将可以被该应用下其他所有的JSP、Servlet访问。

application.setAttribute(键, 值);
application.getAttribute(键);
application.removeAttribute(键);

获取应用初始化参数

在web.xml中配置应用的初始化参数


    username
    admin  

获取参数

application.getInitParameter("username");

获得服务器资源的本地路径信息

application.getRealPath(服务器资源路径); 

获取资源IO流

application.getResourceAsStream(服务器资源路径);
InputStream in = application.getResourceAsStream("/hello.txt");
byte [] data = new byte[in.available()];
in.read(data);
String str = new String(data);
out.print(str);

pageContext对象

pageContext对象代表该JSP页面的上下文(context)运行环境,存储本JSP页面相关数据信息。pageContext只在当前页面范围内有效。

  • 封装了对其他8大JSP对象的引用
  • 自身可以用来保存数据
  • 封装了web开发中的一些常用操作
//设置page范围属性
pageContext.setAttribute("name", "page_val");

//设置request范围属性
pageContext.getRequest().setAttribute("name", "request_val");

//设置session范围属性
pageContext.getSession().setAttribute("name", "session_val");

//设置application范围属性
pageContext.getServletContext().setAttribute("name","application_val");
//获得page范围属性 
String pageStr = (String) pageContext.getAttribute("name",pageContext.PAGE_SCOPE); 
    
//获得request范围属性 
String requestStr = (String) pageContext.getAttribute("name",pageContext.REQUEST_SCOPE); 
    
//获得session范围属性 
String sessionStr = (String) pageContext.getAttribute("name",pageContext.SESSION_SCOPE); 

//获得application范围属性
String applicationStr = (String) ageContext.getAttribute("name",pageContext.APPLICATION_SCOPE); 
    
//按照page/requet/session/application的顺序搜索属性
String findStr = (String) pageContext.findAttribute("name");

其它对象

page对象

是指向当前JSP本身的对象,是java.lang.Object实例,类似this关键字。该对象在JSP中的应用不多。

config对象

代表当前JSP配置信息,但JSP页面通常无须配置,因此也就不存在配置信息。该对象在JSP页面中比较少用,但在Servlet中则用处相对较大,因为Servlet需要在web.xml文件中进行配置,可以通过此对象操作配置参数。

总结

四大会话域范围

  • page:通过pageContext对象表示当前JSP页面范围。代表本页面相关的对象和属性。
  • request:仅对本次请求有效,一旦JSP、Servlet将数据放入request中,该数据将可以被该本次请求的其他JSP、Servlet访问。
  • session:仅对一次会话有效,一旦JSP、Servlet将数据放入session中,该数据将可以被本次会话的其他所有的JSP、Servlet访问。
  • application:对于整个Web应用有效,一旦JSP、Servlet将数据放入application中,该数据将可以被该应用下其他所有的JSP、Servlet访问。

你可能感兴趣的:(JSP内置对象)