在eclipse中创建的动态web工程下,WEB-INF中的文件,无法通过客户端(浏览器)直接访问,只能通过请求转发来访问。
注意:不是所有的内部跳转都能访问WEB-INF,只有请求转发可以,重定向不能访问。
JSP的页面元素:
a.脚本
i.<%
局部变量、Java语句
%>
ii.<%!
全局变量、定义方法
%>
iii.<%=输出表达式%>
输出表达式和out.print()是等价的,即out.print(“hello”)等价于<%=“hello”%>
b.指令
page指令
<%@ page …%>
page指定的属性如下:
language:jsp页面使用的脚本语言
import:导入类
pageEncoding:jsp文件自身编码
contentType:浏览器解析jsp的编码
<%@ page language=“java” contentType=“text/html; charset=utf-8” pageEncoding=“UTF-8” import=“java.util.Date”%>
c.注释
html注释 ,
用户可以通过浏览器查看源代码查看到这种注释
java注释// 单行注释 /**/多行注释
jsp注释<%-- %>
JSP九大内置对象
pageContext JSP页面容器
request 请求对象,存储“客户端向服务端发送的请求信息”
session 会话对象
application 全局对象
response 响应对象
config 配置对象(服务器配置信息)
out 输出对象,向客户端输出内容
page 当前JSP页面对象
exception 异常对象
request对象的常见方法:
String getParamenter(String name);根据请求的字段名key,返回字段值value
String[] getParameterValues(String name);根据请求的字段名key,返回多个字段值value(如多选框checkbox)
void setCharacterEncoding(“编码格式utf-8”);设置post请求的编码格式
getRequestDispatcher(“b.jsp”).forward(request,response);请求转发的方式跳转页面
ServeltContext getServletContext();获取项目的ServletContext对象
get提交方式:method="get"或用地址栏或超链接这三种请求方式,默认都属于get提交方式。
get与post请求方式的区别:
a.get方式在地址栏显示请求信息(但地址栏能容纳的信息有限,只能存储4-5KB,如果请求数据存在大文件,则不能使用get)。
b.文件上传操作,必须是post。
所以推荐使用post。
response对象常用的方法:
void addCookie(Cookie cookie);服务器向客户端增加cookie对象
void sendRedirect(String location);页面跳转的一种方式(重定向)
void setContetType(String type);设置服务端响应的编码(设置服务器的contentType类型)
请求转发 | 重定向 | |
---|---|---|
地址栏是否改变 | 不变 | 改变 |
是否保留第一次请求时的数据 | 保留 | 不保留 |
请求的次数 | 1 | 2 |
跳转发生的位置 | 服务端 | 客户端发出的第二次跳转 |
请求转发,可以获取到数据,并且地址栏没有改变,仍然保留转发时的页面。
session(服务端)
Cookie(客户端,不是内置对象):Cookie是由服务器端生成的,再发送给客户端保存。
作用:提高访问服务端的效率,但是安全性较差。
Cookie: name = value
public Cookie ( String name, String value )
String getName(); //获取name
String getValue(); //获取value
void setMaxAge( int expiry ); //最大有效期(秒)
服务端准备Cookie:response.addCookie( Cookie cookie )
页面跳转(转发、重定向)
服务端获取Cookie:request.getCookies();
- 服务器端增加Cookie:response对象;客户端获取对象;request对象
- 不能直接获取某一单独对象,只能一次性将全部的Cookie拿到。
session对象,是一个会话。比如浏览网站,打开-关闭等。
session机制:客户端第一次请求服务器时,(jsessionid-sessionid)服务端会产生一个session对象(用于保存该客户的信息),并且每个session对象都会有一个唯一的sessionId(用于区分其他session);服务端会产生一个cookie,并且该cookie的name=JSESSIONID,value=服务端sessionId的值;然后服务端会再响应客户端的同时将该cookie发送给客户端,至此客户端就有了一个cookie(JSESSIONID);因此客户端的cookie就可以和服务端的session一一对应(JESSIONID=sessionID)
session方法:
String getId();获取sessionId
boolean isNew();判断是否是新用户(第一次访问)
void invalidate();使session失效(退出登录、注销)
void setAttribute()
Object getAttribute()
void setMaxInactiveInterval();单位是秒,设置最大有效非活动时间
int getMaxInactiveInterval();获取最大有效非活动时间
cookie和session的区别
session | cookie | |
---|---|---|
保存的位置 | 服务器 | 客户端 |
安全性 | 较安全 | 不太安全 |
保存的内容 | Object | 2String |
application全局对象
String getContextPath();获取虚拟路径
String getRealPath(String name);绝对路径(虚拟路径相对的绝对路径)
四种范围对象(从小到大)
pageContext JSP页面容器 当前页面有效
request 请求对象 同一次请求有效
session 会话对象 同一次会话有效
application 全局对象 全局有效(整个项目有效)
以上4个对象共有的方法
Object getAttribute(String name):根据属性名,获取属性值。
void setAttribute(String name,Object obj):设置属性值(新增或修改)
setAttribute(“a”,“b”);//如果a对象之前不存在,则新建一个a对象;如果a之前已经存在,则将a的值改为b。
void removeAttribute(String name);根据属性名,删除对象。
pageContext:当前页面有效(页面跳转后无效)
request:同一次请求有效,其他请求无效(请求转发后有效,重定向后无效)
session:同一次会话有效(无论怎么跳转都有效,关闭/切换浏览器后无效,从登录到退出之前全部都有效)
application:全局变量,整个项目运行期间都有效(切换浏览器仍然有效)
1、以上的4个范围对象,通过setAttribute()复制,通过getAttribute()取值;
2、以上范围对象,尽量使用最小的范围,因为对象范围越大,造成的性能损耗越大。