----------------------------------------↓↓↓↓↓↓↓Cookie使用细节↓↓↓↓↓↓↓------------------------------------------------
Cookie使用细节;
1.Cookie是键值对
◆ 2.Cookie只能是String类型的
3.Cookie设置最大化时间在设置为0
或者是负数时查看一下浏览器支持,
因为有一些是设置0则为永久,有一些浏览器是负数则为永久
4.一般一个网站只能发送20个Cookie
◆ 5.Cookie限制在4KB
6.一般浏览器只能存放300个Cookie
———————■■■■■■■■■■■■■■■===↓↓↓↓↓Servlet会话技术 —— HttpSession↓↓↓↓↓↓↓↓===■■■■■■■■■■■■■■■■■■——————————————————
HttpSerlvet;
为什么要有?
服务器怎么保存用户数据?
服务器怎么辨别是某一个用户登录?
是什么?
HttpSession是Servlet_API的一个独立接口,是一个服务器端会话技术
也是一个域对象
作用;
用于用户保存数据到服务器中
客户端与服务器的交互。
将会话封装成一个HttpSession对象
维护客户端和服务器之间的进程
特点;
1.必须手动创建
2.Id是唯一的
3.还是基于Cookie实现
4.是一个域对象
5.只有2个set方法( setMaxInactiveInterval(S) ,setAttribute("string",object))
------------------------------↓↓↓↓↓↓↓HttpSession运行过程↓↓↓↓↓↓↓------------------------------------------------
HttpSession运行过程;
1.客户端访问服务器
2.服务器执行request.getSession();方法则创建一个Session对象
●生成一个Id序列号,作为一个值添加到Cookie中发送出去
●将这个序列号保存到服务器内存中
3.客户端浏览器没有关闭继续访问这个项目资源
●获取到请求数据的Id
●获取到在内存保存的Id
●判断是否一样
------如果是一样则···不···创建一个新的对象
------如果是不一样则···创建···一个新的对象
5.客户端浏览器关闭,在打开访问则会创建一个新的对象
●客户端浏览器没有携带任何的Cookie信息
6.默认的存活时间是30分钟,
30分钟后这个Session对象对应的用户Id没有进行
任何的访问服务器的操作则会调用invalidate()方法销毁这个对象
◆注;一个HttpSession是由N个request组成的
只要执行到request.getSession()方法则会自动创建一个Session对象,
前提是第一次访问,或者是关闭了浏览器再次进行一个访问的情况下。
------------------------------↓↓↓↓↓↓↓HttpSession创建对象方式↓↓↓↓↓↓↓------------------------------------------------
HttpSession创建对象方式;
方式一;
HttpSession s = request.getSession();
说明;
可以获取到Session信息和创建对象
方式二;
HttpSession s = request.getSession(true);
说明;
和方式一的作用一样
方式三;
HttpSession s = request.getSession(false);
说明;
不会创建新的对象,只能获取
------------------------------↓↓↓↓↓↓↓HttpSession使用流程以及方法↓↓↓↓↓↓↓------------------------------------------------
HttpSerlvet使用流程及方法;
1.创建HttpSession对象
HttpSession hs =request.getSession();
◆◆◆注;如果构造器形参是false的那么则不会创建Session对象只可以获取到Session的属性
2.设置属性
hs.setAttribute("string","object");
3.设置最大存活时间
默认的存活时间是30分钟,
30分钟后这个Session对象对应的用户Id没有进行
<---任何的访问服务器的操作则会调用Invalidate()方法
|------>销毁这个对象。
hs.setMaxInactiveInterval(M); --- 分钟
可以通过设置配置文件设置最大存活时间也可以
4.获取到所有的属性
Enumeratrion em =hs.getAttributeName();
5.获取到某一个属性
String s =hs.getAttribute("name");
6.获取到最大存活时间
String s = hs.getMaxInactiveInterval();
7.销毁对象
hs.invalidate()
------------------------------↓↓↓↓↓↓↓HttpSession在web.xml文件的配置↓↓↓↓↓↓↓------------------------------------------------
HttpSession在web.xml文件的配置;
<session-timeout>分钟
◆注;在web.xml的文件配置中是一个全局的变量
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■↓↓↓↓↓↓JSP↓↓↓↓↓↓↓↓■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
JSP;
为什么要有?
1.使用Servlet操作响应信息并且要将响应后的结果显示到客户端浏览器页面,
不便于编写JS,CSS等其余脚本代码,并且在写的时候容易出错,
更改困难,不便于排错等。。。。。。。。。。。。。。。
是什么?
JSP就是Servlet,本质就是java代码。
只是与Servlet表现形式不一样,
是与HTML,CSS,JS等一起写在同一个文件中。
作用;
JSP主要是为了便于显示业务逻辑处理后的结果,
因为是与HTML,CSS,JS等。。。一起写在同一个文件中
那么便于排错,更改等。。。。
特点;
JSP文件后缀是*.jsp
JSP可以嵌套HTML代码
JSP可以写Java代码,因为本质就是一个*.java文件
JSP内置了四大域对象,九大常用对象
JSP继承HttpJspBase类的
-------------------------------↓↓↓↓↓↓↓JSP与Servlet的关系和区别↓↓↓↓↓↓↓------------------------------------------------
JSP与Servlet的关系;
JSP就是Servlet,只是表现的形式不一样而已
JSP和Servlet是一个互补的关系。
JSP不利于操作业务逻辑信息
Servlet不利于显示逻辑业务处理结果
JSP与Servlet的区别;
Serlvet;
用于获取请求信息
处理业务处理逻辑
将数据保存到域中
JSP;
将Servlet处理好的业务逻辑结果···显示···在客户端浏览器中
-------------------------------------------↓↓↓↓↓↓↓JSP运行原理↓↓↓↓↓↓↓----------------------------------------------------
JSP运行原理;
1.客户端浏览器访问Tomcat服务器资源
2.Tomcat服务器获取到客户端访问信息,
使用Servlet处理好业务逻辑,跳转到JSP文件
3. JSP将从域中获取到处理后的业务逻辑则会显示到页面中
●Tomcat服务器获知这个跳转的地方是一个*.jsp文件
●Tomcat服务器会将这个*.jsp解析成一个*.java文件
●Tomcat服务器将解析好的*.java文件进行一个编译
●Tomcat服务器在将这个编译好的*.class文件响应给客户端浏览器
●并且将这个响应的信息显示在客户端浏览器页面
◆Tomcat内部运行过程;原(*.jsp)-----> 解析(*.java)----->编译(*.class)----->运行(客户端浏览器页面)
------------------------------------------↓↓↓↓↓↓↓JSP解析后*.java文件↓↓↓↓↓↓↓----------------------------------------------------
JSP解析后的*.java文件;
在JSP中是内置了四大域对象和九大常用对象,所以在JSP文件中可以调用
在JSP文件解析成*.java文件之后,
只要不是使用JSP语法编写的代码都会转换成Servlet的书写
而是使用JSP语法编写的代码不会有任何改变的。。。。。
在JSP文件中处理指令时不会在文件中的,而会转换成Servlet的编写,
如;编码的设置,导包等一系列处理指令。。。。。。。。。。
四大域对象;
application ----- 全局
session ----- 会话
request ----- 只在当前请求有效,要获取要进行转发
page ----- 只是在当前页面有效,
◆ 主要;获取其他的对象
九大对象;
application -----ServletContext
session -----HttpServlet
request -----HttpServletRequest
pageContext ----- 在Servlet包中是没有的,这个域对象是JSP文档特有的
page ----- this
out ----- request,getWriter
exception ----- Exception
config ----- ServletConfig
response ---- response
◆◆◆◆◆◆注;在JSP中因为是内置对象,所以在用户访问JSP页面的时候就会自动创建了Session对象
-----------------------------------------------↓↓↓↓↓↓↓JSP语法↓↓↓↓↓↓↓----------------------------------------------------
JSP语法;
1.脚本代码;
<% …… java代码%>
说明;
1.用于写java代码
2.代码注释只能是java的单行和多行注释其余不行
3.可以写多行代码
4.变量是一个局部变量
5.不可以写方法因为在解析本.java文件中就是一个service方法
6.可以有输出语句
2.表达式;
<%= …… %>
说明;
1.是输出的表达式
2.是不可以定义变量的,只能引用在<% …… %>定义好的
3.只能写一行代码
4.可以是调用方法输出方法中的数据
5.不可以有输出语句
6.代码注释只能是java的单行和多行注释其余不行
3.声明
<%! …… %>
说明;
1.是用于定义方法和全局变量的
2.不可以有输出语句,只能在方法中输出
3.定义的方法,变量
4.代码注释只能是java的单行和多行注释其余不行
4.注释;
<%-- …… --%>
说明;
只能在HTML代码中,不能再JSP声明表达式脚本代码等写这个注释
JSP特有的注释是客户端浏览器不可见的 而HTML的注释是客户端浏览器可见的
在解析成*.java文件的时候会忽略特有的JSP注释
5.处理指令;
<%@ …… %>
1.处理指令是用于告知Tomcat服务器是要如何操作这个文档的,
以及这个文档不能有什么等。。。。。
如;这个文档不不能写EL表达式等...
2.处理指令时不可见的输出的,是不会输出到浏览器
3.处理指令时不会原样的存在解析后的*.java文件的
page;
定义页面属性。。。。。。
page常用属性;
language="java" --- 声明这个文件可以使用什么语言进行编写
import = "java.util.*"
--- 是用于导包
注;导包一般都是创建一个新的page便于维护的和排错等
······可是可以在一个page的import属性中同时导入多个包
······如果是同时导入多个包则使用 ( , )进行分隔
◆ 不可以使用( ; )进行导包的分隔会报错
contentType="text/html;
charset=UTF-8" --- 设置文档的输出编码集,
比pageEncoding优先级◆···高
pageEncoding="UTF-8" --- 设置文档的解析成*.jsp编码集,
比contentType优先级◆···低
buffer="8kb" --- 默认是8K,这缓存是用于输出的缓存。。。后续out
|----> errorPage="_03_00_Jsp_ProcesssingInstruction_Instroduce.jsp"
|
|----------------->是设置当页面出现错误的时候跳转到一个错误的页面
◆而这个错误是只是作用在Jsp脚本代码的
这个跳转是一个内部的跳转,不是重定向是转发
isErrorPage="true" --- 设置是否是一个错误页面,默认是false
=== 如果设置为一个错误页面,
那么则可以调用exception对象,
来获取到异常,或者抛出。
session="true" --- 设置是否为每一个访问的用户都创建一个会话,
默认是true
◆ 可以通过设置这个session为false来优化页面访问
autoFlush="true" --- 设置是否自动刷新,默认是true
isELIgnored="false" --- 是否忽略EL表达式,默认是false
isThreadSafe="false" --- 是否是线程安全的,默认是true,
也保证了Servlet的单例规范
代码;
<%@ pageimport="java.lang.*,java.util.*">
◆注;每一个JSP必须有一个page指令用于定义这个*.jsp文件的信息定义等。
一个JSP文档中可以有多个page指令,但是在设置属性时不要冲突。
多个page处理指令基本都是导包的时候用的。。。。。。。
include;
是用于页面静态包含的。
是用于进行一个预定义页面的引用,而这个是一个静态的包含其他页面
因为在页面中有N个位置时一样的,那么就没有必须要每次都要写,
只需要引用其他页面,提高效率
特点;将所需要的页面进行一个合并了在进行一个解析之后在进行编译运行
弊端;在合并的页面不要写HTML文档的结构标签,如,html。。。
因为如果写了那么会造成有有个标签那么就违反了规范了
|-----------include--------->
● 可以使用被合并的文件标签数据等。。。。。。。
|
|
| 代码;
| <@%include file="path" %>
|
| ◆注;一个JSP文档中可以有多个include处理指令,
| 因为可以会有多个页面要合并
|
|
|
| taglib;
| 是用于引用标签库的文件。
| 代码;
| <%@ taglib uri="文件对应的uri" prefix="文件的标签标识"%>
|
|
|
| ◆注;pageEncoding是jsp文件本身的编码
| contentType的charset是指服务器发送给客户端时的内容编码
|
|
|
|
|
|
|
|
--------|--------------------------------↓↓↓↓↓↓↓JSP常用内置标签↓↓↓↓↓↓↓----------------------------------------------------
|
|
| Jsp常用标签;
| 为什么要有?
| 在JSP规范中要求尽量要少出现Java代码,
|
| 1.Jsp是用于显示页面的,不是进行处理业务逻辑的
|
| 2.Jsp文件要是要进行解析-编译-运行
| 如果Java代码太多会导致解析,编辑等效率下降,因为是显示在浏览器的
|
| 所以SUN公司为 Jsp设计了一部分的标签,便于使用
|
|
|
| 语法;
| 1.<jsp:标签名 …… ></jsp:标签名>
| 2.<jsp:标签名…… />
|
|
| 常用标签;
| 1、<jsp:include
page="文件路径"></jsp:include>----- 用于动态包含
|
| 说明;合并的文件是分开的,
| 如果被引用的页面代码太多了
| 会先显示当前页面的代码
|
--------include--------->
● 无法使用被合并文件的数据等。。。。。。。
2、<jsp:forward
page="转发路径"></jsp:forward>
----- 用于跳转
说明;是一个···转发的跳转···
不是重定向,注意转发和重定向的区别。
3.
说明;这个是设置一个属性,
● 这个是必须要和forward标签一起使用,不可以单独使用。
◆◆◆◆◆注;Jsp语法内置标签,也叫● Jsp动作标签●
--------------------------------------------↓↓↓↓↓↓↓JSP —— EL表达式↓↓↓↓↓↓↓----------------------------------------------------
EL表达式;
因为Jsp的规范中尽量不要写Java代码,
那么获取到Servlet.java文件处理完成的
业务逻辑结果显示到页面那么只能通过EL表达式获取
主要是用于···计算···和···获取到域数据···逻辑判断
所以一般处理好的业务逻辑都是会存放到域中的。
◆注;在EL表达式不可以写在注释里,会报错
-----------------------------------------↓↓↓↓↓↓↓JSP —— EL表达式_语法↓↓↓↓↓↓↓----------------------------------------------------
EL表达式语法;
${ …… }
◆注;EL表达式的语法不可以写在注释里,要使用字符分隔否则会报错
--------------------------------------------↓↓↓↓↓↓↓JSP —— EL表达式_应用↓↓↓↓↓↓↓----------------------------------------------------
EL表达式;
EL获取到域的值;
{ 内置对象.属性名}
{ 属性名}
EL表达式中改变了域的名称。
page ----- pageScope
request ----- requestScope
session ----- sessionScope
application ----- applicationScope
代码;
1、通过内置对象获取到域的name对应的值
${ pageScope.a }
${ requestScope.b }
${ sessionScope.c }
${ application.d }
2.直接获取到name对应的值 --- 不指定域
${ c }
说明;直接获取没有指定域获取的话,
默认是按照从一个范围的小到大获取
如果在一个范围中获取到了,那么则直接返回值
3.获取到单列集合的值
${ name(键)[num] }
--- 获取到集合的某一个值
${ request.sett[0]} --- 获取到request域中集合的第一个值
${ name(键) }
--- 获取到整个集合
${ sett } ----- 获取到整个集合
4.获取到双列集合的值
${ name.集合key }
----- 获取到Map集合指定的key的值
${ request.map.a } ----- 获取到request域key为a 的值
${ name } ----- 获取到整个双列集合(是一个内存地址)
${ map } ----- 获取到整个双列集合
5.获取到对象
${ name } ----- 获取到这个类的对象
${ request.student} ----- 获取到request域的学生对象
${ name } ----- 获取到某一个域的key的对象
${ student } ------ 获取到某一个域key的student对象
6.获取到方法的值
类;studen 属性 name 方法getName()
${ request.student.name } ------ 获取到request域的学生名字
${ stdent.name } ----- 获取到某一个域的学生的名字
◆◆◆注; 在EL表达式中要获取方法的值,
这个方法必须是无参的,而且是没有返回值的,一般都是get方法
在EL表达式中调用这个方法是不加get
◆ 直接属性名小写
◆◆◆◆◆◆注;在EL表达式中是可以使用三元运算符的,
因为EL表达式本质就是java代码,
而且EL表达式的用途包括逻辑判断的。。。。。。
但是EL表达式无法使用if等语句。。。。。。
但是三元运算也是逻辑判断的,
而且是符合EL表达式的要求的。
-------------------------------↓↓↓↓↓↓↓JSP —— Out和PrintWriter区别↓↓↓↓↓↓↓----------------------------------------------------
Out和PrintWriter区别;
在JSP中的Out对应的Servlet对象是response.getWriter
JSP的Out是带有缓冲功能的写出,
先将页面加载到缓存中在一起写出。
Out写出的时机;
1.页面加载完成
2.缓存满了
◆注;默认的缓存是8KB,可以通过修改page处理指令的buffer属性来修改缓存
如果修改的缓存为0KB的话,那么当前页面的Out对象则失去缓存功能
response.getWriter是没有缓存的加载到一条则直接写出。
相同;都是写出功能
◆◆◆注;response.getWriter获取到的对象和Out是一样的都是JspWriter,
只不过reseonse.getWriter进行了封装,都是指向JspWriter
——————————————————————■■■■■■■■■■■■■■■===↓↓↓↓↓JSP —— 自定义标签↓↓↓↓↓↓↓↓===■■■■■■■■■■■■■■■■■■—————————————————————
Jsp自定义标签;
为什么要有?
JSP的自定义标签是为了取代JSP页面的Java代码,
而Jsp自带的标签有时根本就满足不了需求,
所以要根据需求进行定义相关的标签。
因为JSP页面的Java代码不便于维护,而且使得JSP页面的简洁性差,
维护困难,因为如果前端在进行定义样式等一系列的页面布局的时候
JSP页面的Java代码过多的话,不便于后期的维护,而且在维护
期间可能出现不小心删除美工代码等。。。。。。
是什么?
JSP自定义标签本质就是一系列的Java代码
作用;
取代JSP页面的Java代码,如同EL表达式取代JSP表达式<%=……%>
使得JSP页面变得简洁,提高维护性等。。。。。
特点;
本质还是Java代码
需要建立*.tld文件做关联
标签是有一个声明的
-------------------------------------------↓↓↓↓↓↓↓JSP开发步骤↓↓↓↓↓↓↓----------------------------------------------------
JSP开发步骤;
1.创建一个类继承SimpleTagSupport类
2.调用这个类的doTag()方法
3.在doTag()方法内部写业务逻辑处理代码
a.当前继承的对象通过父类的方法获取到PageContext对象
可以通过PageContext获取到其他八大类对象,或者设置其他域的属性。
代码; 因为获取到的是父类的
PageContext pc =(PageContext)this.getContext();
4.创建一个*.tld文件,
在这个文件的里定义文件关联标签名,
以及定义这个标签类对应的标签名。
5.在JSP文件中导入
代码;
<@% taglib uri="*.tld文件对应的" prefix="*.tld文件标签名"%>
<@% tagliburi="http://www.baidu.com" prefix="bd"%>
6.在JSP文件调用
代码;
<tld文件标签名:类标签名>
-------------------------------------↓↓↓↓↓↓↓JSP自定义标签的执行过程↓↓↓↓↓↓↓----------------------------------------------------
JSP自定义标签的执行过程;
一、解析;
1.Tomcat服务器启动,
就会自动加载WEB-INF下
的web.xml和*.tld文件到内存中。
2.客户端访问JSP文件页面
3.服务器解析JSP文件,解析到这个自定义标签的时候
4.检查这个标签是否来自于自定义标签
则会检查这个JSP文件的taglib标签库声明
a)不是则会报错
5.是来自标签库的则会查找内存中
是否有*.tld文件的uri标签
和JSP文件声明的uri是一致的
以及声明的文档标签声明
是否是一样的。。。。。。
a)不一致则报错
5.一致则会获取到这个标签对应的标签类
6.创建对象,调用doTag()方法
◆◆◆注;一个标签对应则的是一个类
因为都是调用doTag()方法
而每一个类的继承都只有一个doTage()方法
----------------------------------------↓↓↓↓↓↓↓JSP —— *.tld文件书写↓↓↓↓↓↓↓----------------------------------------------------
*.tld文件书写;
方式一;在Tomcat服务器查找*.tld文件,将这个文件的信息拷贝过去
方式二;手写
<!-- 根标签-->
<!-- tld文件版本声明-->
1.0
<!-- Jsp文件版本声明-->
1.2
<!-- 设置本*.tld文档的标签声明-->
itcast
<!-- 设置文档的标记信息,
在整个Tomcat资源下的tld文件是的uri标签内容是唯一的-->
http://asdf
<!-- 设置标签-->
<!-- 标签名-->
my
<!-- 设置标签的对应类的全路径-->
<tag-class>包名+类名
<!-- 设置输出的格式-->
|---------------设置输出格式--------------> ……
|
| <!-- 设置属性-->
|
| <!-- 属性名-->
|
|
| <!-- 设置这个属性是否必须写的
| 设置为false则是可以···写可不写···
| 设置为true则是··必须··写上这个属性-->
| boolean
|
| <!-- 设置是否支持EL表达式,布尔类型-->
| boolean
|
|
|
|
|
|-----> 设置输出的格式;
1.jsp --- 这个只能用在JSP1.0的版本,
标签内容可以写java代码和起作用
这个违反了JSP页面的规范,所以不到极端不使用。。。。。。
2.scriptless --- 标签内容不能写java代码,会报错
a)在scriptless中标签的内容
不可以是纯字符或纯数字
必须和字母或中文一起使用
3.tagdependent --- 标签的内容可以写java代码,但是不会其作用,会原样的输出
4.empty --- 标签内容是空的,这个标签是一个空标签
◆◆重◆注;
所有的标签属性都是标签类的成员变量,
◆ 而这个成员变量必须要提供set方法,
否则会出现报错的情况,
因为在调用时类都是遵循封装性的,
而在JSP页面调用都是不需要加上set,
◆ 直接小写的属性名就可以了。
代码;
标签类;setName()
调用;name
-------------------------------------------↓↓↓↓↓↓↓JSP内部执行顺序↓↓↓↓↓↓↓----------------------------------------------------
JSP内部执行顺序;
在JSP的自定义标签类中都是继承SimpleTagSupport类
而SimpleTagSupport实现了SimpleTag接口的,
从而所有的自定义标签类都是间接的实现了SimpleTag接口。
而在这个SimpleTagSupport类实现了SimpleTag所有的方法,从而执行也是执行这些方法
顺序;而这些方法的执行的顺序都是优先执行doTag()方法,而在doTag()方法中一般都是
调用接口的其他方法进行使用的,而在这些方法的执行顺序都是取决位于
doTag()方法内部调用的顺序的。。。。。。。。。
SimpleTag接口的方法;
1.doTag() --- 在使用自定义标签类的时候,
内部会自动的调用这个方法,
执行这个方法的逻辑业务处理。
2.setParaent(JspTag paraent)
--- 设置父类标签,传入一个父类的标签类
3.setJspBody(JspFragment jf)
--- 设置标签内容,传入一个内容存储类的对象
4.setJspContext(JspContext
jc) --- 设置标签内容的属性,实际传入是子类
PageContext pc
---实际传入是子类
◆注;一个标签会被Tomcat服务器翻译成一个方法,在这个方法按照逻辑顺序处理
---------------------------------------↓↓↓↓↓↓↓JSP自定义标签常用的用途↓↓↓↓↓↓↓----------------------------------------------------
JSP自定义标签常用的用途;
1.控制标签内容是否显示 --- 在doTag()方法中执行顺序↓↓↓↓↓↓↓↓
代码;
方式一;
0.获取到标签的内容,而这个标签内容被封装成了对象
JspFragment jf= this.getBody();
1.获取到PageContext类的父类
PageContext pc= (PageContext)this.getContext();
2.通过PageContext类可以获取到其他八大对象
JspWriter out =pc.getOut();
3.调用JspFragment的invoke方法,
传入一个输出网页的输出流对象,将其内容写出
jf.invoke(out);
方式二;
1.获取到标签的内容
JspFragment jf =this.getBody();
2.直接调用JspFragmentinvoke方法,传入一个null,
在内部会进行输出的处理,从而提高开发效率。
jf.invoke(null);
2.控制标签后面的内容是否显示或不显示--- 在doTag()方法中
抛出SkipPageException
代码;
一、不显示后面的内容
---抛出SkipPageException异常,
则后面内容都不会显示。
二、不显示标签内容
---在doGet方法中什么都不写为空
3.重复显示标签内容或动态的显示标签内容 --- 使用循环
代码;
一、静态的重复显示标签内容
1.获取到标签的内容
JspFragment jf =this.getBody();
2.使用for循环输出
for(int i =0; i <5; i++){
//调用invoke方法
jf.invoke(null);
}
二、动态的重复显示标签内容
1.创建一个成员变量,
而这个成员变量作为标签的属性存在。
可以通过EL表达式获取到这个属性的信息。
在使用时将这个属性放到域中,从而使用EL表达式获取。
4.改变标签内容
代码;
1.获取到标签内容
JspFragment jf = this.getBody();
2.创建一个输出流的容器
StringWriter sw = new StringWriter();
3.调用invoke方法,传入一个输出流的容器,
通过这个invoke方法的获取到这个内容到输出流容器
jf.invoke(sw);
4.获取到输出流容器的存储的内容
String temp = sw.toString();
5.必须手动写出
this.getContext().getOut().write(temp);
-----------------------------------------↓↓↓↓↓↓↓JSP —— 注意↓↓↓↓↓↓↓----------------------------------------------------
1.重启了服务器等一系列操作,操作后还是没有错,
那么则要看下 Tomcat —> webapps —> 项目源文件是否修改的时候重发布成功
2.在调用域的信息的时候,可以先在文件测试域是否为空,
避免出现遍历等一系列业务逻辑处理的时候错误。
3.在属性中使用EL表达式必须要使用" "
4.在属性中使用EL表达式必须设置*.tld文件的属性标签下的子标签内容为true
true
5.在scriptless格式中不能输出纯数字或纯字符必须和字母或中文一起使用
—————————————————————■■■■■■■■■■■■■■■===↓↓↓↓↓JSP —— Jstl标签库↓↓↓↓↓↓↓↓===■■■■■■■■■■■■■■■■■■——————————————————————
Jstl标签库;
为什么要有?
SUN公司为了提高业界开发效率将,
经常需要实现的功能的代码封装成一个一个标签,
而这些标签都统称为Jstl标签库。
是什么?
Jstl标签库是一系列封装好的标签。
作用;
用于页面逻辑,处理自定义标签等。。。。。
便于调用,提高开发效率。。。。。。。
特点;
-----------------------------------------↓↓↓↓↓↓↓Jstl标签库分类↓↓↓↓↓↓↓---------------------------------------------------
Jstl标签库的分类;
核心标签库 --->
core/c ---> 文件标签名是( c )
国际化(格式化)标签库---> framat/fmt
fn(EL)标签库---> fn
/SQL标签库--->sql
|
\XML标签库--->x
◆注;SQL标签库和XML标签库基本都不使用了,
因为XML和SQL都是用于存放数据了,
而不会将这些数据显示在客户端浏览器。
------------------------------------------↓↓↓↓↓↓↓Jstl开发步骤↓↓↓↓↓↓↓----------------------------------------------------
Jstl开发步骤;
1.在MyExlipce中创建web项目
2.检查是否有J2ee5的lib
a)如果没有则需要导包
3.在JSP文件中直接调用。
<%@ tagliburi="http://java.sun.com/jsp/jstl/core" prefix="c"%>
a)一般使用的是核心标签库的标准版,要注意uri的地址
4.直接调用
--------------------------------------↓↓↓↓↓↓↓Jstl核心标签库常用标签↓↓↓↓↓↓↓----------------------------------------------------
Jstl核心标签库常用标签;
导标签库;
<%@taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c"%>
1.set;
设置属性,默认设置的属性作用在pageContext域
代码;
说明;
var --- 设置域属性名
value --- 设置域属性名对应的属性值
scope --- 设置域的作用域,如果不设置默认是pageContext
2.out;
输出内容
代码;
<c:out
value="${域.属性名}"default="x" escpeXml="boolean">
说明;
value
--- 域的属性名
defalut
--- 默认值,如果value/值为null则输出默认值
escpeXml
--- 设置默认值是否有效
3.if
单条件判断,输出内容,只有true和false。
代码;
xxx
0}"> xxx
说明;
test --- 设置判断语句
如果要判断则需要使用EL表达式
因为EL的作用就是逻辑处理,
和获取域的属性值。
4.choose-when-otherwise
多条件判断,输出符合条件内容
代码;
xxx
3}">
vvv
ccc
说明;
与if-else if...-else 使用相同
choose -when -otherwise
if else if else
test --- 设置判断语句,boolean
如果要判断一般都是EL表达式,
因为EL的作用就是逻辑处理,
和获取域的属性的值。
5.forEach
遍历数据和集合
step="num"var="x" varStatus="vs">
xxxxxxxxxxxxxxxxxxxx
说明;
items --- 遍历的集合或数组,
只能传入集合或者是数组,
如果不是集合或者数据,
会原样输出这个items的值。
所以一般都是传入一个EL表达式获取到的集合或数组
begin --- 从哪个元素的角标开始遍历,默认是第一个
end --- 遍历到哪个角标结束,默认是最后一个
step --- 每次遍历的角标的位置,默认是1++
var --- 接收元素每一个遍历的元素
varStatus --- 每一个元素的状态,
而在varStatus有一个count方法,
获取到每一个元素的系列号,
代表的是第几个元素。
6.forTokens
遍历字符串
<c:forTokens
items="${x}/string" delims="符号"begin="num"
end="num" step="num" var="x" varStatus="vs">
xxxxxxxxxxx
说明;
items --- 传入一个字符串
delims --- 切割的字符
begin --- 开始位置,切割符号的子字符串是元素,
begin是指从第几个子字符开始。
以切割字符作为一个分隔。
默认是第一个元素。
end --- 结束位置,
是以切割的元素的角标进行标识的
默认是这个字符切割符的最后一个元素。
step --- 每次切割的字符的位置遍历是增加几,默认是1++
var --- 用于接收每次切割之后的元素
varStatus --- 每一个切割的之后的元素的状态,
有一个count的方法可以,
获取到这个状态Id。
7.redirect
简化重定向
代码;
说明;
url要跳转的资源,
而这个资源只能是当前项目下的,
◆但是不用指定项目名而已。
8.url
简化的url
代码;
说明;
value是要跳转的地址,不需要写项目名
这个标签主要是用于 ( a ) 标签等一起使用,
因为可以避免路径出错
如果单独使用则是无效的,
如果有项目下的一个文件路径则会输出这个项目的路径
◆◆◆注;在属性中是可以嵌套EL表达式,注意↓↓↓
◆◆◆注;建议在标签属性使用EL表达式必须EL表达式必须要使用"EL",
并且不可以有空格,因为会认为是一个字符串。。。。。。
—————————————————————■■■■■■■■■■■■■■■===↓↓↓↓↓JavaBean规范↓↓↓↓↓↓↓↓===■■■■■■■■■■■■■■■■■■——————————————————————
JavaBean规范;
为什么要有?
有了JavaBean规范,将数据进行封装,提高代码的重用性等。。。。。。。
是什么?
是SUN公司定义的规范,
JavaBean也叫PoJo(plain old java Object)
VO(Value Object)或DO(data Object)
◆JavaBean就是一个java类,JavaBean只是一个规范。
作用;
主要是为了封装数据,提高代码的重用性,使得代码的页面整洁等。。。。。
◆规范要求(特点);
JavaBean规范的类,必须要有无参的构造方法
必须把属性私有化
必须提供public 的 get/is和set方法
◆注;is方法也是属性get方法,因为这个主要是在一些布尔类型会使用。。。。。。
◆◆◆◆◆注;建议(必须)要实现Serializable接口,
使得该类可以进行系列化,
才可以在网络上进行一个传输。
———————————————————————■■■■■■■■■■■■■■■===↓↓↓↓↓MVC& 三层架构↓↓↓↓↓↓↓↓===■■■■■■■■■■■■■■■■■■————————————————————————
MVC&三层架构开发模型;
为什么要有?
1.在开发架构模型中,
a)可以使用Jsp + javaBean
但是程序的操作过于依赖Jsp
可是简单,开发效率高,
不便于进行一个维护。
b)可以使用jsp + servlet + javaBean
但是Serlet类似一个数据到显示页面的桥梁
而这个业务处理,如果在Serlvet类中太多
不便于程序的维护,排错等。。。。
因为所有的业务逻辑到
写在Servlet类中。
是什么?
是一个架构开发的模型。
作用;
使得程序的,代码简洁,客观,利于排错,维护等。。。。。。
特点;
分层开发
--------------------------------------↓↓↓↓↓↓↓MVC& 三层架构层次↓↓↓↓↓↓↓----------------------------------------------------
MVC架构层次;
1.表示层(web)
--- javaBean(model)、servlet(control)、jsp(view)
a)javaBean将获取到的数据进行一个封装
b)jsp是用于显示后台处理的结果的
c)servlet是控制数据的处理(如;登录需要进行什么业务处理)
2.业务逻辑层(service) --- 处理业务
客户端浏览器要与服务器进行交互数据,
而这个数据的交互规则则是业务处理。
如;登录等。。。
3.数据访问层(Dao) --- CRUD 增删改查
控制客户端浏览器访问数据的操作。
Dao是直接与数据进行交互的。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■↓↓↓↓↓↓Servlet域↓↓↓↓↓↓↓↓■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
↓↓↓↓↓↓大到小↓↓↓↓↓↓
Servlet域分类;
ServletContext ----- 全局范围
作用;
存储作用的整个服务器的数据。
如;下拉列表等,固定的非常少修改的数据。。。。。。
HttpSession
----- 会话范围
作用;
存储当前会话的用户的数据。
HttpServletRequest ----- 当前请求的范围
作用;
存储当前请求信息的数据,如果不是转发那么再次请求会创建一个新的
【pageContext】 ----- 当前页面的范围
作用;
只是在JSP中有,并且是咋当前的页面获取到其他对象
Servlet域;
ServletContext ---J--- application ---E--- applicationScope
HttpSession ---J--- session ---E--- sessionScope
HttpServletRequest ---J--- page ---E--- request
特殊;【PageContext】---J--- pageContext ---E--- pageScope
◆ 注;在Servlet中是无法使用pageContext域的,
因为也没有意义,这个域的只作用在当前页面
这个域的作用是为了获取其他的对象
◆◆◆◆◆注;在EL表达式中域对象如果加上了Scope则是获取域信息,
如果没有加上Scope则是调用方法,
而在EL表达式中要是需要获取别的对象要使用pageContext域对来获取
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■↓↓↓↓↓↓Servlet常见的错误↓↓↓↓↓↓↓↓■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
常见的错误;
◆ 1.在获取到域信息的时候注意空指针的异常
2.注意路径的异常,建议把web.xml的访问虚拟路径名改成和文件一样的
3.在JSP中的注释不可以写EL表达式,JS脚本代码语法,表达式,声明等。。。。。。
有时出错了就是这里的注释出错,而工具没有检测出来这个错误。。。。
4.重定向的路径是要写项目名的,转发是不用写项目名的
◆ 5.在获取文件的时候,注意;如果不是Servlet的语句块内,可能写相对路径没用
a.可以使用类获取到
b.绝对路径
6.JSP文件必须要翻译的。。。。。才会在页面显示出效果
7.在使用EL表达式调用域的属性值的时候,是使用xxxScope,在EL表达式中必须要加上Scope
8.在使用PageContext域的
setAttribute(x,x,x)方法
调用其他域的时候,
◆ 使用常量的XXX_SCOPE
9.注意在使用Jstl标签库的时候,
在属性的值是使用EL表达式获取的,
那么这个" " 双引号不可以有空格
因为会认为是一个字符串。。。。。。
value="${ request.s
}" 正确
value=" ${request.s}
" 错误
不能是闭合标签
◆10.技巧;可以使用自定义异常,来抛出,
从而进行将这个异常的内容进行一个转发输出到页面
11.注意;如果在一条语句中有多个EL表达式使用 ( ) 空格分隔
————————————————————————————————————↓↓↓↓↓↓Servlet开发小技巧↓↓↓↓↓↓↓↓——————————————————————————————————————————
表单;
1.在对表单的数据进行某些后台处理的时候可以在表单使用 recodonly='xxx'事件,
这个事件可以使得用户无法修改某一个表单的数据,
以达到用户无法修改表单的某些数据。
在JSP中使用EL配合使用
如;
2.当需要获取某些数据,
而这些数据是不想让用户看见的可以使用hidden,
在CSS中也有hidden关键字,
也可以在表达中使用hidden格式使得用户提交的时候,要获取到某些信息。
如;
3.在使用<a>标签的时候可以将href属性的值设置为javascript:void(),
可以使得href属性失效,但是不会影响到a连接的特性
4.在Servlet开发中在EL表达式里要善用三元运算符