定义:jsp(java server pages)是javaweb服务端的动态资源,与html作用是相同的,显示数据和获取数据。
组成:jsp组成 = html+Java脚本+jsp动态标签
jsp脚本就是Java代码段,分为三种:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
JSP演示
JSP演示
<%
// Java语句
String s1 = "hello jsp";
// 不会输出到客户端,而是在服务器端的控制台打印
System.out.println(s1);
%>
输出变量:<%=s1 %>
输出int类型常量:<%=100 %>
输出String类型常量:<%="你好" %>
使用表达式输出常量是很傻的一件事,因为可以直接使用html即可,下面是输出上面的常量:
100
你好
内置jsp对象out;out对象在jsp’页面无需创建就可以使用,他的作用是用来输出客户端。
<%
out.print("你好!");//向客户端输出,与<%=...%>功能一样
%>
jsp是一种特殊的servlet,当jsp首次被访问时,容器(tomcat)会先把jsp编译成servlet,再去执行servlet。所以jsp就是servlet。jsp生成的servlet都在work目录下。
jsp一共三种形式
<%!..%>,jsp就是一个servlet,<%!..%>他的作用就是在类中添加方法或成员的。所以他不会出现在_jspService()中。
<%!
String name="zahngsan ";
public String hello(){
return "hello";
}
%>
jsp是预先编译成.java,然后编译成.class,其中<%–…--%>的内容在jsp编译成.java时会被忽略。即jsp注释。也可以使用html中的注释。会被编译,但浏览器不显示。
可以把会话理解为客户端与服务端的一次交互行为。在一次交互行为中可能会包含多次请求和响应。在javaweb中,客户向某个服务器发出第一个请求会话就开始了,直到关闭浏览器会话结束。
在一个会话的多个请求中共享数据,这就是会话跟踪技术。例如在一个会话中的请求如下:
l 请求银行主页;
l 请求登录(请求参数是用户名和密码);
l 请求转账(请求参数与转账相关的数据);
l 请求信誉卡还款(请求参数与还款相关的数据)。
在这上会话中当前用户信息必须在这个会话中共享的,因为登录的是张三,那么在转账和还款时一定是相对张三的转账和还款!这就说明我们必须在一个会话过程中有共享数据的能力。
cookie就是一个键和一个值构成的,随着服务端响应发送给客户端浏览器,然后客户端浏览器会把cookie保存起来,当服务器下一次访问服务器的时候把cookie再发送给服务器。
cookie是由服务器创建的,再通过响应发送给客户端的一个键值对。客户端会保存cookie,并标注cookie来源。再次请求时发给服务器,这样服务器就可以识别浏览器了。
规范:
cookie是通过http请求和响应头在客户端传递的。
cookie:请求头,客户端发送给服务器端
格式:Cookie:a=A;b=B;c=C;多个cookie使用分号隔开。
set—cookie:响应头,服务器端发送给客户端
一个cookie对象一个set-Cookie:
Set-Cookie:a=A
Set-Cookie:b=B
Set-Cookie:c=C
如果服务端发送重复的cookie,就会覆盖原有的cookie。
Cookie不只是有name和value,Cookie还是生命。所谓生命就是Cookie在客户端的有效时间,可以通过setMaxAge(int)来设置Cookie的有效时间。
1.cookie.setMaxAge(-1):cookie的maxAge属性的默认值就是-1,表示只在浏览器内存中存活。一旦关闭浏览器窗口,那么cookie就会消失。
2.cookie.setMaxAge(60*60):表示cookie对象可存活1小时。当生命大于0时,浏览器会把Cookie保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie也会存活1小时;
3.cookie.setMaxAge(0):cookie生命等于0是一个特殊的值,它表示cookie被作废!也就是说,如果原来浏览器已经保存了这个Cookie,那么可以通过Cookie的setMaxAge(0)来删除这个Cookie。无论是在浏览器内存中,还是在客户端硬盘上都会删除这个Cookie。
javax.servlet.http.httpsession接口表示一个会话,我们可以把一个会话内需要共享的数据保存到httpsession中。
HttpServletRequest和ServletContext是域对象。他们三个是servlet中可以使用的域对象。
下载时session的域方法:
1.void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:session.setAttribute(“xxx”, “XXX”),在session中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;
2.Object getAttribute(String name):用来获取session中的数据,当前在获取之前需要先去存储才行,例如:String value = (String) session.getAttribute(“xxx”);,获取名为xxx的域属性;
3.void removeAttribute(String name):用来移除HttpSession中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;
4.Enumeration getAttributeNames():获取所有域属性的名称;
当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的session的id(一个cookie中保存了sessionId)。客户端带走的是sessionId,而数据是保存在session中。
当客户端再次访问服务器时,在请求中会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session。
session保存在服务器,而sessionId通过Cookie发送给客户端,但这个Cookie的生命不-1,即只在浏览器内存中存在,也就是说如果用户关闭了浏览器,那么这个Cookie就丢失了。
当用户再次打开浏览器访问服务器时,就不会有sessionId发送给服务器,那么服务器会认为你没有session,所以服务器会创建一个session,并在响应中把sessionId中到Cookie中发送给客户端。
你可能会说,那原来的session对象会怎样?当一个session长时间没人使用的话,服务器会把session删除了!这个时长在Tomcat中配置是30分钟,可以在${CATALANA}/conf/web.xml找到这个配置,当然你也可以在自己的web.xml中覆盖这个配置!
web.xml
30
session失效时间也说明一个问题!如果你打开网站的一个页面开始长时间不动,超出了30分钟后,再去点击链接或提交表单时你会发现,你的session已经丢失了!