在两个月之前我一直把 JavaScript 简写为 JSP,太丢人了。。。
配置文件就不加了
1.指令标识
(1)Page指令:定义整个JSP 页面的相关属性,这些属性在 JSP 中被服务器解析成 Servlet 是会转为相应的 Java 代码
Page 属性: ①language:设置 JSP 页面使用的语言
②extends:设置 JSP 页面继承的 Java 类,所有的 JSP 在执前都会被服务器解析成Servlet,不常用可能会影响服务器性能优化
③import:设置JSP导入的类包
④pageEncoding:定义JSP页面的编码格式,指定文件编码
⑤contentType:设置JSP页面的 MIME 类型和字符编码,浏览器会据此显示网内容
⑥session:该属性指定JSP页面是否使用 Http的Session 会话对象,属性值是 boolean 类型,默认值为 true
⑦buffer:设置JSP的out输出对象使用的缓冲区大小,默认8KB
⑧autoFlush:设置JSP页面缓冲区满时,是否自动刷新缓存,默认值为 true
⑨isErrorPage:设置当前JSP页面为错误处理页面,以处理另一个页面的错误
⑩errorPage:指定处理当前JSP页面异常错误的另一个JSP页面,前提必须设置JSP错误处理页面isErrorPage 为true,errorPage属性的属性值为一个url字符串
(2)Include指令:文件包含指令,通过该指令可以在一个JSP页面中包含另一个JSP页面,但是该指令是静态包含,被包含的文件的所有内容会被原样包含到该JSP页面中,即使被包含的页面有JSP代码,在包含时也不会被编译执行,不能有相同的变量名。
(3)taglib指令:可以通过taglib指令声明该页面中所使用的标签库,同时引用标签库,并指定标签的前缀
2.脚本标识
(1)JSP表达式:用于向页面中输出信息
语法:<%= 表达式 %>
注意:<% 与 = 之间不可以有空格,= 与其后面的表达式之间可以有空格。
(2)声明标识
语法:<%! 声明变量或方法的代码 %>
注意:<% 与 ! 之间不可以有空格,<%! 与 %>可以不在同一行。
通过声明标识定义的变量和方法可以被整个JSP 页面访问,所以通常使用该标识定义整个JSP页面需要引用的变量或方法。
说明:服务器执行JSP页面时,会将JSP页面转换为 Servlet 类,在该类中会把使用 JSP 声明标识定义的变量和方法转换为类的成员和方法。
示例代码:
<%!
int number =0;//声明全局变量
int count(){
number ++;
return number;
}
%>
通过上面的代码声明全局变量和全局方法后,在后面如果通过 <%= count() %>调用全局方法,则每次刷新页面,都会输出前一次值 +1 的值。
(3)脚本程序/代码片段
语法:<% Java代码或是脚本代码 %>
注意:所谓 代码片段 就是在 JSP 页面中嵌入 Java 代码或 脚本代码。代码片段将在页面请求的处理期间被执行。
1)通过 Java代码 可以定义变量或是流程控制语句等;
2)通过 脚本代码 可以应用JSP的内置对象在页面输出内容、处理请求和响应、访问session会话等。
说明:代码片段 与 声明标识的区别是,通过声明标识创建的变量和方法,在当前JSP页面中有效,它的生命周期是从创建开始到服务器关闭结束;
而代码片段创建的变量或方法,也是在当前JSP页面中有效,但它的生命周期是页面关闭后,就会被销毁。
3.动作标识
JSP共有以下6种基本动作
jsp:include:在页面被请求的时候引入一个文件,动态包含。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记
4.JSP内置对象
九个request、response、out、session、application、config、page、exception、pageContext
(1)request
类型:Javax.servlet.http.HttpServletRequest
描述:来自客户端的请求经Servlet容器处理后,由request对象进行封装。注:客户端和服务器的一次通信就是一次请求(发送请求或得到相应)。
作用域:request。说明,这次请求结束后,它的生命周期 就结束了。
重要方法:
getParameter(key) 获取提交表单的数据
getParameterValues(key) 获取提交表单的一组数据
request.getRequestDispatcher("list.jsp").forward(request,response) 转发(通过代码的方式进行转发)
request.setAttribute(key,object) 设置请求对象的属性
request.gettAttribute(key) 获取请求对象的属性
request.setCharacterEncoding("UTF-8") 对请求数据重新编码
(2)response
类型:Javax.servlet.http. HttpServletResponse
描述:它封闭了JSP 的响应,然后被发送到客户端以响应客户的请求。
作用域:page
重要方法:
response.sendRedirect("页面"):页面跳转。注意,之前的forward是转发,这里是跳转,注意区分。
response.setCharacterEncoding("gbk"):设置响应编码
(3)session
类型:Javax.servlet.http.HttpSession
描述:表示一个会话,用来保存用户信息,以便跟踪每个用户的状态。(不要用来保存业务数据,request)
定义:是指在一段时间内客户端和服务器之间的一连串的相关的交互过程。
作用域:session。
如果是第一次接触“会话”这个概念,需要重复一下。说白了,客户端与服务器之间可能需要不断地进行数据交互(请求与相应),这个过程就可以理解为一段回话。Tomcat默认的会话时间为30分钟,这段时间内如果没有交互,会话结束;下次客户端一旦发送请求,重新创建会话。当客户端第一次发送请求的时候,才会创建一个会话。session的生命周期比request长
重要方法:
session.getid():取得session的id号.id由tomcat自动分配。
session.isnew():判断session时候是新建的
session.setAttribute(key,object):往当前会话中设置一个属性
session.getAttribute(key):获取当前会话中的一个属性
session.removeAttribute(key):删除当前会话中的属性
session.setMaxInactiveInterval(1000*60*30):设置当前会话失效时间(ms) 。Tomcat默认的会话时间为30分钟。一般在web.xml中设置
session.invalidate():初始化当前会话对象(一般在推出的时候使用,可以删除当前会话的数据)
(4)out
类型:Javax.servlet.jsp.JspWriter
作用:主要用来向客户端输出数据
作用域:page。也就是说,每个页面都有一个自己的out对象。
重要方法:print()/println()/write() 向客户端页面输出数据
(5)pageContext
类型:javax.servlet.jsp.PageContext
描述:获当前JSP页面的其他内置对象。
作用域:page
(6)application
类型:javax.servlet.ServletContext
描述:从servlet配置对象获得的servlet上下文
作用域:application
这个对象的生命周期是最长的。服务器启动的时候就会创建application对象。从服务器存在到服务器终止,都一直存在,且只保留一个对象,所有用户共享一个application。不是很常用。
(7)config
类型:javax.servlet.ServletConfig
描述:本JSP的 ServletConfig
作用域:page
注:代表配置对象,基本用不到。
(8)page
类型:java.1ang.Object
描述:实现处理本页当前请求的类的实例(javax.servlet.jsp.HttpJspPage),转换后的Servlet类本身
作用域:page
(9)exception
类型:java.lang.Exception
描述:本JSP页面的异常对象
作用域:page
JSP常见错误状态码:
403:禁止访问。比如IP地址被拒绝,站点访问被拒绝等
404:找不到。没有找到文件或目录
500:服务器由于遇到错误而不能完成该请求,Web服务器太忙
5.Cookie和Session
(1)cookie
/*
* 登录检查,判断账号密码是否正确
* 相当于NETCTOSS中的MainServlet.login()
*
* Cookie 保存在浏览器上
* 多个请求可以共用一组cookie,多个Servlet 可以共用一组 cookie
* 每个用户(浏览器)访问服务器,都会获得一个 Cookie
*/
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
// 1.接收参数
String code = req.getParameter("code");
// 2.验证账号密码
// 3.转发或重定向
// 4.检查通过以后将账号存入cookie
// 每个 cookie 对象只能存一条数据,包括 key 和value,都是字符串
Cookie c1 = new Cookie("code", code);
Cookie c2 = new Cookie("city", URLEncoder.encode("上海", "utf-8")); // 处理中文乱码的问题
// 声明Cookie的生存时间:大于0 Cookie保存在客户端的时间, = 0 Cookie 被浏览器删除
// 一般用于记住密码
c1.setMaxAge(20);
// 设置 Cookie 的有效路径
c1.setPath("/JSPDemo5");
// 将cookie 发送给浏览器,浏览器接收带以后会自动保存
res.addCookie(c1);
res.addCookie(c2);
}
}
/**
* 模拟打开主页
* 相当于 NETCTOSS 中的 MainServlet.toIndex();
*/
public class IndexServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
// 向浏览器输出主页的内容(略)
// 获取 cookie
Cookie[] cs = req.getCookies();
// 见他们也输出给浏览器
if(cs != null) {
res.setContentType("text/html; charset = utf-8");
PrintWriter pw = res.getWriter();
for(Cookie c : cs) {
pw.println(c.getName() + ":" + URLDecoder.decode(c.getValue(), "utf-8"));
}
pw.close();
}
}
}
(2)session
/**
* 浏览器第一次访问服务器时,服务器会给他创建一个 Session
* 服务器会适应 Cookie将 SID 返回给浏览器,浏览器再次访问 服务器时会传入 SID
* 多个请求可以共用同一个 session
* 多个Servlet 可以共用一个session
*服务器会给每个浏览器创建一个session
*/
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
// 接收账号
String code = req.getParameter("code");
// 存入 Session
// Session 是存储在服务器上的对象,他的内部可以存储任意类型的数据
HttpSession session = req.getSession();
session .setAttribute("code", code);
// 响应时服务器会自动创建 Cookie,将 session 的id 通过Cookie 发送给浏览器
// Cookie c = new Cookie("JSESSIONID", session.getId());
}
}
public class IndexServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
// 由于本次请求浏览器传入了SID, 服务器就根据 SID 找到那个旧的 Session,可以从中读取之前存的数据
HttpSession session = req.getSession();
String code = (String) session.getAttribute("code");
// 将此数据显示给浏览器
res.setContentType("text/html; charset=utf-8");
PrintWriter pw = res.getWriter();
pw.println(code);
session.removeAttribute("code"); // 移除指定的 session 对象,要保证该对象有效,否则会抛出异常
session.invalidate(); // 手动销毁 session
pw.close();
}
}