JSP学习

一、JSP的工作原理

1.JSP文件必须在JSP服务器内运行

2.JSP文件必须生成Servlet才能执行

3.每个JSP页面的第一个访问者速度很慢,因为必须等待JSP编译成Servlet。

4.JSP页面的访问者无须安装任何客户端,甚至不需要可以运行Java的运行环境,因为JSP页面传输到客户端的是标准HTML页面。

二、JSP注释

1.JSP注释格式:

  <%-- 注释内容 --%>

2.HTML注释格式:

  <!-- 注释内容 -->

3.两者区别:HTML注释可以通过网页源代码查看到,但是JSP的注释是无法查看到的。这表明JSP注释不会发送到客户端。

三、JSP声明

1.JSP声明用于声明变量和方法,JSP声明将会转换成对应Servlet的成员变量或成员方法。

2.JSP声明的语法格式:

  <%! 声明部分 %>

3.输出JSP表达式

  <%=表达式%>

  也就是说<%=%>代替了out.println();这句话。

4.JSP脚本

  <%脚本内容%>

在JSP脚本部分声明的变量是局部变量,不能使用private等访问控制修饰符,也不可用static修饰。由于JSP脚本将转换成_jspService方法里的可执行性代码,而Java语法不允许在方法里定义方法,所以JSP脚本里不能定义方法。

5.JSP的3个编译指令

JSP的编译指令是通知JSP引擎的消息,它不直接生成输出。编译指令都有默认值,无须为每个指令设置值。

1)page:该指令是针对当前页面的指令。

2)include:用于指定包含另一个页面。

3)taglib:用于定义和访问自定义标签。

使用编译指令的语法格式如下:

<%@ 编译指令名 属性名="属性值"...%>

6.page指令的每个属性

1)language:JSP使用的脚本语言,只支持Java。

2)extends:指定JSP页面编译所产生的Java类所继承的父类,或所实现的接口。

3)import:用来导入包。

4)session:设定这个JSP页面是否需要HTTP Session。

5)buffer:指定输出缓冲区的大小

6)autoFlush:当输出缓冲区即将溢出时,是否需要强制输出缓冲区的内容。

7)info:设置该JSP程序的信息,也可以看做其说明。

8)errorPage:指定错误处理页面。如果JSP页面在运行中抛出未处理的异常,系统将自动跳转到errorPage属性指定的页面。如果没有指定错误页面,则直接把异常信息呈现到浏览器。

9)isErrorPage:设置本JSP页面是否为错误处理程序。如果该页本身是错误处理页面,则通常无须指定errorPage属性。

10)contentType:用于设定生成网页的文件格式和编码字符集,即MIME类型和页面字符集类型。MIME类型默认是text/html;默认的字符集类型为ISO-8859-1。

11)pageEncoding:指定生成网页的编码字符集。

7.include指令

1)include编译指令的语法如下:

  <%@include file=""%>

如果被嵌入的文件经常需要改变,建议使用<jsp:include>操作指令,因为它是动态的include语句。

四、JSP的7个动作指令

动作指令与编译指令不同,编译指令在将JSP编译成Servlet时起作用;而动作指令通常可替换成JSP脚本,它只是JSP脚本的标准化写法。

1.jsp:forward:执行页面转向,将请求的处理转发到下一个页面。可以转发到HTML、JSP、Servlet页面。语法格式如下:

<jsp:forward page="index.jsp">
        <jsp:param name="age" value="12"/>
</jsp:forward>

执行forward指令时,用户请求的地址依然没有改变,但页面内容却完全变为被forward目标页的内容。

实际上,<jsp:forward:../>并没有重新向新页面发送请求,它只是完全采用了新页面来对用户生成响应——请求依然是一次请求,所以请求参数,请求属性都不会丢失。

2.jsp:include:动态include指令,它不会导入被include页面的编译指令,仅仅将被导入页面的body内容插入本页面。

静态导入和动态导入有如下三点区别:

1)静态导入是将被导入的代码完全融入,两个页面融合成一个整体的Servlet;而动态导入则在Servlet中使用include方法来引入被导入页面的内容。

2)静态导入时被导入页面的编译指令会起作用;而动态导入页面的编译指令则失去作用,只是插入被导入页面的body内容。

3)动态包含还可以增加额外的参数。

<jsp:include page="index.jsp">
        <jsp:param name="age" value="18"/>
</jsp:include>

3.jsp:useBean、jsp:setProperty、jsp:getProperty指令

1)useBean指令用于在JSP页面中初始化一个Java实例;setProperty指令用于为JavaBean实例的属性设置值;getProperty指令用于输出JavaBean实例的属性。

2)useBean的语法格式:

<jsp:useBean id="name" class="classname" scope="application"/>

id属性是JavaBean的实例名,class属性确定JavaBean的实现类。scope属性用于指定JavaBean实例的作用范围,该范围有4个值:page、request、session、application。

3)setProperty格式:

<jsp:setProperty name="name" property="name" value=""/>

name属性确定需要设定JavaBean的实例名,property属性确定需要设置的属性名;value属性则确定需要设置的属性值。

4)getProperty格式:

<jsp:getProperty name="name" property=""/>

其中name属性确定需要输出的JavaBean的实例名;property属性确定需要输出的属性名。

4.plugin指令,现在一般没有用了。

5.jsp:param指令,用于设置参数值,这个指令本身不能单独使用,可以与以下3个指令结合使用:jsp:include、jsp:forward、jsp:plugin。

当与include结合使用时,param指令用于将参数值传入被导入的页面;

当与forward结合使用时,param指令用于将参数值传入被转向的页面;

当与plugin指令结合使用时,将参数传入页面中的JavaBean实例或Applet实例。

五、JSP脚本中的9个内置对象

1.application:javax.servlet.ServletContext的实例,该实例代表JSP所属的Web应用本身。

2.config:javax.servlet.ServletConfig的实例,该实例代表该JSP的配置信息。

3.exception:java.lang.Throwable的实例,该实例代表其他页面中的异常和错误。只有当页面是错误处理页面,即编译指令page的isErrorPage属性为true时,该对象才可以使用。

4.out:javax.servlet.jsp.JspWriter的实例,该实例代表JSP页面的输出流,用于输出内容,形成HTML页面。

5.page:代表该页面本身,通常没有太大用处。也就是Servlet中的this,其类型就是生成的Servlet类,能用page的地方就可以用this。

6.pageContext:javax.servlet.jsp.pageContext的实例,该实例代表该JSP页面上下文,使用该对象可以访问页面中的共享数据。

7.requst:javax.servlet.http.HttpServletRequest的实例,封装一次请求。

8.response:javax.servlet.http.HttpServletResponse的实例,代表服务端对客户端的响应,常用于重定向sendRedirect()

9.session:javax.servlet.http.HttpSession的实例,代表一次会话。

JSP内置对象只能在JSP脚本、JSP输出表达式中使用这些内置对象。千万不要在JSP声明中使用他们。

六、4大作用域

1.application:对于整个web应用有效

2.session:仅对一次会话有效。

3.request:仅对本次请求有效

4.page:仅对当前页面有效,只可以被当前页面的JSP脚本、声明部分访问。

JSP中的application、session、request、pageContext分别对应以上4大作用域。

Servlet中的ServletContext对应application作用域。ServletContext sc=getServletConfig().getServletContext();

1)application作用:

  让多个jsp、Servlet共享数据

  获得Web应用配置参数

七、重定向与转发的区别:

1.重定向会丢失所有的请求参数和request范围的属性,因为重定向将生成第二次请求,与前一次请求不在同一个request范围内,所以发送一次请求的请求参数和request范围的属性全部丢失。

2.重定向:response.sendRedirect("redirect-result.jsp");

3.转发:<jsp:forward/>或request.getRequestDispatcher("/地址").forward();

4.重定向时地址栏会发生改变,会变成重定向的页面地址,而转发不会。

八、增加Cookie的步骤:

1.创建Cookie实例,Cookie的构造器为Cookie(String name, String value)。

2.设置Cookie的生命期限,即该Cookie在多长时间内有效。setMaxAge(毫秒)。

3.向客户端写Cookie。response.addCookie(Cookie对象)。

4.访问客户端Cookie使用Request对象,getCookies()方法。

默认情况下,Cookie不支持中文,如果需要使用中文可以使用java.net.URLEncoder对其进行编码。

九、session对象

session对象代表一次用户会话。一次用户会话的含义是:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开为止,这个过程就是一次会话。一旦关闭浏览器,即session结束,session范围内的属性将全部丢失。

十、JSP/Servlet的生命周期

创建Servlet实例有两个时机:

1.客户端第一次请求某个Servlet时,系统创建该Servlet的实例:大部分的Servlet都是这种Servlet。

2.Web应用启动时立即创建Servlet实例,即load-on-startup Servlet。

配置load-on-startup的 Servlet有两种方式,web.xml文件和注解方式,这个整型值越小,Servlet就越先实例化。

十一、JSP 2的自定义标签

在JSP2中开发标签库只需要如下几个步骤:

1.开发自定义标签处理类;自定义标签类应该继承自javax.servlet.jsp.tagext.SimpleTagSupport类,如果标签包含属性,每个属性都有对应的getter和setter方法。重写doTag()方法,这个方法负责生成页面内容。

2.建立一个*.tld文件,每个*.tld文件对应一个标签库,每个标签库可包含多个标签。

3.在JSP文件中使用自定义标签。

十二、Filter

使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

创建Filter只需要两个步骤:

1.创建Filter处理类,必须实现javax.servlet.Filter接口。

2.web.xml文件中配置Filter。

Filter实例代码:

package com.yly.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 对所有的请求都进行过滤
 * Created by qianxiang on 15/8/2.
 */
@WebFilter(filterName = "AuthorityFilter",
        value = "/*",
        initParams = {
                @WebInitParam(name = "encoding", value = "GBK"),
                @WebInitParam(name = "loginPage", value = "/login.jsp"),
                @WebInitParam(name = "proLogin", value = "/proLogin.jsp")
        })
public class AuthorityFilter implements Filter {
    //FilterConfig可用于访问Filter的配置信息
    private FilterConfig config;

    /**
     * 实现销毁方法
     */
    public void destroy() {
        this.config = null;
    }

    /**
     * 执行过滤的核心方法
     *
     * @param req
     * @param resp
     * @param chain
     * @throws ServletException
     * @throws IOException
     */
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //获取该Filter的配置参数
        String encoding = config.getInitParameter("encoding");
        String loginPage = config.getInitParameter("loginPage");
        String proLogin = config.getInitParameter("proLogin");
        //设置Request编码用的字符集
        req.setCharacterEncoding(encoding);
        HttpServletRequest request = (HttpServletRequest) req;
        HttpSession session = request.getSession();
        //获取客户请求的页面
        String requestPath = request.getServletPath();
        //如果session范围的user为null,即表明没有登录且用户请求的既不是登录页面也不是处理登录的页面
        if (session.getAttribute("user") == null
                && !requestPath.endsWith(loginPage)
                && !requestPath.endsWith(proLogin)) {
            //forward到登录页面
            request.setAttribute("tip", "您还没有登录");
            request.getRequestDispatcher(loginPage).forward(req, resp);
        } else {
            //放行请求
            chain.doFilter(req, resp);
        }
    }

    /**
     * 实现初始化的方法
     *
     * @param config
     * @throws ServletException
     */
    public void init(FilterConfig config) throws ServletException {
        this.config = config;
    }

}

十三、使用URL Rewrite实现网站伪静态

对于Java Web应用来说,要实现伪静态非常简单:可以通过Filter拦截所有发向*.html请求,然后按照某种规则将请求forward到实际的*.jsp页面即可。现有的URL Rewrite开源项目为这种思路提供了实现。

http://www.tuckey.org/urlrewrite/下载URL Rewrite开源项目

十四、Listener

步骤:

1.定义Listener实现类

2.配置

十五、表达式语言

1.表达式语言的语法格式是:${expression}

2.表达式语言支持算数运算符和逻辑运算符

3.表达式语言的11个内置对象:

1)pageContext:与JSP的pageContext内置对象相同。

2)pageScope:获取page范围的属性值

3)requestScope:用于获取Request范围的属性值

4)sessionScope:用于获取session范围的属性值

5)applicationScope:用于获取application范围的属性值

6)param:用于获取请求的参数值

7)paramValues:用于获取请求的参数值,与param的区别在于,该对象用于获取属性值为数组的属性值。

8)header:用于获取请求头的属性值。

9)headerValues:用于获取请求头的属性值,与header的区别在于,该对象用于获取属性值为数组的属性值。

10)initParam:用于获取请求Web应用的初始化参数。

11)cookie:用于获取指定的Cookie值。

原文地址:https://www.cnblogs.com/FlySheep/p/4696295.html