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
EL数据运算符:+、-、 *、/或者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()方法
b. 创建标签库描述文件,将文件存放在WEB-INF文件夹下;
c. 在JSP中使用<%@taglib uri = "" prefix="" %>引入标签库,在页面中插入标签,例如:<mm:hello/>
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 }
创建标签库的描述文件(*.tld)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> 3 4 <taglib> 5 6 <tlib-version>1.0</tlib-version> 7 <jsp-version>1.1</jsp-version> 8 <short-name>myTag</short-name> 9 <uri>/myTag</uri> 10 11 <tag> 12 <name>firstTag</name> 13 <tag-class>com.MyTag</tag-class> 14 <body-content>empty</body-content> 15 </tag> 16 </taglib>
在JSP中引入标签库
1 <%@ taglib uri="/mytaglib" prefix="mm" %>
在标签的处理类中,标签的处理方法是doStartTag()方法或者doEndTag()方法,下面来说说它们:
当Servlet容器遇到自定义标签的起始标志,就会调用doStartTag()方法。 doStartTag()方法返回一个整数值,用来决定程序的后续流程。它有两个可选值: Tag.SKIP_BODY 或者Tag.EVAL_BODY_INCLUDE;Tag.SKIP_BODY表示标签之间的内容被忽略,Tag.EVAL_BODY_INCLUDE表示标签之间的内容被正常执行。
当Servlet容器遇到自定义标签的结束标志,就会调用doEndTag()方法。doEndTag()方法也返回一个整数值,用来决定程序后续流程。它有两个可选值: Tag.SKIP_PAGE 或者Tag.EVAL_PAGE;Tag.SKIP_PAGE表示立刻停止执行JSP网页,网页上未处理的静态内容和JSP程序均被忽略,任何已有的输出内容立刻返回到客户的浏览器上。Tag.EVAL_PAGE表示按正常的流程继续执行JSP网页。
用户自定义的标签还可以定义自己的属性:在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法。
5. MVC模式
M—Model模型,V—View视图,C—Controller控制器),View视图负责页面展现,Controller控制器(Servlet)负责控制该调用什么方法,Model模型(各种java类)负责处理事务逻辑。页面中的数据来自于模型。