轻量级Java EE企业应用实战 学习笔记(二)第二章

时间:2021-05-11 21:05:09

Jsp的基本原理:jsp本质就是Servlet,当用户向指定的servlet发送请求时,servlet利用输出流动态生成html页面,包括静态部分标签,和动态部分,由java动态生成的内容.

每一个jsp文件在运行的时候都会在F:\apache-tomcat-7.0.69\work\Catalina\localhost目录下对应生成一个字节码(.class)和(.java)的文件.

 jsp文件必须在jsp服务器内运行

jsp文件必须生成servlet才能执行

每个jsp页面第一个访问者嘟嘟很慢,因为必须等待jsp编译成servlet.

jsp页面的访问者无须安装任何客户端,甚至不需要刻意运行的Java环境.


JSP注释

  <%--注释内容-->

  jsp的注释不会被发送到客户端


jsp声明

!-- 下面是JSP声明部分 -->
<%!
//声明一个整形变量
public int count;
//声明一个方法
public String info()
{
return "hello";
}
%>

会编译变成回应的servlet成员变量或成员方法.这里不能使用anstract修饰声明部分,因为抽象方法将到时jsp对应的servlet变成抽象类,从而导致不能实例化.

 

jsp输出表达式 

  <%=表达式%>

输出表达式后面不能有分号


jsp小脚本

<!-- Java脚本,这些脚本会对HTML的标签产生作用 -->
<%
for(int i = 0 ; i < 10 ; i++)
{
%>
<!-- 上面的循环将控制<tr>标签循环 -->
<tr>
<td>循环值:</td>
<td><%=i%></td>
</tr>
<%
}
%>

jsp声明少一个感叹号


jsp的3个编译指令:

  page:该指令是针对当前页面的指令.

  include指令,将外部文件切入到jsp文件中.同时解析这个页面中的jsp语句

  静态的include指令会将被包含的页面接入到本页面,融合成一个页面,因此被包含的页面甚至不需要是一个完整的页面.

  静态包含还会将被包含页面的编译指令也包含进来,如果两个页面的指令冲突,页面就会报错

taglib:


7个动作指令

 1. <jsp:forward page="forward-result.jsp">
<jsp:param name="age" value="26"/>
</jsp:forward>

在对应的页面中

<!-- 使用request内置对象获取age参数的值 -->
<%=request.getParameter("age")%> 获取参数

使用form表单

<!-- 表单提交页面 -->
<form id="login" method="post" action="jsp-forward.jsp">
<input type="text" name="username">
<input type="submit" value="login">
</form> 

客户端请求参数不会消失


 2.<!-- 使用动态include指令导入页面 -->
<jsp:include page="scriptlet.jsp" />

org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "scriptlet.jsp", out, false);

在servlet中使用org.apache.jasper.runtime.JspRuntimeLibrary.include方法来引入目标页面

<jsp:include page="forward-result.jsp" >
<jsp:param name="age" value="32"/>
</jsp:include>

同样可以传递参数

静态导入与动态导入区别:

     1.静态导入是讲两个页面融合成一个页面.动态导入时在Servlet中使用include方法来引入.

    2.金泰导入中被导入页面的编译指令会启作用,动态导入时被导入页面的编译指令会失效,只是插入页面的body部分.

3.动态包含可以包含额外的参数



<!-- 创建lee.Person的实例,该实例的实例名为p1 -->
<jsp:useBean id="p1" class="lee.Person" scope="page"/>
<!-- 设置p1的name属性值 -->
<jsp:setProperty name="p1" property="name" value="crazyit.org"/>
<!-- 设置p1的age属性值 -->
<jsp:setProperty name="p1" property="age" value="23"/>
<!-- 输出p1的name属性值 -->
<jsp:getProperty name="p1" property="name"/><br/>
<!-- 输出p1的age属性值 -->
<jsp:getProperty name="p1" property="age"/>


<jsp:param name="age" value="26"/> 见上

<jsp:plugin/>  使用的很少



9大内置对象

   application:作用:在整个web应用的多个jsp,servlet之间共享数据

                               访问web应用的配置参数

  config:读取配置信息.

 exception:异常只有当jsp页面的page指令的isErrorPage属性为true是才有用.

 out:一个页面输出流,等同于输出表达式<%=...%>

 pageContext:页面上下文,访问Jsp之间的共享数据,可以获取其他内置对象

request:获取请求参数

response:响应生成非字符响应, 重定向 添加cookie

session:代表一次回话.session的属性可以是任何可序列化的Java对象


Servlet

servlet支持注解和web.xml两种注册方式

 servlet声明周期:

   1.创建servlet生命周期实例

   2. web容器调用servlet的Init方法,对servlet初始化

   3.响应客户端的请求

   4.web容器决定销毁servlet时,先调用servlet的destroy方法.

  设置了load-on-startup 后,值越小,servlet就越先实例化,



jsp开发自定义标签类

    继承SimpleTagSupport类,实现里面的doTag方法.如果标签类包含属性,每个属性都应该有对应的getter和setter方法.

   新建TLD文件,文件放在web-inf下或在web-inf的任意子路径下.

   tdl文件的根元素<taglib>

  

Filter过滤器

   创建处理类,在web.xml中进行配置
   继承Filter接口,实现init destroy doFilter方法


   配置同样支持在web.xml和注解

   通过UrlRewriteFilter实现网页伪静态

   

listener

    定义listener实现类

    在web.xml或者用注解注册监听器

http://www.cnblogs.com/xdp-gacl/p/3969249.html 这里面对6个接口有详细的讲解


jsp2特性,支持el表达式 支持使用tagfile文件自定义标签

servlet3.0 支持注解

 支持异步调用


asyncSupported=true这个值要设置为true


// 创建AsyncContext,开始异步调用
AsyncContext actx = request.startAsync();

//添加一个异步调用的监听器
actx.addListener(new MyAsyncListener());
// 设置异步调用的超时时长
actx.setTimeout(30*1000);

actx.start(new GetBooksTarget(actx));

GetBooksTarget这个类实现runnable接口

public class GetBooksTarget implements Runnable{
private AsyncContext actx = null;
public GetBooksTarget(AsyncContext actx)
{
this.actx = actx;
}
@Override
public void run() {
try {
// 等待5秒钟,以模拟业务方法的执行
Thread.sleep(5000);
ServletRequest request =actx.getRequest();
List<String> books = new ArrayList<String>();
books.add("疯狂Java讲义");
books.add("轻量级Java EE企业应用实战");
books.add("疯狂Ajax讲义");
request.setAttribute("books", books);
actx.dispatch("/async.jsp");
} catch (Exception e) {
e.printStackTrace();
}

}