JSP笔记

在两个月之前我一直把 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():初始化当前会话对象(一般在推出的时候使用,可以删除当前会话的数据) 

4out

类型: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

9exception

类型: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();
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值