• JSP知识回顾


    由于种种原因吧,JSP 好久没有使用了,导致自己现在用的时候忘记了不少。

    首先回顾下基本概念吧。

    (一)他有九大内置对象(很重要,我面试好多家都有这题尤其问session 和application的区别):

    request

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

    response

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

    session

    1.什么是session:从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间反复连接,反复刷新一个页面,服务器应当通过某种办法知道这是同一个客户,这就需要session对象。
    2.session对象的ID:当一个客户首次访问服务器上的一个JSP页面时,JSP引擎产生一个session对象,同时分配一个String类型的ID号,JSP引擎同时将这个ID号发送到客户端,存放在Cookie中,这样session对象和客户之间就建立了一一对应的关系。当客户再访问连接该服务器的其他页面时,不再分配给客户新的session对象,直到客户关闭浏览器后,服务器端该客户的session对象才取消,并且和客户的会话对应关系消失。当客户重新打开浏览器再连接到该服务器时,服务器为该客户再创建一个新的session对象。
    3.session对象存在一定时间过期问题,所以存在session中的名值对会在一定时间后失去,可以通过更改session有效时间来避免这种情况。同时编程时尽量避免将大量有效信息存储在session中,request是一个不错的替代对象。

    application

    1.什么是application:
    服务器启动后就产生了这个application对象,当客户在所访问的网站的各个页面之间浏览时,这个application对象都是同一个,直到服务器关闭。但是与session不同的是,所有客户的application对象都是同一个,即所有客户共享这个内置的application对象。
    2.application对象常用方法:
    (1)public void setAttribute(String key,Object obj): 将参数Object指定的对象obj添加到application对象中,并为添加的对象指定一个索引关键字。
    (2)public Object getAttribute(String key): 获取application对象中含有关键字的对象。

    out

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

    page

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

    config

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

    exception

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

    pageContext

    pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
     (二)JSP页面如何被JSP处理程序servlet处理呢?
                 简而言之,JSP处理程序servlet通过分析JSP页面,把它翻译成一个servlet类(称为JSP页面实现类),然后对该servlet类进行编译、加载和实例化。当有客户端请求到来时,容器使用request和response对象来调用它的service()方法为请求服务
    (三)JSP页面内容可以分为两种类型。
    一种是能够被容器识别的标记单元,如<%out.println(“hello”);%>,它要求容器在翻译时要进行特殊的处理,称这类标记单元为元素(elements);
    另外一种就是类似“<html>”这样的,对容器没有特殊意义的内容,叫做模板数据(Template Data)
    在JSP页面中,共有3种类型的元素,即指示元素(Directive Elements)、行为元素(Action Elements)和脚本元素(Scripting Elements)
     A 脚本元素
    的作用就是在JSP页面中嵌入脚本语言代码.JSP的脚本语言是Java
    •脚本元素分为3种类型:
    –声明
    –表达式
    –脚本片断(scriptlet)
    _注释
    在把JSP页面翻译成页面servlet的时候,根据脚本元素的不同类型,它们在页面servlet中的位置是不同的。下面的代码说明了这个位置情况:
    public class JspPageServlet extends HttpJspBase{
              //声明被插入在这个地方
     public void _jspService(…)…{
               //表达式和脚本片断被插入在这个地方
    }
    }
    ——声明:
    语法:
    <%!  Java声明语句  %>
    •说明:
    –声明用来定义实例变量、类变量以及自定义方法。这些实例变量、类变量和方法在整个JSP页面的任何地方都可以访问
    –可以在一对声明标记中嵌入多条声明语句,语句与语句之间用分号隔开。例如:
    •<%! float farenheit=32.0; String tempScale=“F”; %>
    –声明并不产生可见的输出,它们经常与表达式和脚本片断结合使用
    •再看一个声明的例子:
    –<%! private int hitCount=1;
           private Data start=new Date();
          private int getHitCount(){

                      return hitCount++Z;

                    }

    –%>
    这里我们可以声明一个方法!
    ——表达式:
    语法:
    –<%=  Java表达式  %>
    •说明:
    –表达式用于求值计算,其结果将被显示在客户端浏览器中
    –表达式不用分号结束。例如:
    <%= new java.util.Date() %>
    当JSP页面被翻译成页面servlet时,表达式被放到_jspService()方法的out.print()语句中,从而来产生输出。例如,对上面的表达式,将生成如下代码:
    •out. print(new java.util.Date());
    ——脚本片段:
    语法:
    –<%  Java语句片断  %>
    说明:
    可以在脚本片断中嵌入任何合法的Java语句,这些语句在翻译成JSP页面实现类后,按照脚本片断在页面中出现的顺序,都将被直接添加到_jspService()方法中
    在<%和%>组成的标记对中,只能出现Java语句,其它东西都是非法的
    与表达式不同的是,脚本片断不自动生成返回给客户的输出。如果希望的话,可以使用out隐含对象生成输出
    ——注释
    •客户端的注释
    –     <!--

                  <%= 1+1 %>

                  -->

    •服务器端注释
    –    <%--
    –           <%= 1+1 %>
    –    ---%>
    •脚本代码注释
    –<%

         //脚本代码中的单行注释

         /*多行注释*/

    –        /**  文档  **/
    – %>
     
    B 指令元素(有时叫指令标签)
            page include taglib
           基本语法为:

                    <%@  指令名称  属性=“值”  属性2=“值2” …….%>

                  Page 指令

                   page指令位于Jsp页面的开头部分,顾名思意,page指令主要用于设置页面的各种属性,例如指定编写使用的语言,要导入的包等。

              

                include指令

       include指令主要用于将一个html页面或是一个Jsp 页面包含到一个页面里
      格式:<%@ include file=“inc.jsp”%>
      好处:可以重用一个多次被用到的页面,而不必写多次

                  taglib 指令

      声明:
         <%@ taglib uri=“目录” prefix=“前缀名”%>
      使用:
      <前缀名:标签名 属性=“值” 属性2=“值2” />
      例子:

                 <%@taglib uri=“http://java.sun.com/jstl/core” frefix=“c”>

                  <c:out value=“welcom”/>

             C 行为指令(动作标签) 

         动作元素与指令元素的不同在于动作元素是在请求处理阶段才起作用。

       格式:<jsp:动作名称 属性=“值” 属性2=“值2”>
       容器在处理jsp页面时,每遇到这样的动作元素,都会根据它的标记进行特殊处理
      <jsp:param>      <jsp:include>      <jsp:forward> <jsp:setProperty>      <jsp:getProperty>    <jsp:useBean>
            <jsp:forward>
        此操作允许将请求转发到另一个jsp,servlet或者是静态页面上。
           一般多用于登陆页面,进行验证后,通过就把页面转到成功页面进行下去,相反回到登录页面
        基本语法:
        <jsp:forward page=“url” />
        这个元素可以将参数或者属性带到跳转后的页面
          <jsp:include>
        作用是在jsp页面里包含静态或动态的页面
        基本语法:
        <jsp:include page=“url”>
     
    这里的include和指令元素中的include有什么不同呢?(这个面试时也常问道)
           

    执行时间上:

    <%@ include file=”relativeURI”%> 是在翻译阶段执行

    <jsp:include page=”relativeURI” flush=”true” /> 在请求处理阶段执行.

    引入内容的不同:

    <%@ include file=”relativeURI”%>引入静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一起.

    <jsp:include page=”relativeURI” flush=”true” />引入执行页面或servlet所生成的应答文本.

    另外在两种用法中file和page属性都被解释为一个相对的URI.如果它以斜杠开头,那么它就是一个环境相关的路径.

    将根据赋给应用程序的URI的前缀进行解释,如果它不是以斜杠开头,那么就是页面相关的路径,就根据引入这个文件的页面所在的路径进行解释。

    需要注意的是下面这句:

    <%@ page language=”java” contentType=”text/html;charset=gb2312”%>    如果是指令标签加入另一个页面时要去掉relativeURI 里的这句话,否则会报505   
    如果是动作标签加入的话要填上这句话,否则会出现中文乱码
     
    <jsp:param>
      此标签常和<jsp:include>和<jsp:forward>
      基本语法:

                <jsp:param name=“名” value=“”/>

      例子:

          <jsp:forward page=“next.jsp”>

        些操作符用来以”名-值”对的形式为其他标签提供附加信息.

          <jsp:param name=“state” value=“admin”/>

          </jsp:forward>

     <jsp:useBean>
    些标签用来在jsp页面中创建一个Bean实例(类的对象),并指定对象名和做用范围
    基本语法:
    <jsp:useBean id=“名字” scope=“做用范围” Class=“Bean” />
    scope 的范围是上面内置对象的request,response,application,page
     
     
     
    (三) Servlet
    a 新建一个servlet 的时候需要继承HttpServlet
      在WEB-INF 下的web.xml 里会生成
    <servlet>
        <description>This is the description of my J2EE component</description>
        <display-name>This is the display name of my J2EE component</display-name>
        <servlet-name>LonginServlet</servlet-name>
        <servlet-class>com.servlet.LonginServlet</servlet-class>
      </servlet>
    
      <servlet-mapping>
        <servlet-name>LonginServlet</servlet-name>
        <url-pattern>/servlet/LonginServlet</url-pattern>
      </servlet-mapping>

     也可以配置servlet的加载时间:

     <servlet>

      <servlet-name>number1</servlet-name>

      <servlet-class>com. LoginServlet</servlet-class>

      <load-on-startup>10</load-on-startup>

    </servlet>

    下面是我写的一个Servlet

    package com.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import com.entity.User;
    import com.service.LoginService;
    import com.service.dao.LoginServiceDao;
    
    public class LonginServlet extends HttpServlet {
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html");
            HttpSession hs = request.getSession();
            User user = (User) hs.getAttribute("user");
            if (user == null) {
                user = new User();
                try {
                    String userName = request.getParameter("userName");
                    String passWord = request.getParameter("passWord");
                    user.setUserName(new String(userName.getBytes("iso-8859-1"),
                            "utf-8"));
                    user.setPassWord(passWord);
                    LoginService loginService = new LoginServiceDao();
                    boolean isMember = loginService.isMember(user);
                    if (isMember) {
                        request.getRequestDispatcher("../main.jsp").forward(
                                request, response);
                    } else {
                        request.getRequestDispatcher("../login.jsp").forward(
                                request, response);
                    }
                } catch (Exception e) {
                    request.getRequestDispatcher("../login.jsp").forward(request,
                            response);
                }
    
            } else {
                request.getRequestDispatcher("../main.jsp").forward(request,
                        response);
            }
    
        }
    
    }

    Servlet的过滤器:

  • 相关阅读:
    Spark 基本概念及入门
    Cron 表达式详解
    VmWare 网络模式
    微信、支付宝各种支付退款
    Spring Security OAuth2 SSO 单点登录
    Git 入门详解
    基于Spring Boot 2.x 的 Spring Cloud Admin 实践
    Git 提交规范
    Linux 安装 Mysql8.0
    Docker入门
  • 原文地址:https://www.cnblogs.com/tomcattd/p/2935973.html
Copyright © 2020-2023  润新知