博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java/jsp/cookie/session/EL\context和request的生命周期(二)
阅读量:4289 次
发布时间:2019-05-27

本文共 8400 字,大约阅读时间需要 28 分钟。

3.1. 什么是 jsp? *

sun 公司制订的一种服务器端劢态页面生成技术规范。

**********JSP生命周期包括以下阶段:

解析阶段:Servlet容器解析JSP文件代码,如果有语法错误,就会向客户端返回错误信息
翻译阶段:Servelet容器把JSP成Servelet源文件
编译阶段:Servelet容器编译Servelet源文件,生成servelet累
阶段:加载与JSP对应的Servelet类,创建其实例,并调用它的方法
运行时阶段:调用与JSP对应的Servelet实例的服务方法
销毁阶段:调用与JSP对应的Servelet实例的销毁方法,然后销毁Servelet实例

3.2. jsp 的组成? *

  1. 1)  html(html,css,javascript)

  2. 2)  java 代码

    •   第一种形式:java 代码片断 <% %>

    • 第二种形式:jsp表达式<%= %>

    •  第三种形式:jsp声明<%! %>

  3. 3)  指令

  4. page指令

  •  import属性

    pageEncoding 属性

  • contentType 属性

  •  session属性:true(缺省)/false。如果值为 false,则对应的 servlet 代码 当中不会生成声明和创建 session 的代码。也就是说, 不能够使用 session 隐含对象了

    isELIgnored 属性:true(缺省)/false,是否忽略 el 表达式,如果是 true,忽略。

  •  isErrorPage 属性:true/false(缺省),当前 jsp 是否是一个错误处理页面,如 果是 true,是错误处理页面

    errorPage 属性:用于指定错误处理页面。

  •  

  • include指令

  •  file 属性

    taglib 指令:用于导入标签

  •  uri属性:标签文件的命名空间

    prefix属性:命名空间的前缀

4) 隐含对象(9 个)

out

 request
response  

session

application 

 exception:

当一个页面设置了<%@page isErrorPage="true"%>,则可 以 在该页面当中,使用该隐含对象读取错误信息。

config:就是 ServletConfig,可以读取 jsp 的配置参数。

pageContext:是 PageContext 类的实例,服务器会为每一个 jsp 实例(指的是 jsp 对应的那个 servlet 对象创建唯一的一个 PageContext 实例。作用主要有两个:绑订数据:setAttribute,getAttribute,removeAttribute;获得其它几个隐含对象:即在获得了 pageContext 实例之后,可以通过该实例,获得其它 8 个隐含对象。

page:表示 jsp 实例本身。

5) 活动元素

在 jsp 实例已经运行了,告诉 jsp 引擎做一些处理。

  • <jsp:forward page=""/>转发,page 属性指定转发的地址。

  • <jsp:include></jsp:include page="">一个 jsp 在运行过程当中,调用另外一个 jsp

  • <jsp:param name="" value=""/>设置参数 name 指定参数名 value 指定参数值

  • <jsp:useBeanid="user" scope="request'" class="类"/>在指定的范围绑订一个对象。范围指的是四个对象 pageContext,request,session,servletContext。也就是说 scope 的值可以是"page","request","session","application"。

  • <jsp:getProperty/>

  • <jsp:setProperty name="user" property="user对应类的属性" value="属性值"/>

  • <jsp:setProperty name="" property="" param=""/>//依据请求参数给属性赋值

  • <jsp:setProperty name="" property="*"/>使用"自省机制"给属性赋值。

  • 6)  注释

<!-- <%=new Date()%> -->注释中的代码会执行,但丌会在页面上输出。

<%--xxxx--%>注释中的代码丌会执行,也丌会在页面上输出。

  1. 7)  jsp 源文件如何转换成.java 文件? *

html----> service(),使用 out.write()输出。

<% %>---->  service(),照搬。

  • <%=%>---->  service(),使用 out.print()输出。

  • 指令---->  会影响源代码的生成,比如导包。

  • <%! %>---->  jsp 声明中定义的变量会变为对应的 servlet 类的属性,

    定义的方法会变成对应的 servlet 类的一个方法。

context和request的生命周期:

pageContext:只有对应的JSP实例自己可以访问,生命周期从对应的JSP对象创建到JSP 对象消亡。一般用于数据库连接。

request:一次请求能访问,生命周期在一次请求和响应期间。一般存放错误处理。

session:一次会话期间能访问,多次请求和响应期间都存在。一般存放个人信息,如购物车信息。

ServletContext:整个应用内部所有组件都能访问,除非服务器关闭,否则一直存在。

***jsp 模板设置:

Preferences==》Web==》JSP Files==》Editor==》Templates选择New JSP FILE(xhtml)

 

 

1. jstl 与 el 表达式

1.1. jstl 是什么? *

java standard taglib(java 标准标签库)。

1.2. 标签是什么? *

sun 公司制订的一种技术规范,用来将 jsp 页面中的 java 代码使用类似于 html 当中的标记来替换 的一种技术。这样做的目的,是为了使 jsp 页面更好维护以及更好的测试。

1.3. el 表达式是什么? *

sun 制订的一种用于计算的一种规则,早期只能用于给标签的属性赋值,现在也可以直接输出。

EL 表达式是干什么用的?

EL 表达式把数据从四个范围(pageContext、request、session、application)中取出来显示戒 者计算。

EL 表达式解决了 Java 代码和 HTML 的丌匹配问题(让 html 页面中丌再有 java 代码)。EL 表达式用字符串表达式替换 Java 代码,用来表示对数据的获取或计算。

 

*****jsp(java  server page)和servlet一样是在服务器端执行的;jsp中可以写html内容和Java的内容。

jsp的运行原理:先把jsp翻译成servlet,-》编译-》访问。
jsp编译后会在服务器的work目录下生成一个文件夹,在最里层的文件夹中会有xx.class(编译后的类)和一个xx.java类(有jsp文件转换来的)。

jsp中的脚本元素:

<%! %>定义类,变量,方法等。不常用
<%=“hello” %>输出语句,输出到页面,不能有分号,=号后面跟输出的内容。
<% %>最长用的。

EL:

获取域对象中的内容:${XX}

 

jsp中的注释:

jsp的页面注释:<%-- XXX  --%>存在jsp文件阶段,转化阶段消失(jsp转化成Java的servlet后消失),只能被开发人员看到;
Java注释://、/**/、/***/jsp文件阶段存在,翻译成Java文件也存在,编译阶段消失;
HTML注释:<!-- XX -->,不会消失,在页面也能看到;

jsp的指令元素:

语法格式:<% @指令 属性=属性值 %>
指令的分类:
  ******page指令:设置jsp的全局属性,注意:只有import属性可以出现多次,其他属性只能出现一次;
    *page的属性:
        language:jsp文件允许嵌入的语言,目前只允许java;
        extends:jsp翻译servlet文件;servlet继承的类;
        session:默认值为true,可以直接使用,false的不能直接使用个,但可以获取到再使用;
import:引入jar包;(j的自动sp中的自动导包的快捷键是ALT+/)
buff:设置缓冲区大小,默认是8kb;
aotoFlush:是否默认刷新缓冲区,默认为true;
errorPage:指定一个错误的页面(这个优先级高,如果配置了全局的错误页面,就不要配置这个页面);也可以在web.xml中配置全局的错误页面,
<error-page><error-code>500</error-code><location>XX</location></error-page>
isErrorPage:设置值后,可使用exception对象,可以获取exception中的信息;
comntentType:设置服务器输出内容的编码方式,浏览器打开后的编码;
pageEncoding:jsp翻译成servlet时采用的编码;
isELignore:jsp 页面默认是可以使用EL语言,如果是true的话,就忽略EL表达式,就不能使用EL。

*****include指令:包含页面

语法:<%@ include  file="文件地址(静态包含)" %>静态包含就是把所有的文件复制到一起,然后翻译成servlet,再一起编译。

taglib指令:引入标签库
语法:<%@ taglib uri="标签库文件的地址" prefix="标签库名"%>

设置jsp文件的打开方式,可以提高打开速度:preference -General-Editor--文件关联---*jsp----选择myeclipse JSP Editor def

设置jsp文件的编码:preference--搜索jsp--选择UTF-8;

JSP的内置对象:-----真实对象
request---------HttpServlet
 response--------HttpResponse
 session --------HttpSession
application ------------ServletContext
out  ----------------JspWrite输出,out对象缓冲区的东西会先输出到response的缓冲区,然后再输出,同时存在out.printhe 
resposne.getWrite().print()时,先输出后者。
pageContext------------PageContext只对jsp当前页面有效,可以获取其他8个域对象。可以自己存取值,也可以向其他域中存取值。
jsp的四个域对象:servletContext(整个web应用) session(一次会话) request(一次请求) pageContext(当前页面) 

page -------------Object,由jsp生成的当前的Java类的对象。

config----------ServletConfig
 exception--------------Throwable,使用前提,要设置isErropage="true"

JSP动作标签:

<jsp:forward page="转发的路径" >转发 <jsp:param name="username参数名" value="lambo参数值"> </jsp:forward>

<jsp:include page="动态包含的路径">页面包含,动态包含,把包含翻译成.java文件,然后编译成.class文件,最后把所有的.class等结果文件一起显示。

<jsp:param>传递参数

javaBean:一个javaBean对应数据库一张表;
下面的标签是把数据封装到javaBean中,在jsp页面完成
<jsp:useBean id="u" class="web.userjavaBean的类"></jsp:useBean>
<jsp:setProperty property="username" name="u对应前面的id"/>
<jsp:getProperty property="username" name="u"/>

<jsp:setProperty>
<jsp:getProperty>

内省的技术实现数据封装:要自己实现

beanutils工具包:Apache开发的一组工具包,BEanutils.populate(javabean的对象,要绑定的数据);
Date类型需要自己手动实现。
把字符串转换成日期:编写一个类,实现converter接口,
实现接口方法public void convert(Class clazz,Object obj){
把输入的字符串转换成日期类型:String dDate=(String)obj;
把字符串转换成日期:SimpleDateFormat sdf=new SimpleDateFormat ("yyyy-MM-dd");
Date dat=sdf.parse(dDate);

},

在封装之前完成注册:CoverUtils.register(new MyDateConvert(),Date.class);

EL表达式:${}

1.获取域对象中的值;
${}
2.执行运算
3.获取web开发中的对象;
请求的参数${param.usernam} 
请求头${header。referer} 
获取全局初始化参数${initpParam.username}
获取cookie${cookie.last.name}last是cookie的名称,name是cookie存储的名称,value是cookie存储的值。
${pageContext}

4.调用Java方法

JSTL:jsp的标准标签库:和el一起取代<% %>来写java代码;

 

需要一个标签库即JSTL。需要引入它的库,将jstl.jar和standard.jar考到WEB-INF/lib下,然后采用tablib指令引入标签库。

 各套框架(还没有学习,比如struts,SpringMVC等)都有自己的标签库,这时JSTL可以作为公共、通用的,横行于各框架中。

下载地址:,、里面有四个jar包,全部复制到lib文件夹下。参考、

导入jar包,引入核心标签库;
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
输出标签:
<c:out value="hello"></c:out> 
<c:out value="${username}"  default="取不到前面value的值,就显示这里的默认值" escapXml="true,默认的,表示转义"></c:out>

向web'域中存入数值,修改对象和javaBean的属性值;

<c:set var="变量" value="变量的值" scope="request,可以是其他的域">

<c:set trget="${user对象}" property="属性" value="属性值">用set改变属性的值

删除属性:

<c:remove var="删除的属性" scope="域" >

捕获异常:捕获的异常保存在变量e中。

<c:catch var="e">
代码
</c:catch>
${e.message}获取异常

<c:if test=${这里可以是表达式表示true和false} var="把前面test中计算的结果保存在这个变量中" scope="">
这里写代码
</c:if>

下面这个类似if  else 

<c:choose>
<c:when test="${}">

</c:when>

<c:when test="${}">

</c:when>

<c:otherwise>

</c:otherwise>

</c:choose>

 

<c:forEach var="s"  items=${arr}>

var要遍历的数据类型,items要遍历的内容
</c:forEach>

<c:forEach var =“i” begin=“1” end=“10” step=“2” varStatus="stu遍历后的结果放在这个属性中" >

迭代数据,varStatus有count,last,first属性;
</c:forEach>

<c:import url=“/jstl/choose.jsp” context="/Firest" var="i页面的内容存在var中">包含页面
url引入的页面
context虚拟路径
va引入的页面存到这个里面
scope域

<c:param name="名称" value="值"> 传递参数

</c:import>

<c:url var="i" value="/jsp/choose.jsp" scope="request" context="/First">

var申明属性,i就是整个url地址,包含虚拟路径和value的值
context虚拟路径
${i}获取url地址

<c:redirect url="/jstl/choose.jsp" scope="reuest" context="/First">重定向
<c:param name="" value="">参数
</c:redirect>

<c:forTokens items="分,割,的,字,符串" delims="," var=“x”>字符串分割,

items要分割的字符串
delims以什么分割
var分割后的内容存到var中

在使用el的函数前导入<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

自定义el函数的步骤:
1.编写一个java类,方法必须是静态方法;
2.在WEB-INF目录下闯进一个tld文件
3.在tld中配置:
<tlib-vertion>1.0</tlib-version>
<short-name>myfn</short-name>
<uri>http://xxxx/myfn</uri>
<function>
配置方法名称,这里的名称可以和类中的方法名不一样,这个是只代类中的方法<name>sayHi<name>
方法所在的类<function-class>包名.类名A</function-class>
配置方法签名,按照类中方法的格式,多个参数用逗号隔开<function-signature>java.lang.String sayHelo(参数类型java.lang.String)</signature>
</function>
使用自定义的el函数:
首先引入标签库:
<%@ taglib uri="http://xxxx/myfn" prefix="myfn"%>uri和prefix就是tld中配置的;

自定义标签:

1.自定义一个类,实simpleTag接口,继承simpleTagsupport就可以;
几个方法的执行顺序:
*setJspContext()将jsp页面的pageContext对象传给标签处理器对象
setParent()将父标签的对象传给当前标签处理器对象
setter()
setJspBody()把标签体(两个标签之间的内容)传过来
*doTag()执行标签
getParent()
setter()

2.在WEB-INF中创建一个tld文件,配置;类似自定义el函数;

<tag>
配置标签名称<name>print</name>
配置标签类<tag-class>包名.自定义的标签类</tag-class>
标签主体可选值:scriptless,empty,tagdepent <body-content> </body-contnt>
</tag>

MVC模式:

model-----javaBean
view----jsp
controller------servlet

你可能感兴趣的文章
Linux下多线程查看工具(pstree、ps、pstack)
查看>>
PID PPID LWP NLWP
查看>>
查看线程CPU占用情况
查看>>
查看个线程的CPU 内存占用
查看>>
Fiddler 教程
查看>>
apache 设置用户注意事项
查看>>
svn中设置文件夹链接
查看>>
find ./ -name "*.cgi" |xargs -i cp "{}" ./cgi-bin/
查看>>
svn st | awk '{if ( $1 == "?") { print $2}}' | xargs svn add
查看>>
mysql事务处理用法与实例详解
查看>>
利用iptables来配置linux禁止所有端口登陆和开放指定端口
查看>>
Python模块——struct
查看>>
mysql中select * for update
查看>>
linux vmstat 1 ,watch , pmap -p,
查看>>
MYSQL 相关
查看>>
python 构建client 程序
查看>>
c++ 加载so动态库中的资源
查看>>
加解密 签名
查看>>
linux top 命令分析
查看>>
Linux vmstat命令详解
查看>>