1. JSP状态管理
http协议的无状态性:简单来说就是服务器无法保存客户端的状态。Web服务器跟踪客户状态的四种方法:a. 建立含有跟踪数据的隐藏字段;b. 重写包含额外参数的URL;c. 使用持续的Cookie;d. 使用Session(会话)机制,安全性比Cookie高。
Cookie:中文名称为“小甜饼” ,是Web服务器保存在客户端的一系列文本信息。Cookie的作用:对特定对象的追踪;保存用户网页浏览记录与习惯;简化登录;安全风险:容易泄漏用户信息。
Cookie的创建与使用:
创建Cookie对象
Cookie newCookie = new Cookie(String key,Object value);
写入Cookie对象
response.addCookie(newCookie);
读取Cookie对象
Cookie[] cookies = request.getCookies();
Cookie的类型:
a. 持久性cookie:会被存储到客户端的硬盘上
b. 会话cookie:不会存储到客户端的硬盘上,而是放在浏览器进程所处
的内存当中,当浏览器关闭则该会话cookie就销毁了。
Cookie与Session的区别:
2. JavaBean
符合某种特定的规范的Java类。JavaBean是一种可重复使用、且跨平台的软件组件。使用javabeans的好处是解决代码重复编写,减少代码冗余,功能区分明确,提高了代码的维护性,Javabean既可以封装数据同时也可以封装业务逻辑。JavaBean分为两种:一种是有用户界面(UI,User Interface)的JavaBean;一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。
Javabean的设计原则:公有类,无参的公有构造方法,属性私有,getter和setter方法。
Javabean的四个作用域范围(从小到大):
说明:使用useBeans的scope属性可以用来指定javabean的作用域范围
page:仅在当前页面有效(默认值)
request:共享同一个请求的网页,可以通过HttpRequest.getAttribute()方法取得javabean对象,请求范围
session:可以通过HttpSession.getAttribute()方法取得javabean对象,会话范围
application:用于整个web应用生命周期内,可以通过application.getAttribute()方法取得javabean对象,范围最大,全局
在JSP页面中使用JSP动作标签来使用JavaBean:
1 <!--在jsp页面中实例化或者在指定范围内使用javabean--> 2 <jsp:useBean id="标识符" class="java类名" scope="作用范围" /> 3 <!--给已经实例化的javabean对象的属性赋值,*表示javabean跟表单提交的信息进行匹配,匹配上则赋值,匹配所有值--> 4 <jsp:setProperty name="javabean实例名" property="*" />(跟表单关联) 5 <jsp:setProperty name="javabean实例名" property="javabean属性名" />(跟表单关联单个值) 6 <jsp:setProperty name="javabean实例名" property="javabean属性名" value="beanValue" />(手工设置) 7 <jsp:setProperty name="javabean实例名" property="propertyName" param="request对象中的参数名" />(跟request参数关联) 8 <!--获取指定javabean对象的属性值--> 9 <jsp:getProperty name="javabean实例名" property="属性名" />
3. EL表达式
EL默认对象:
pageContext -- pageContext对象; pageScope -- 包含了页面属性和它们值的map; requestScope -- 包含了request属性和它们值的map;
sessionScope -- 包含了session属性和它们值的map; applicationScope -- 包含了application属性和它们值的map;
param 包含了request parameters属性和它们单一值的map; paramValues -- 包含了request parameters属性和它们相应的字符串数组的值的map; header
headerValues cookie
-、 *、/或者div、 %或者mod;
EL比较运算符:
| 描述 | 运算符 |
| Equals | == and eq |
| Not equals | != and ne |
| Less than | < and lt |
| Greater than | > and gt |
| Less than or equal | <= and le |
| Greater than or equal | >= and ge |
EL逻辑运算符:
| 描述 | 运算符 |
| and | && and and |
| or | || and or |
| not | ! and not |
EL表达式举例:
1 <!--书写javaBean的属性--> 2 ${bean.attribute} 3 <!--书写请求的参数--> 4 ${param.attribute_name} == request.getParameter("attribute_name") 5 <!--书写session中的值--> 6 ${sessionScope.attribute_name} == session.getAttribute("attribute_name") 7 ${sessionScope.person.attribute_name} == ${sessionScope.person["attribute_name"]}
Warning:当要调用的属性名称中包含一些特殊字符,如.或-等并非字母或数字的符号,就一定要使用[],${username} 当我们没有指定范围时,它的默认值会先从Page范围找,找不到,再依次到Request、Session、Application范围。假如找到就直接回传,不再继续找,但是都没找到就回传null。
4. 自定义标签
自定义标签的创建步骤:
a. 创建标签的处理类(必须继承以下两个类之一:javax.servlet.jsp.tagext.TagSupport或者javax.servlet.jsp.tagext.BodyTagSupport),重写doStartTag()方法或者doEndTag()方法
Tips:prefix指代是标签库。
创建自定义标签的处理类示例:
1 import java.io.IOException; 2 import javax.servlet.jsp.JspException; 3 import javax.servlet.jsp.tagext.TagSupport; 4 5 public class MyTag extends TagSupport 6 { 7 @Override 8 public int doStartTag() throws JspException 9 { 10 try 11 { 12 pageContext.getOut().println("hello world"); 13 } 14 catch (IOException e) 15 { 16 e.printStackTrace(); 17 } 18 19 return EVAL_BODY_INCLUDE; 20 } 21 22 @Override 23 public int doEndTag() throws JspException 24 { 25 try 26 { 27 pageContext.getOut().println("welcome"); 28 } 29 catch (IOException e) 30 { 31 e.printStackTrace(); 32 } 33 34 return EVAL_PAGE; 35 } 36 37 }