文章目录
最近在复习javaweb,复习到jsp,本文亦是我打笔记,会讲JSP页面元素HTML、Java代码(脚本Scriptlet)、指令、注释、九大内置对象,html不在此讲,重点讲九大内置对象。
一、脚本Scriptlet
<%%> <%! %> <%= %> 的区别
i:
<%
//"<% %>"可以定义局部变量、Java语句
String bookName ="java";
out.println("bookname");
%>
ii:
<%!
//"<%! %>"可以定义全局变量、定义方法
publish String bookName ;//全局变量
publish void init(){
bookName="java";
}
%>
iii:
//“<%= %>”是一个输出表达式,作用等价于out.println();如下输出字符java
<%=java%>
值得注意的是,*out.println*
不能换行,得在后面加“</br>”
标签才有换行功能。即out.println() <%= %>
可以直接解析html代码,如
out.println(<font color='red'>"bookName"</font>);
实际显示效果bookName会变红色
out.println(“bookName”);
二、指令
- page:指定的属性
- language:jsp页面使用的脚本语言
- import:导入类
- pageEncoding:jsp文件自身编码 jsp -> java
- contentType:浏览器解析jsp的编码
<%@ page language="java" import="java.util.*"
contentType="text/html; charset=utf-8"%>
三、注释
html注释 <!-- -->
java注释 // /*..*/
jsp注释 <%-- --%>
四、JSP九大内置对象
1.out:输出对象,向客户端输出内容
out.println("java");
2.request:请求对象,储存“客户端向服务端发送的请求信息”
request对象的常见方法
/*根据请求的字段名key(input标签的name属性值),
返回字段值value(input标签的value属性值)*/
String getParameter(String name)
//根据请求的字段名key,返回多个字段值value (checkbox)
String[] getParameter(String name)
/*设置post方式请求编码
如何设置get方式请求编码在下面会说到*/
request.setCharacterEncoding("utf-8")
//请求转发的格式跳转页面 A->B
getRequestDispatcher("B.jsp").forWard(request,response);
//获取项目的ServletContext对象,通过request获取
ServletContext getServerContext();
这里提一下get和post两种请求提交方式的区别
(1) get在地址栏会显示请求转发的信息,比如用户名密码等,不够安全,post则不会。且地址栏容量有限,一般4~5kb,所以一般用post。
(2)上传文件必须使用post
(3) 统一请求的编码request
get方式请求出现乱码的解决方案:
i: 统一每个变量的编码(变量过多的话不推荐,不够方便)
//new String(旧编码,新编码);
String name=request.getParameter("myName");
name=new String(name.getBytes("iso-8859-1"),"utf-8");
ii: 修改server.xml,一次性更改tomcat默认get提交方式的编码(utf-8)
在server.xml的中(就是修改端口号的地方)后面加上
URIEncoding=“UTF-8”
<Connector......URIEncoding="UTF-8" />
这里提一下post方式请求出现乱码的解决方案:
request.setCharacterEncoding("utf-8")
3.respone:响应对象
提供的方法
// 服务端向客户端增加cookie对象
void addCookie(Cookie cookie);
//页面跳转的一种方式(重定向)
void sendRedirect(String location) throws IOException ;
//设置服务端响应的编码(设置服务端的contentType)类型
void setContetType(String type)
页面跳转重定向可能会导致数据丢失,最好用请求转发
下面用一个表格来看看重定向与请求转发有何区别
请求转发 | 重定向 | |
---|---|---|
地址栏是否改变 | 不变 | 改变 |
是否保留第一次请求时的数据 | 是 | 否 |
请求的次数 | 1 | 2 |
跳转发生的位置 | 服务端 | 客户端发出的二次跳转 |
安全性 | 较安全 | 较不安全 |
保存的内容 | Object | String |
4.session:会话对象
讲session之前,我们先来看看Cookie
cookie通俗点讲,相当于本地缓存的作用。
作用:提高访问服务端的效率,但是安全性较差。
先看看两者的一些区别
Cookie | seesion |
---|---|
不是jsp内置对象 | 是JSP内置对象 |
客户端对象(由服务端产生,再发送给客户端) | 服务端对象 |
安全性较低 | 较安全 |
保存的内容:String | 保存的内容:Object |
Cookie内部细节
包含键值对 name(key) = value 。
他不是JSP内置对象,由类javax.servlet.http.Cookie
产生。
常见的方法
public Cookie(String name(key),String value)
String name(key) //获取name(key)
String value// 获取value
void setMaxAge(int expiry); //最大有效期,单位为秒
那么Cookie在服务端产生完是如何发送到客户端的?
1.服务端准备Cookie: response.addCookie(Cookie cookie)
2.页面跳转(转发,重定向)
3.客户端获取cookie: request.getCookie();
需要注意两点
1.服务端增加cookie : respone对象;客户端获取对象 :request对象。
2.不能直接获取某一单独对象,只能一次性将所有cookie拿到。
3使用Cookie可以实现浏览器记住用户名密码功能。
下面通过一个例子来加深了解
新建a.jsp、b.jsp两个页面 (下面只放出主要代码)
//这是a.jsp 服务端
<%
//服务端
Cookie cookie1=new Cookie("name","zs")
Cookie cookie2=new Cookie("pwd","abc")
responese.addCookie(cookie1);
responese.addCookie(cookie2);
//页面跳转到客户端(转发、重定向)
responese.sendRedirect("b.jsp")
%>
//这是b.jsp 客户端
<%
//客户端
Cookie[] cookies=request.getCookies()
for(Cookie cookie:cookies){
out.print(cookie.getName()+" "+cookie.getValue() )
}
%>
上面我们使用for遍历了所有cookie,为什么要遍历?原因就是上面“注意”中所说的,cookie不能直接获取某一单独对象,只能一次性将所有cookie拿到。
运行结果如下
可以看到会多了一行奇奇怪怪的东西,这是name为JSESSIONID的cookie,JSESSIONID和session密切相关,后面讲session会讲到。
Cookie总结:
i:它不是内置对象,要使用就必须new
ii:但是服务端会自动生成一个name=JESSIONID的cookie并返回给客户端
ok,接下来讲session
session机制:
客户端第一次请求服务端时,服务端会产生一个session对象(用于保存该用户的信息),且每个session对象都会有唯一的sessionid(用于区分其他session);服务端会产生一个cookie并且该cookie的name=JSEEIONID
,value=sessionID
(服务端的值),然后服务端会在响应客户端的同时将该cookie发送给客户端,至此,客户端就有了一个cookie(JESSIONID);因此,客户端的cookie就可以和服务端的seesion一一对应
客户端第二/N次请求服务时,服务端会先用客户端的cookie中的JSEEIONID去服务端中的session匹配sessionID,如果匹配成功(cookie JESSIONID 和 session sessionID),则证明不是第一次访问。
举个商场存包的例子:
客户端: 顾客
服务端:存包处
JESSIONID:钥匙 sessionID:柜子锁
如果顾客是第一次存包:商场通过判断此人手里是否有钥匙(JSEEIONID)来判断
之前是否存过包,如果是刚来(没钥匙),则分配一个钥匙给顾客,钥匙和柜子锁
一一对应不重复。
第二/N次存包:商场判断顾客手里有钥匙,则不需要分配
总结
a. session储存在服务端
b. session是在同一个用户(客户)请求时共享
c. 实现机制:第一次客户请求时产生一个sessionid并赋值给cookie的jseeionid。最终通过sessionid与jseeionid一一匹配。
接下来说说session的几个常用方法:
String getId(); //获取sessionID
boolean isNews(); //判断是否是新用户
void invalidate(); //使session失效(退出登录、注销等)
void setMaxInactiveInterval(); //设置最大有效非活动时间,单位为秒
int getMaxInactiveInterval(); //获取最大有效非活动时间
void setAttribute();
Object getAttribute();
下面用一段判断登录的代码示例来理解一下这些方法
//reques请求对象
String name=request.getParameter("uname");
String pwd =request.getParameter("upwd");
//提前设置好用户名密码
if(name.equals("abc")&&pwd.eaquls("123")){
/*若登录成功,服务端给客户端分配session值,
session中才会存在 “uname”和“upwd”*/
session.setAttribute("uname",name);
session.setAttribute("upwd",pwd);
}else{
// ***
}
假设我们以上登录成功并跳转到欢迎页面,可以通过Object getAttribute();
来获取session的值,如下:
<body>
欢迎您!
<%
String name =(String) session.getAttribute("uname");
out.print(name)
%>
</body>
则浏览器登录成功后显示的效果为:“欢迎您!abc”
值得一提的是,session在同一浏览器内是共享的。比如你在谷歌浏览器登录成功之后,在最大有效非活动时间内,开启一个新的谷歌浏览器登录时它依旧有你的session。
5.appliation:全局对象
初阶段需要掌握以下两个方法:
//获取虚拟路径
String getContextPath();
//获取绝对路径与虚拟路径相对的绝对路径
String getRealPath(String name);
举个栗子
<!--假设这是一个JSP页面“a.jsp”-->
<%
//通过这个方法可以获取到当前项目的虚拟路径,假设获取到的虚拟路径是AAA
String getContextPath();
//通过这个方法可以获取到当前项目的绝对路径(虚拟路径对应的绝对路径)
String getRealPath(AAA);
%>
以下四个对象在初阶段只需要了解就行
6.config:配置对象
7.pageContext :网页的属性是在这里管理
8.page:当前页面JSP对象(相当于java中的this)
9.exception:异常对象
## 五、JSP九大内置对象中的四种范围对象 #### 1.四种范围对象(从小到大)- pageContext(page对象) JSP页面容器:当前页面有效,页面跳转后无效。
- request 请求对象 :同一次请求有效,请求转发后无效(重定向有效)
- session 会话对象:同一次会话有效(无论怎么跳转都有效,关闭/切换浏览器或退出登录后无效)
- appliation 全局对象:全局有效(浏览器切换仍然有效,服务器关闭后无效)
2.共有方法
//根据属性名,设置属性值
Object getAttribute(String name);
//设置属性值(新增值,修改值)
//如果没有name值,则新建一个name,如果有name值,则将name改为obj
void setAttribute(String name,Object obj);
//根据属性名删除对象
void removeAttribute(String name)
注意:
1.以上4个范围对象,通过setAttribute
赋值,通过getAttribute
取值
2.以上范围对象尽量使用最小的范围,使用对象的范围越大,对性能造成的损耗就越大