• Jsp 1—— 概述


    JSP(JavaServer Page)是基于java语言实现的服务器端页面,JSP是JavaEE规范之一。 

    JSP文件通常存放在什么位置?

    JSP可以放到WEB-INF目录外,目前我们开发小程序可以这么做。但是在实际开发中,有很多项目是将JSP放到WEB-INF目录中,保护JSP,在WEB-INF目录中的数据相对安全。

    虚拟路径

    将web项目配置到webapps以外的目录

    方法一:在conf/server.xml的host标签中配置,然后重启Tomcat

    docBase="(实际路径)"    path="(虚拟路径、绝对路径、相对路径)"

    方法二:在 F:Program Filesapache-tomcat-9confCatalinalocalhost 中新建 “项目名.xml” 中新建一行,同上。 

    虚拟主机

    通过www.test.com访问本机

    在 CATALINA_HOME/conf/server.xml 中配置

    <Engine name="Catalina" defaultHost="www.test.com">

      <Host appBase="项目存在的真实路径,一般为webapps" name="www.test.com">

        <Context docBase="同上面的appBase" path="/">

      </Host>

    .....

    然后在hosts文件中将127.0.0.1 映射到www.test.com上

    • www.test.com
    • host找映射关系
    • server.xml找Engine的defaultHost
    • 通过"/"映射到真实路径

    JSP文件后缀是.jsp,但是JSP文件的后缀也可以修改的,通过CATALINA_HOME/conf/web.xml文件。

    JS和JSP的区别:

    • JS:JavaScript运行在浏览器中,和服务器没有关系,和java也没有关系
    • JSP:JavaServer Pages运行在服务器中,JSP底层就是java程序,运行在JVM中。

    JSP的运行原理及本质

    用户在浏览器地址栏上输入http://localhost:8080/PrjStudyJsp/index.jspweb服务器判断用户请求的资源是PrjStudyJsp应用中的index.jsp页面,web服务器在PrjStudyJsp应用中找到index.jsp,访问JSP,其实底层还是执行.class中的文件。Tomcat内置了一个JSP翻译引擎,专门负责翻译jsp文件,编译java源文件。启动JSP翻译引擎,将index.jsp翻译成index_jsp.java文件,并且将index_jsp.java文件编译生成index_jsp.class字节码文件,将其存储在Tomcat服务器work目录中。

    在JSP文件中编写的所有HTML、CSS、JavaScript,对于JSP来说只是普通的字符串。被翻译到:out.write("翻译到这里");

    jsp也是单实例多线程环境下运行的一个Servlet对象。index_jsp.class类继承了HttpJspBaseHttpJspBase继承了HttpServlet,所以JSP本质上就是Servlet,和Servlet完全相同。Jsp和Servlet本质上没有区别,但是JSP和Servlet它们的主要职责是有区别的:JSP主要是提取数据做页面展示,而Servlet主要完成业务逻辑处理以及资源跳转。Servlet是Controller(控制层),JSP是View(展示层)。项目开发中只使用JSP也可以完成开发,因为JSP最终也是一个java类,可以在JSP中编写JDBC等其他程序,但是这样做就违背了设计原则,我们要把的主要职责凸显出来,它的弱点我们还是要尽量避让的。(JSP和Servlet都是单实例多线程的环境下运行的,JSP和Servlet中出现的实例变量、静态变量都会存在线程安全问题。)

    JSP有三个阶段:翻译(一次),编译(一次),运行(多次)。

    只有用户第一次访问这个JSP或者JSP页面被修改了,才会重新翻译。JSP更改,不需要重启服务器,也不需要重新部署项目。但是,jsp文件第一次访问的时候非常慢,因为它需要

    • 启动JSP翻译引擎
    • 需要一个翻译的过程
    • 需要一个编译的过程
    • 需要Servlet对象的创建过程
    • init方法调用
    • service方法调用.....

    第2+次访问JSP的时候非常快?

    • 不需要重新翻译
    • 不需要重新编译
    • 不需要创建Servlet对象
    • 直接调用Servlet对象的service方法

    jsp文件在什么时候会被重新翻译?怎么确定jsp文件修改了呢?

    • jsp文件被修改之后会被重新的翻译
    • Tomcat服务器会记录jsp文件的最后修改时间。

    JSP基础语法

          JSP文件以.jsp/.jspx结尾,通常存放在和HTML资源同级目录中,在JSP文件中编写的普通字符串,以后翻译成Servlet程序后直接使用out.write()方法将该字符串响应给浏览器。所以我们必须在JSP文件中编写一些特殊的符号,和jsp文件中的普通文本加以区别,这样jsp引擎就会根据不能的符号将其翻译到Servlet类中的不同位置。

      1、scriptlet(小脚本)

    在jsp文件中使用 <%  %>,出现在该符号内的java程序翻译之后会被存放在Servlet的service方法中。所以在该符号内只能编写java语句或者定义局部内部类(通常很少使用局部内部类),每一个java语句以“;”结尾,在这个符号中的程序大家就当做在service方法中编程一样就行了。在该符号中声明的变量属于局部变量。所以不能使用访问控制权限修饰符修饰。

      2、declaration(声明)

     在jsp文件中使用<%! %>,出现在该符号内的java程序翻译之后会被存放在和Servlet的service方法并列的位置上。所以可以在该符号内声明静态变量、静态方法、静态代码块、实例代码块、实例变量、实例方法,大家就当做在类体中直接编码就可以了,所以声明的变量、方法都是可以使用访问控制权限修饰符修饰的。

      3、expression(表达式)

    <%= %> 等同于 out.print();

    <%="Hello World!"%> 等同于 out.print("Hello World!");

    <%=1+1%> 等同于 out.print(1+1);

    <%="1+1"%> 等同于 out.print("1+1");

    <%= %>中的代码不能以“;”结尾,否则就 out.print(xxx;);显然是没有这种语法的。

      4、指令(directive)

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

      作用:为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分

      5、page指令  <%@page  %>

      import属性(翻译生成java语言中的import语句)

    <%@page import=”java.util.Date,java.util.ArrayList”%>

      contentType属性(指定JSP页面响应内容类型)

    <%@page contentType=”text/html”%>

      pageEncoding属性(指定JSP页面响应的页面字符编码)

    <%@page pageEncoding=”GB18030”%>

      session属性(指定当前JSP页面是否可以使用session这个内置对象)

    <%@page session=”false”%>  session内置对象不可用

    <%@page session=”true”%> session内置对象可用(缺省的)

      errorPage属性(指定当前JSP页面发生错误之后跳转的资源路径)

      isErrorPage属性(指定当前JSP页面是一个错误页面,这样才能使用内置对象exception)

      isELIgnored属性指定当前页面中如果有EL表达式是否忽略,true表示忽略,false表示不忽略

      6、include指令  <%@include  %>

    <%@include file=”filePath”%>

    include指令表示静态包含,例如在a.jsp中编写了<%@include file=”b.jsp”%>,就表示将a.jsp翻译之后的java源程序和b.jsp翻译生成的java源程序合并在一起,然后将其编译生成一个.class文件。我们通常采用这种方式做到页面的重复使用,例如web站点中每一个页面都有相同的头和相同的尾,我们可以单独将头和尾定义成单独的jsp文件,在我们使用的时候直接使用include引入即可,这样可以大大减少重复代码。但是需要引起注意的是,两个java源程序合并成一个java源程序,必须保证这两个java源程序中没有相同变量的定义。因为在同一个域中变量名是不能重名的。

    7、taglib指令   <%@taglib   %>

    为了让JSP看起来更加的专业(只做页面展示),减少jsp页面中java代码的数量,我们引入了标签库,使用了标签库之后JSP程序中不再出现太多的java程序了,这样JSP页面看起来主要工作就是页面展示。大家设想在JSP页面中有大量的java程序暴露,那么我们维护起来也是很困难的。(egov项目中讲解)

      8、动作(Action)

        a)forward动作

    <jsp:forward page=”/2.jsp” />

        转发:等同Servlet中request.getRequestDispatcher(“/2.jsp”).forward(req,resp)方法。

        b)include动作

    <jsp:include page="/b.jsp"></jsp:include>

    include动作表示动态包含,假如在a.jsp页面中编写了以上代码,运行原理是将a.jsp文件翻译成java源程序并且将其编译生成a.class文件,将b.jsp文件翻译生成java源程序,编译生成b.class文件,然后通过a.class去动态包含b.class。在  a.jsp和b.jsp页面中可以有相同的变量名,因为他们在执行的时候表示a.class中的方法调用b.class中的方法,这些变量即使重名,它们也不属于同一个域。

        c)useBean、setProperty、getProperty动作(作为了解!)

    <useBean id=”c” class=”完整类名” scope=”page/request/session/application” />

    <setProperty name=”c” property=”name” value=”jack” />

    <getProperty name=”c” property=”name” />

    useBean、setProperty、getProperty动作是为了简化在JSP页面中的java代码,创建java对象为useBean动作,读取对象的某个属性的值为getProperty,修改对象某个属性值为setProperty。这些动作都是建立在javabean规范基础之上的,例如setProperty动作底层实际上调用了setter方法,getProperty动作底层实际上调用了getter方法,而useBean动作则使用反射机制实例化java对象。简单概述javabean规范:

    • JavaBean 类必须是一个公共类,并将其访问权限设置为 public
    • JavaBean 类必须有一个空的构造函数:类中必须有一个不带参数的公用构造器,此构造器也应该通过调用各个特性的设置方法来设置特性的缺省值。
    • 一个javaBean类不应有公共实例变量,类变量都为private
    • 持有值应该通过一组存取方法(getXxx 和 setXxx)来访问:对于每个特性,应该有一个带匹配公用 getter 和 setter 方法的专用实例变量
    • javabean又被叫做PO、POJO、VO、DTO等,通常开发存储在叫做entity或者bean包中。

    9、九大内置对象

    • outJspWriter
    • responseHttpServletResponse
    • configServletConfig
    • pageContextPageContext
    • requestHttpServletRequest
    • sessionHttpSession
    • applicationServletContext
    • exceptionThrowable
    • pagethis (HttpJspBase) 很少用

    10、四个范围对象(从小范围到大范围):pageContext、request、session、application

    pageContext对象代表jsp页面上下文对象。通过pageContext对象可以获取整个JSP页面环境中的所有数据。例如:

    • 获取当前JSP页面中的请求对象:pageContext.getRequest()。
    • 获取当前JSP页面中的会话对象:pageContext.getSession()。
    • 获取ServletContext对象:pageContext.getServletContext()。

    pageContext对象传递数据:

    • pageContext.setAttribute(“username”,jack); //存
    • pageContext.getAttribute(“username”); //取

    只能存储一个页面中的数据,无法跨页面。可以获取include指令包含的jsp页面中存储的数据,但是不能获取include动作包含的jsp页面中存储的数据。

    使用pageContext对象往request,session,application对象中存储数据。

    a)向request范围存储数据:

    pageContext.setAttribute(“username”,”jack”,PageContext.SESSION_SCOPE);

    b)向session范围存储数据:

    pageContext.setAttribute(“username”,”jack”,PageContext.SESSION_SCOPE);

    c)向application范围存储数据:

    pageContext.setAttribute(“username”,”jack”,PageContext.APPLICATION_SCOPE);

    转载请注明出处:https://www.cnblogs.com/stu-jyj3621
  • 相关阅读:
    centos 7修改时间为中国时间
    颜色表及html代码
    前端日志监控体系
    测试开发必备技能:安全测试漏洞靶场实战
    Jmeter(三)----win10系统下如何修改Jmeter字体大小?
    Jmeter(二) ---Jmeter英文版本修改为中文
    Jmeter(一) ---Windows环境搭建
    跟着高手学复盘_初步理解
    小测试对 HTTP/2 的了解
    软件测试入坑建议
  • 原文地址:https://www.cnblogs.com/stu-jyj3621/p/14376740.html
Copyright © 2020-2023  润新知