一.JSP的页面元素
a. 脚本 ScrptLet
1. <% 局部变量、java语句%>
- <%! 局部变量、定义方法>
- <%=输出表达式 %>
一般而言,修改web.xml、配置文件、java代码,需要重启服务,但是如果修改Jsp\html\css\js,不需要重启。
b. 指令
page指令
<%@ page .... %>
page指定的属性:
language:jsp页面使用的脚本语言
import:导入类
pageEncoding:jsp文件自身编码 jsp => java
contentType:浏览器解析jsp的编码
c. 注释
- html注释 < !-- -->,可以被用户通过浏览器查看源码看到
- java注释 // /......./
- jsp注释 <%-- --%>
d. JSP九大内置对象(自带的,不需要new 也能使用的对象)
- out: 输出对象,向客户端输出内容
- request:请求对象,存储客户端向服务端发送的请求信息
request对象的常见方法:
String getParameter(String name) 根据请求的字段名key,返回字段值value input标签的value属性值
String[] getParameterValues(String name) 根据请求的字段名key,返回多个字段值value(checkbox 复选框)
void setCharacterEncoding("编码格式"):设置post请求编码,tomcat7以前默认iso-8859-1,tomcat8以后用utf-8
getRequestDispatcher("b.jsp").forward(request,response): 以请求转发的方式跳转页面,A => B
ServletContext getServletContext(): 获取项目的ServletContext对象
http://localhost:8080/show.jsp?uname=zs&upwd=avc&uage=29&uhobbies=%E8%B6%B3%E7%90%83&uhobbies=%E7%AF%AE%E7%90%83
get提交方式:method="get" 和 地址栏、超链接<a href="xx"/> 请求方式 默认都是get请求方式
get与post请求方式的区别
- get方式 在地址栏显示 请求信息(但是地址栏能够容纳的信息有限,4-5KB;如果请求数据存在大文件,图片等会出现地址栏无法容纳大小而出错);post不会.
- 文件上传操作,必须是post
推荐使用post
get方式请求,如果出现乱码,如下解决方案:
- 统一每一个变量的编码(不推荐)
new String(就旧码,新编码);
name = new String(name.getBytes("iso-8859-1","utf-8")); - 修改server.xml,一次性的更改tomcat默认get提交方式的编码(utf-8)
建议 使用tomcat时,首先再server.xml中 统一个体方式的请求方式的编码。。。 修改端口号那一行添加URIEncoding="UTF-8"
tomcat8以后默认时utf-8
- resonse:响应对象
提供的方法:
void addCookie(Cookie cookie): 服务端向客户端增加cookie对象
void senRedirect(String location) throws IOException: 页面跳转的一种方式,重定向
void setContentType(String type):设置服务端响应的编码(设置服务端的contentype)
示例:登陆
login.jsp => check.jsp => success.jsp
请求转发 | 重定向 | |
---|---|---|
地址栏是否改变 | 不变check.jsp | 改变success.jsp |
是否保留第一次请求时的数据 | 保留 | 不保留 |
请求次数 | 1次 | 2次 |
- pageContext jsp页面容器
- session(存在于服务端):绘画
讲session前先了解cookie;
Cookie(存在于客户端,不是内置对象):Cookie是由服务端生成的,再发送给客户端保存。
相当于 本地缓存的作用: 客户端(hello.mp4,zs/abc)=>服务端(hello.mp4,zs/abc)
作用:提高访问服务端的效率,但是安全性较差。
Cookie:name=value
javax.servlet.htttp.Cookie
public Cookie(String name, String value)
String getName():获取name
String getValue():获取value
void setMaxAge(int expire):最大有限期(秒)
服务端准备cookie:
response.addCookie(Cookie cookie)
页面跳转(转发,重定向)
客户端获取cookie:request.getCookies();
a. 服务端增加cookie: response对象; 客户端获取cookie:request对象
b. 不能直接获取某一个单独对象,只能一次性将全部的cookie拿到
通过F12可以发现 除了自己设置的cookie外,还会得到一个name为JSSESSIONID的cookie
session:会话
a. 浏览网站:开始-关闭
b. 购物: 浏览、付款、退出
c. 电子邮件: 浏览、写邮件、退出
开始-结束为一次会话
session机制
客户端第一次请求服务端时, 服务端会产生一个session对象(用户保存该客户的信息),并且每个session对象都会有一个唯一的sessionId(用于区分其他session),并且服务端也会产生一个cookie,并且该cookie的name=JSESSIONID,value=服务端的sessionId的值,然后 服务端会在响应客户端的同时将该cookie发送给客户端 ,至此 客户端就有了一个cookie(JSESSIONID),因此,客户端的cookie就可以和服务端的session一一对应(JSESSSIONID=>sessionId)
客户端第2/n次请求服务端时:服务端会先用客户端cookie中的JSESSIONID 去服务端的session中匹配sessionId,如果匹配成功,说明此用户已不是第一次访问
生活实例:
客户端:顾客(第一次存包后拿到号码牌)
服务端:存包处
session方法:
String getId():获取sessionId
boolean isNew():判断是否是新用户(第一次访问)
void invalidate():使session失效(退出登陆、注销)
setAttribute();
getAttribute();
void setMaxInActiveInterval(秒):设置最大有效时间,
- application 全局对象
String getContextPath() 获取当前项目虚拟路径
String getRealPath() 获取当前项目的绝对路径 - config 配置对象(服务器配置信息)
- page 当前JSP页面对象(相当于java中的this)
-
exception 异常对象
request.png
请求转发.png
重定向.png
四个范围对象(从小到大)
pageContext jsp
页面容器: 当前页面有效(跳转后无效)
request 请求对象:同一次请求有效
session 会话对象: 同一次会话有效
application 全局对象:全局有效;整个项目运行期间 都有效;关闭服务、其他项目无效
=》多个项目共享、重启后仍然有效: JNDI
以上4个对象共有的方法:
Object getAttribute(String name ):根据属性名,获取属性值
void setAttribute(String name, Object obj) 设置属性值
setAttribute("a","b")//如果a不存在,则创建一个新的,如果存在则覆盖
removeAttribute("a")根据属性名删除对象
建议以上范围对象在使用时尽量用最小的范围,对象范围越大造成的性能损耗越大。