JSP基础知识

JSP教程

JSP指令

JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。
语法格式如下:
<%@ directive attribute="value" %>
指令可以有很多个属性,它们以键值对的形式存在,并用逗号隔开。

JSP中的三种指令标签:

指令 描述
<%@ page ... %> 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include ... %> 包含其他文件
<%@ taglib ... %> 引入标签库的定义

JSP九大内置对象

JSP中一共预先定义了9个这样的对象,分别为:
request、response、session、application、out、pagecontext、config、page、exception

1、request对象
request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。

2、response对象
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。

3、session对象
session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。

4、application对象
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。

5、out 对象
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。

6、pageContext 对象
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。

7、config 对象
config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。

8、page 对象
page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。

9、exception 对象
exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。

JSP中内置对象的作用域
名称          对象类型                 类型                           作用域
request       请求对象           javax.servlet.ServletRequest        Request
response      响应对象            javax.servlet.SrvletResponse        Page
pageContext   页面上下文对象      javax.servlet.jsp.PageContext       Page
session       会话对象            javax.servlet.http.HttpSession      Session
application   应用程序对象        javax.servlet.ServletContext        application
out           输出对象            javax.servlet.jsp.JspWriter         Page
config        配置对象            javax.servlet.ServletConfig         Page
page          页面对象            javax.lang.Object                   Page
exception     例外对象            javax.lang.Throwable                Page

JSP 标准标签库(JSTL)

JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。
核心标签、格式化标签、SQL标签、XML标签、JSTL函数、JSTL库安装
Apache Tomcat安装JSTL库步骤如下:
从Apache的标准标签库中下载的二进包(jakarta-taglibs-standard-current.zip)。下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
下载jakarta-taglibs-standard-1.1.1.zip 包并解压,将jakarta-taglibs-standard-1.1.1/lib/下的两个jar文件:standard.jar和jstl.jar文件拷贝到/WEB-INF/lib/下。
使用任何库,你必须在每个JSP文件中的头部包含<taglib>标签。

Servlet生命周期与工作原理

Servlet生命周期

Servlet 加载--->实例化--->服务--->销毁。

init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。
service():它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。

destroy(): 仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。

Servlet工作原理

1、首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet()、doPost()等等这些方法的,HttpServlet中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。
2、每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的init(),service(),destroy()方法。GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口。所以我们定义Servlet的时候只需要继承HttpServlet即可。
3、Servlet接口和GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,所以HttpServlet中实现了service()方法,并将请求ServletRequest、ServletResponse 强转为HttpRequest 和 HttpResponse。

参考:Servlet 生命周期、工作原理

网页定时刷新

1).JSP中页面定时刷新:
<%
   //页面每隔30秒自动刷新一遍
   response.setHeader("refresh","30");
%>

2).JSP中页面定时刷新至另一个指定页面:
<%
    //页面每隔30秒自动链接至另一页面
    response.setHeader("refresh","30;URL=http://www.sina.com");
%>

3).设置html meta标签刷新:
<meta http-equiv="refresh" content="30">

JSP生成静态HTML

/**
 * @file_name 文件名及文件之后的参数.最好为a.jsf?fileId=aaaa
 * @path 文件所在的路径.相对于根目录而言的.
 * @realName文件要保存的名字
 * @realPath文件要保存的真实路径。默认与文件所在的目录相同。
 */
public class ToHtmlPath extends HttpServlet {
 
    public void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String url = "";
        String name = "";
 
        ServletContext sc = getServletContext();
 
        String file_name = request.getParameter("file_name");// 你要访问的jsp文件,如news.jsf。
        // file_name如:fileDetail.jsf?fileId=56.要是有参数, 只有一个参数。并且以参数名作为文件名。
        String realName = request.getParameter("realName");// 要保存的文件名。如aaa;注意可以没有这个参数。
 
        String path = request.getParameter("path");// 你要访问的jsp文件路径。如news。注意可以没有这个参数。
 
        String realPath = request.getParameter("realPath");// 你要保存的文件路径,如htmlNews.注意可以没有这个参数。
        // 下面确定要保存的文件名字。
        if (realName == null || realName == "") {
            int a = 0;
            a = file_name.indexOf("=") + 1;
            realName = file_name.substring(a);
            if (realName.indexOf(".") > 0) {
                realName = file_name.substring(0, file_name.indexOf("."));
            }
        }
        // 下面构造要访问的页面。
        if (path == null || path == "") {
            url = "/" + file_name;// 这是你要生成HTML的jsp文件,如
        } else {
            url = "/" + path + "/" + file_name;// 这是你要生成HTML的jsp文件,如
        }
        // 下面构造要保存的文件名,及路径。
        // 1、如果有realPath,则保存在realPath下。
        // 2、如果有path则保存在path下。
        // 3、否则,保存在根目录下。
        if (realPath == null || realPath == "") {
            if (path == null || path == "") {
                name = ConfConstants.CONTEXT_PATH + "\\" + realName + ".htm";// 这是生成的html文件名,如index.htm.说明:
                                                                                // ConfConstants.CONTEXT_PATH为你的上下文路径。
            } else {
                name = ConfConstants.CONTEXT_PATH + "\\" + path + "\\"
                        + realName + ".htm";// 这是生成的html文件名,如index.htm.
            }
        } else {
            name = ConfConstants.CONTEXT_PATH + "\\" + realPath + "\\"
                    + realName + ".htm";// 这是生成的html文件名,如index.htm.
        }
 
        // 访问请求的页面,并生成指定的文件。
        RequestDispatcher rd = sc.getRequestDispatcher(url);
 
        final ByteArrayOutputStream ōs = new ByteArrayOutputStream();
 
        final ServletOutputStream stream = new ServletOutputStream() {
            public void write(byte[] data, int offset, int length) {
                os.write(data, offset, length);
            }
 
            public void write(int b) throws IOException {
                os.write(b);
            }
        };
 
        final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));
 
        HttpServletResponse rep = new HttpServletResponseWrapper(response) {
            public ServletOutputStream getOutputStream() {
                return stream;
            }
 
            public PrintWriter getWriter() {
                return pw;
            }
        };
        rd.include(request, rep);
        pw.flush();
        FileOutputStream fos = new FileOutputStream(name); // 把jsp输出的内容写到xxx.htm
        os.writeTo(fos);
        fos.close();
        PrintWriter ōut = response.getWriter();
        out.print("<p align=center><font size=3 color=red>success!</font></p>");
    }
}


  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值