Servlet的缺陷:
Servlet的编码,部署和调试任务繁琐
生成动态网页繁琐、不利于项目分工;
JSP技术:
由普通的html里面嵌套java代码;
JSP的扩展名必须为.jsp;
JSP含义:
1、(JAVA sever pages)这是服务器端的页面,用来动态处理业务;
2、html模板+java代码。所有的java语言都可以在jsp中使用;
3、html定义了整个网页的骨架,页面的结构和外观。java代码用来操作数据的显示;
jsp API:
1、test.jsp 干邑为test.java 代码;test继承了httpjspbase,httpjspbase继承了httpservlet;jsp本质上就是servlet;
2、org.apache.jasper.servlet.JspServlet类是jsp引擎;
3、tomcat 中 web.xml里面已经配置了jsp的内容。注册和映射都配置ok。tomcat是一个jsp/servlet的容器;
jsp,容器直接给我们配置好注册和映射;
Jsp和servlet的异同:
相同:两者都是servlet,都是服务器端动态网页技术
不同:jsp重在数据显示, servlet重在业务逻辑/处理控制和数据获取;
一、Jsp的运行机制-页面翻译,生命周期:
第一步:
jsp引擎将jsp页面翻译成JAVA代码;org.apache.jasper.servlet.JspServlet
第二步:web容器负责将servlet代码
编译为字节码;
第三步:加载到容器
第四步:容器创建jsp的实例;调用Jspinit()、调用服务阶段、销毁【servlet的生命周期】
二、在html种嵌套jsp的java代码:
/
/jsp声明,可以申明变量,函数,静态块;jsp申明主要定义
全局的变量方法;放在全局
<%!
int i = 10;
申明变量
static{
System.out.print("这是jsp输出的内容");
}
public int add(){
return 1+1;
}
%>
//在JSP中写执行的脚本片段 没有 !
脚本片段,所有的代码放在service方法内容内部,可以调用外部的属性和方法;
<%
for( int i = 0 ; i<10;i++ ){
System.out.print( i );
}
%>
循环打印html标签: jsp脚本片段只能出现java代码,不能出现任何模板元素,jsp引擎在翻译jsp代码的时候,会将脚本片段里面的所有java代码都放在service方法里面,jsp脚本片段完全遵循java语言规则,想嵌套脚本元素,必须将脚本片段分开;
<% for( int i = 0 ; i<10;i++ ){ %>
<p>this is p </p>
<% } %>
//jsp脚本表达式:
后面不能用分号,jsp引擎会将脚本表达式变成out.print("")/write.print(""); 主要用于将程序的数据输出到客户端;
<%=m %>
<%=1+1 %>
<% out.print( m ) %>
<%-: <%----%>
html注释:<!-- -->
java注释:/**/ //
四、JSP三种类型的指令:
page指令:用于定义jsp页面的各种属性和相关功能,无论page出现在jsp的那个地方,都作用整个页面;用于
页面与WEB容器
通信和翻译阶段;
lauguage = “java” 可以嵌套java语言;
<%@ page import="com.lovo.bean.*" %>
<%@ page isErrorPage%> <%=exception.getMessage() %>错误页面则调用信息;
<%@ page errorPage“/error.jsp” %>页面发生错误跳转到那个文件中去;
info:网页信息
contentType:MIME类型和JSP编码
import:类和包
buffer:缓冲区大小
include指令:静态包含,外部的文件,静态文件(txt文档),动态文件均可;用于在jsp编译时插入包含文本或者代码的文件会把包含的文件拷贝到指定的位置;
include指令称为静态包含,先把其他页面的内容引入到当前这个页面,变成一个页面。最终只会产生一个servlet,
包含的内容必须遵循jsp的语法;不能出现相同的变量名;
被引入的文件可以是任意的扩展名;
静态引入会生成一个文件,在翻译成servlet;
<%@ include file="head.jsp" %> 【细节:加/需要写全路径】
<%@ include file="footer.jsp" %>
<%@ include file="text.txt" %>
taglib指令:导入标签库的指令;可以让用户基于xml语法自己来定义标签,实现对JSP语法的延伸;
五、JSP动作:静态文件(
txt、
html) 动态文件(
JSP、PHP);
作用是页面与页面之间通信,页面与组件之间通信
动态包含:1、包含的是结果,有多少个动态页面就包含多少个结果;
/2、而创建多个servlet,就将所有的servlet结果放在一起
/3、如果包含的是静态文件,就相当于静态包含;
/4、包含的每一个页面都可以设置自己的指令和变量,不会冲突;
【而静态包含将所有的内容包含进来;】
<JSP:include page="head.jsp"
flush="true"> </jsp:include>
<JSP:forward page="head.jsp"/ >:动态跳转到新的页面 相当于servlet的内部派发,当前执行到派发动作的时候,将控制权交给了下一个资源,相当于servlet的请求派发;
【补充】Include指令与include动作指令之间的区别:
静态指令 | 动态指令 |
只能生成一个servlet | 可以生成多个servlet |
包含被包含页面的真实代码 | 包含相应代码 |
发生在页面编译时 | 发生在页面请求时 |
任何修改都要重启web服务器才能生效 | 动作保存即生效 |
不能在请求区间内共享对象 | 支持在请求区间共享对象 |
适合于静态页面包含 | 适合动态页面包含 |
优势:执行速度快,允许包含主页面的JSP代码(响应报送,属性方法) | 在实现包含文件更改中,速度更快; |
六、JSP隐式对象: 请求,响应,会话以及其他
request、respone/pageContext(包含其他八大对象)/session/out/confing/page/exception/application(上下文)
1、九大隐式对象,不需要我们去定义,jsp引擎已经定义好了
request <%request.getHeader("Host");%>
session<%
session.getAttribute("code");%>
<%
exception%>获得页面的所有错误;
page:表示当前的页面本身,类似于java的this;
在标签库中常用;
pageContext:是JSP技术中最重要的一个对象,他代表JSP页面的运行环境;这个对象封装了其他八个对象;他自身还是一个容器(域对象),用当前这个对象来封装数据,当前这个对象还包含了动作和跳转,引用;
之一:查询内容: 本身--request--session--application// 无就空
<%
pageContext.setAttribute("name1","xiaowang");
request.setAttribute("name2","xiaowan");
session.setAttribute("name3","xiaozhang");
application.setAttribute("name4","xiaoli");
%>
<%
String name1 = (String) pageContext.getAttribute("name2");
%>
获取其他对象的值,要通过
findAttribute();获取其他对象的值;他在找的时候,首先找自己,然后找request,然后找session,然后找application;查找的时候按照(作用域)从小到达的顺序查找;找不到就返回null;
之二:包含动作,跳转,引入文件;
pageContext.forward("/index.jsp");
pageContext.include("head.jsp");