脚本、指令、注释、JSP九大内置对象解析及其使用


最近在复习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)

页面跳转重定向可能会导致数据丢失,最好用请求转发
下面用一个表格来看看重定向与请求转发有何区别

请求转发重定向
地址栏是否改变不变改变
是否保留第一次请求时的数据
请求的次数12
跳转发生的位置服务端客户端发出的二次跳转
安全性较安全较不安全
保存的内容ObjectString
4.session:会话对象

讲session之前,我们先来看看Cookie
cookie通俗点讲,相当于本地缓存的作用。
作用:提高访问服务端的效率,但是安全性较差。

先看看两者的一些区别

Cookieseesion
不是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=JSEEIONIDvalue=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.以上范围对象尽量使用最小的范围,使用对象的范围越大,对性能造成的损耗就越大

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值