1.JSP本身不能执行,必须通过服务器解析之后生成Servlet才能够执行,JSP本质就是Servlet
2.JSP页面本身无法显示,而是通过被解析为HTML页面之后才可以通过浏览器进行访问
3.JSP的四种用法为:
<%-- 注释 --%>
<%! 声明的变量和方法(不能使用abstract修饰词) %><!--例如<%! public static int i; %>-->
<%= 输出表达式 %><!--对其中的表达式相当于out.println(输出表达式);-->
<% java代码 %>
4.JSP的3个编译指令:
page:常用属性 errorPage=”XX.jsp”、isErrorPage=”true/false”、import=”指定的JAR包”
include:用于导入外部文件,如果导入jsp页面会将编译指令导入
taglib
编译指令格式为:
<%@ 编译指令名 属性名="属性值" %>
5.JSP的7个指令动作:
jsp:forward页面转向,作为桥梁进行转发时不会丢失参数:
<jsp:forward page="[relativeURL|<%=expression=>]">
[<jsp:param name="xxx" value="xxx"/>]
</jsp:forward>
jsp:param传递参数
jsp:include动态引入jsp:
<jsp:include page="XXX.jsp">
[<jsp:param name="XXX" vakye="XXX"/>]
</jsp:include>
动态导入于静态导入的区别有:1.静态导入是两个页面融合成为一个Servlet,而动态导入只是导入页面内容、2.静态导入会导入编译指令,动态导入只导入body内容、3.动态导入可以增加额外参数
jsp:plugin用于applet
jsp:useBean创建JavaBean、jsp:setProperty设置JavaBean示例属性、jsp:getProperty获取JavaBean示例属性,示例如下:
<jsp:useBean id="id" class="XXX.XXX" scope="page|request|session|application"/>
<jsp:setProperty name="id" property="属性名" value="值"/>
<jsp:getProperty name="id" property="属性名"/>
6.JSP脚本中的9个内置对象:
application:servletContext示例,代表JSP所属的Web应用本身
config:ServletConfig实例,代表配置信息
exception:Throwable实例,当page属性isErrorPage为true时才可以使用
out:JspWriter实例,代表JSP页面的输出流
page:就是页面本身,可以用this代替
pageContext:pageContext实例,JSP上下文,可以获取ServletContext和ServletConfig,可以访问所有所有范围内的值
request:HttpServletRequest实例,封装了客户端的请求参数
response:HttpServletResponse实例,可以通过serRedirect(String);方法进行重定向,可以通过response添加cookie
session:HttpSession实例,代表一次会话
7.JSP中的重定向:
1.通过JSP动作jsp:forward
2.通过getRequestDispatcher(“/xxx.jsp”).forward(request,response);
3.response.sendRedirect(“xxx.jsp”);该方法相当于重新发送一次请求,该请求于request不在一个范围内,会导致request范围内的属性丢失
8.原生Servlet编写:
@WebServlet(name="XXX", urlPattern={"/xxx"})
public class MyServlet extends HttpServlet{
public void service(HttpServletRequest request, HttpServletResponse response){
//...
}
}
Servlet与JSP的区别在于,Servlet中没有内置对象,并且所有的HTML标签都需要进行逐行的输出。
当然还需要对Servlet进行配置,配置方式有两种:
1.通过@WebServlet在类上进行注解
2.在web.xml中进行配置
两种配置不要同时使用。对于web.xml配置方法可以参考SpringMVC中DispatcherServlet的配置方法:
<servlet>
<servlet-name>id</servlet-name>
<servlet-class>...</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>id</servlet-name>
<url-pattern>/aa</url-pattern>
</servlet-mapping>
下面通过注释的方法和上面的效果是等价的:
@WebServlet(name="id",urlPatterns={"/aa"})
public class MyServlet extends HttpServlet{
public void service(HttpServletRequest request, HttpServletResponse response){
//...
}
}
通过设置@WebServlet的loadOnStartUp属性可以让Servlet在第一次加载时就进行初始化例如@WebServlet(loadOnStartup = 1)
9.EL表达式
EL是Expression Language的简称,EL语句可以直接用于JSP页面只用,EL具有以下的特性:
1.EL支持算数运算符和逻辑运算符
2.具有11个内置对象:
pageContext(同JSP)
pageScope(类似于JSP)
requestScope(类似于JSP)
sessionScope(类似于JSP)
applicationScope(类似于JSP)
param
paramValues
header
headerValues
initparam
cookie
10.Servlet3.0增加的注解
通过注解可以抛弃繁琐的xml配置文件,增加的注解有:
@WebServlet:用于指定Serlvet类
@WebInitParam:为Servlet和Filter配置参数
@WebListener:用于修饰Listener类
@WebFilter:用于修饰Filter类
@MultipartConfig:
用于在类上进行注解,以支持文件上传,通过request.getPart(“值”);获取文件,然后通过part.write(“文件路径”);将文件写入到本地
@ServletSecurity
@HttpConstraint
@HttpMethodConstraint
11.servlet3.0的异步处理
一步处理的开启一共分为两两步,第一步是在servlet中开启异步调用,并同时开启一个线程进行处理,第二步是在JSP或者其他view层技术中对消息进行捕获
首先介绍第一步对于Servlet的处理:
@WebServlet(urlPatterns="/async",asyncSupported=true)
public class AsyncServlet extends HttpServlet
{
@Override
public void doGet(HttpServletRequest request
, HttpServletResponse response)throws IOException,ServletException
{
//异步调用前置处理
AsyncContext actx = request.startAsync();//创建AsyncContext,开始异步调用
actx.setTimeOut(60*1000);//设置异步超时时间
actx.start(new MyAsynThread(actx));//可以理解为再开启一个线程进行处理
//异步调用后置处理
}
}
public class MyAsynThread implements Runnable
{
private AsyncContext actx = null;
public GetBooksTarget(AsyncContext actx)
{
this.actx = actx;
}
public void run()
{
//异步处理前的操作
actx.dispatch("/返回消息的页面.jsp");
}
}
接下来编写接受消息的JSP页面:
<%--
<%@ page contentType="text/html; charset=GBK" language="java" session="false"%>
<ul>
${param.XXX}
</ul>
<%out.println("业务调用结束的时间:" + new java.util.Date());
if (request.isAsyncStarted()) {
// 完成异步调用,并通知页面消息的更新,很重要!
request.getAsyncContext().complete();
}%>
异步调用对开发者来说是透明的,如果开发者想要了解异步调用的具体细节,可以通过实现AsyncListener接口来是实现异步调用监听器,并通过注册:
actx.addListener(AsyncListener实现类);//为该异步调用注册监听器
当然说到异步调用,最重要的就是异步处理消息,这需要大家了解JavaIO的变迁史BIO,NIO,AIO的区别,其实非阻塞IO的使用与配置和异步处理非常类似:
1.通过ServletRequest的startAsync()开启异步模式
2.通过request.getInputStream()获得servlet的输入流
3.inpur.setReaderListener(ReadListener接口的实现类)