1.JSP页面元素
a.脚本Scriptlet
[注] 都是在body里面写
i.
<%
局部变量、java语句
%>
ii.
<%!
全局变量、定义方法
%>
iii.
<%=输出表达式%>
eg:
<%!
public String bookNake;
public void init(){
bookName="java书";
}
%>
====hello index1 你好...====
<%
String name="zhangsan";
out.print("hello..."+name);
init();
%>
<%="hello..."+bookName %>
一般而言,如果修改web.xml、配置文件、java文件需要重启tomcat服务器
但是如果修改jsp、html、css、js不需要重启
b.指令
<%@ page language=”java” contentType=”text/html; charset=UTF-8” pageEncoding=”UTF-8”% import=”java.util.Date” %>
page指令: <%@ …. %>
page指定的属性:
language:jsp页面使用的脚本语言
import:导入类(比如后面的代码要用Date类,就要在这个地方impor)
pageEncoding:jsp文件自身编码(jsp->java)
contentType:浏览器解析jsp的编码(与上面要保持一致)c.注释
<!--html注释--> 可以通过浏览器查看源码观察到,但是下面两个不行
java注释 // /**/
<%--jsp注释--%>
2.JSP内置对象(九个)
自带的,不用new也能使用
- out:想客户端输出内容
- pageContext
request:请求对象,存储”客户端向服务端发送的请求信息”
request常用方法:
String getParameter(String name)根据字段名key(input标签的name属性值),取字段值value(input标签的value属性值)
String[] getParameterValues(String name)返回的是一个数组,如果爱好里面有足球、篮球等
getRequestDispatcher(“b.jsp”).forward(request,response)请求转发,A页面跳到B页面
request只在同一次请求有效,如果按浏览器上的刷新键,则相当于再提交请求一次,跟之前的请求不一样了,第二次在check.jsp里面可能会报错是因为第二次没有第一次的输入,没有name pwd的数据了。但是firefox浏览器按F5表示的是重复之前的操作(即输入用户名,密码,不会报错)
get提交方式:method=”get”和地址栏、超链接(<a href="xx">
)请求方式 这些默认都是get提交方式
get与post请求方式的区别:
get方式在地址栏显示请求信息(姓名性别那些,但是地址栏能够容纳的信息有限,图片等可能都容纳不下),post不显示
文件上传操作,必须是post,也推荐使用post
统一请求方式的编码(出现乱码的解决方案)
get方式请求的乱码:修改server.xml中在端口号的那一行最后加上URIEncoding=”UTF-8”
post方式请求的乱码:body标签里面写request.setCharacterEncoding(“utf-8”)response:响应对象
提供的方法:
void addCookie(Cookie cookie):服务端向客户端增加cookie对象
void sendRedirect(String location) throws IOException 页面跳转的一种方式(重定向,还有一种是请求转发)
void setContentType(String type)设置服务端响应的编码(设置服务端的contentType类型)
请求转发 | 重定向 | |
---|---|---|
地址栏是否改变 | 不变(check.jsp) | 改变(success.jsp) |
是否丢失第一次请求时的数据 | 不丢失 | 丢失 |
请求的次数 | 1次 | 2次 |
跳转发生的位置 | 服务端 | 服务端返回后,客户端发生第二次跳转 |
Cookie(客户端,不是内置对象,所以需要new。但是服务端会自动new一个name=JESSIONID的cookie):由服务端生成的,再发送给客户端保存
相当于本地缓存的作用:如第一次先把服务端的内容下载下来保存到本地,之后看便可以直接在本地。
客户端第一次请求服务端时,如果服务端发现此请求没有JESSIONID,则会创建一个name=JESSIONID的cookie,并返回给客户端。
作用:提高访问服务端的效率,但是安全性较差。
Cookie:key=value(一个Cookie包含一个键值对)
在java.servlet.http.Cookie里面
public Cookie(String name,String value)
void setMaxAge(int expiry) 最大有效期(秒)
服务端准备Cookie:
response.addCookie(Cookie cookie)
页面跳转
客户端获取cookie:
resquest.getCookies()
a.服务端增加cookie:response对象 客户端获取对象:request对象
b.不能直接获取某一个cookie,只能一次性将所有的cookie拿到
通过F12发以发线,除了自己设置的Cookie之外,还有一个name为JSESSIONID的cookie
使用Cookie实现记住用户名功能session(服务端)
session:会话(如从打开浏览网站到关闭为一个会话)
a. session储存在服务端
b. session是在同一个用户请求时共享
c. 实现机制:第一次客户请求时产生一个sessionID并复制给cookie的JESSIONID,然后发给客户端。最终通过session的sessionID-JESSIONID一一对应
session机制:
客户端第一次请求服务端时,(会匹配一下JESSIONID与sessionID,但会失败,找不到)服务端会产生一个session对象(保存该客户的信息),并且每个session对象都会有一个唯一的sessionID(用于区分其他session)。
服务端又会产生一个cookie,并且该cookie的name=JSESSIONID,value=服务端sessionID的值。然后服务端会在相应客户端的同时将该cookie发送给客户端。至此客户端就有了一个cookie(JSESSIONID)。因此客户端的cookie就可以和服务端的session一一对应(JESSIONID-sessionID)
客户端第2-n次请求服务端时,服务端会先用客户端的cookie中的JSESSIONID去服务端的session中匹配sessionID,如果匹配成功(cookie的JSESSIONID和session的sessionID),说明此用户不是第一次访问,就不用登陆了。
session是同一个会话共享(不同浏览器是不同的session,对于一个session,每个jsp都是共享这个session的,例如在check.jsp里面把uname的值存到session中,在另一个A.jsp中<%=session.getAttribute(“uname”)>可以直接打印出之前在login.jsp里面输入的值)
session方法:
String getID():获取sessionID
boolean isNew():判断是否是第一次访问(新用户)
void invalidate():使session失效(退出登录、注销)
voidsetAttribute():设置属性值
Object getAttribute()
void setMaxInactiveInterval(秒):设置最大有效非活动时间(超过这个时间session失效,要重新登录)
int getMaxInactiveInterval()
- application全局对象
String getContextPath() 虚拟路径
String getRealPath(String name) 绝对路径(虚拟路径相对的绝对路径)
- config配置对象
服务器配置信息
- page当前jsp页面对象
相当于JAVA里面的this
- exception
异常对象
3.四种范围对象(小->大)
pageContext JSP页面容器(page对象,不是上面的那个page) 当前页面有效(页面跳转后无效)
request 请求对象 同一次请求有效(请求转发有效,重定向无效,因为重定向对于browser来说是两次请求了)
session 会话对象 同一次会话有效(浏览器不关/不换,都是一次会话即从登陆到退出之间全都有效)
application 全局对象 全局有效(整个项目有效,切换浏览器仍然有效。关闭服务、其他项目 均无效。如果想重启、多个项目共享,可以采用JNDI)
以上4个对象的共有方法:
Object getAttribute(String name) 根据属性名,设置属性名
void setAttribute(String name,Object obj) 设置属性值(新增,修改)
setAttribute(“a”,”b”)如果a不存在,则创建a并且将a的值改为b
void removeAttribute(Stirng name)根据属性名,删除对象
注意点:
- 以上4个范围对象,通过setAttribute()赋值,通过getAttribute()取值
- 以上范围对象,尽量使用最小的范围。因为对象范围越大,造成的性能损耗越大。