JSP/Servlet总结

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接口的实现类)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值