• Java Web基础:JSP基础概念


    JSP介绍

    • JSP全称是Java Server Pages,它和Servlet都是Sun公司定义的用于开发动态Web资源的技术,它解决了Servlet输出流排版复杂和难以维护的问题。JSP完美融合了HTML模版元素和Java代码,通过JSP写服务端输出变得和写HTML网页一样容易。
    • JSP通过涵盖HTML模版元素来简化输出排版,还提供不同的JSP标签管理不同类型的Java代码,除此之外,它还默认封装了9大隐式对象,帮助提高开发的效率。
    • JSP本质上是Servlet,当用户请求JSP时,JSP引擎(Tomcat内嵌)会自动把JSP代码转化为Servlet,并把HTML模版元素和JSP标签内容填充到Servlet中的Service方法,通过Service方法输出响应流给客户。在进行转换时,Servlet引擎也会默认的将JSP的9大隐式对象封装到service方法当中。
    • JSP页面组成:HTML,JavaScript, JSP指令,JSP脚本,JSP动作标示,JSP九大内置对象,JSTL等第三方标签库...
    • 由于JSP良好的布局性,实际开发Web应用通常采用JSP+Servlet的形式,JSP主要负责数据的展示,Servlet负责业务逻辑和数据计算。此种方式可以实现良好的代码解耦合和分层管理,也利于UI人员和后端人员并行开发。

    JSP工作原理

    JSP的本质是Java Servlet,它通过Tomcat JSP引擎将 JSP  翻译为相应的Servlet,并通过service方法来接受和响应客户请求。

    示例:tomcat容器自带的index.jsp 对应的servlet

    • 默认生成Servlet,并将JSP的内容自动填充到_jspService方法中
      • Java代码直接填充到方法中
      • HTML模版通过out.write("HTML 模版  /n") 填充到方法中,形成输出流
    • JSP引擎还自动的在_jspService方法里面生成其他对象的引用并对他们初始化,这些对象结合起来称为JSP的默认9大隐式对象,在JSP页面可以直接通过对象名进行引用.

     

    JSP九大隐式对象

    常用JSP对象

    内置对象

    说明

    request

    HttpRequest

    封装所有的请求信息,有以下几种做法:

    Ø  获取请求参数: request.getParameter(paraName);

    Ø  保存属性到请求域:request.setAttribute(String attrName,Object property);

    Ø  获取请求域中的属性:request.getAttribute(attrName),此时返回的类型是object,要在界面上显示,需要做一个类型转换

    Ø  获取cookies: request.getCookies();

    Ø  解决request中文编码乱码的问题

    session

    Session

    会话请求域

    Ø  获取session对象:Session s=request.getSession(); JSP中不用实例化session,可以直接调用session对象的各种方法。

    Ø  session域添加内容:s.addAttribute(String, Object);

    Ø  session域取内容:s.getAttribute(attrName), 返回的也是object对象,通常转化为string对象在页面显示。

    Ø  session域中移除属性:s.removeAttribute(attrName)

    Ø  使得session域过期:s.invalidate();

    session的生命周期开始于request请求,当发起request请求以后服务器自动的创建或者获取关联的session, 当浏览器关闭,session对象会被销毁。 sessionTomcat服务器下的默认生命周期是30分钟,即使不关闭浏览器,超过了session的时长,session也会被销毁。可以在web.xml中配置session的超时时间。除了以上两种方式,也可以认为的通过session.invalidate方法把session置为无效。

    Ø  session.getLastAccessTime();获取最后一次session的获取时间

    Ø  session.getMaxInactiveInterval(); 返回session的最大间隔

    Ø  session.setMaxInactiveInterval();设置session的最大间隔(即超时时间)

    application

    ServletContext

    保存全局信息,在Web应用启动时创建,在Web应用销毁时销毁。

    Ø  访问应用程序的初始化属性:application.getInitialParameter(String name)

    Ø  管理应用程序的环境属性:application.setAttribute(s.object); application.getAttribute(s);

    response

    HttpResponse

    封装http响应,向页面输出结果,指定各种输出的响应。

    Ø  重定向: response.sendRedirect(url);

    Ø  禁止缓存:(对于安全性和实时性要求较高的页面,可以禁止缓存)response.setDateHeader(“Expires”,0); response.setHeader(‘Cache-Control’’,’no-store’);

    Ø  定时刷新:response.setHeader(‘refersh’,’10’);

    Ø  定时跳转:response.setHeader(‘referesh’,’10;URL=login.jsp’);

    Ø  输出非文本内容(下载文件)response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));

    Ø  输出非文本内容(图片):  response.setContentType("image/jpeg");

    Ø  设置缓冲区大小:response.setBufferSize(32);

     

    out

    OutputWriter

    OutputStream

    out主要用于输出和管理缓冲流

    Ø  out.println(string), out.print(string)

    Ø  缓冲:out.clear(), out.clearBuffer(),out.flush();

     

              非常用JSP对象

    内置对象

    说明

    config

    ServletConfig,可以获取Servlet的初始化参数

    page

    代表JSP本身,等同于this,可以通过它获取当前JSP页面的一些属性。

    pageContext

    page运行的上下文,可以通过它获取当前页面的各种内置对象,包括request,response,session….因为JSP的内置对象可以直接使用,通过此方法来间接调用在实际开发中使用不多。

    exception

    只能用于errorPage当中(设置JSP Page指令中的isErrorPage=true),否则会抛异常,通常用于捕获最终的错误消息。

    1.       设置页面APage指令,errorPage=”pageB.jsp”

    2.       设置页面BPage指令,isErrorPage=”true”,并在B中对错误进行捕获和处理。

    3.       页面A出现了没有捕获的异常以后会跳转到页面B进行相应的处理和显示。

     

     

    JSP页面示例

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" import="java.util.*"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>第一个JSP</title>
    </head>
    <body>
        <%!//定义一个类方法,只能通过JSP申明定义方法,全局变量和静态代码块 
        public void testJSPDeclarition() {
            System.out.println("这是一个JSP申明");
        }%>
    
        <%--JSP注释,该注释并不会做为输出输出给浏览器,在JSP中应当用此注释替代Html注释<!--XXX-->,避免输出垃圾数据给客户端造成流量浪费 --%>
        当前系统时间是:
        <%--脚本表达式,可以书写遵循java规范的代码,可以在JSP中多次出现,并且会被翻译为相应Servlet中的Service方法的代码片段 --%>
        <%
            testJSPDeclarition();
            Date d = new Date();
            out.write(d.toLocaleString());
            String jspDefindedVar = "hello,i am a var generated by JSP";
            for (int i = 0; i < 2; i++) {
        %>
        <br>测试脚本片段语法和多个脚本片段组合作用
        <%
            }
        %>
        <br>
        <br> 查看前面JSP脚本片段定义的变量值:
        <%-- 脚本表达式,用于向浏览器输出数据,不以;结尾,仅用做数据输出 --%>
        <%=jspDefindedVar%>
        <br>
        <br> 查看Servlet传递过来的参数变量:
        <%=request.getAttribute("servletTransferVar")%>
    </body>
    </html>

    JSP脚本

    1.  <%       %>   JSP脚本片段,即Java代码块( Java代码直译)
    2.   <%!     %>   JSP申明
    3.  <%=     %>   JSP表达式(直接翻译成out.print)
    4. <%--    --%>  JSP 注释,此注释不在浏览器展示

    JSP脚本片段

    用于在JSP中编写和运行多行代码, 这些代码被“翻译到” service方法中,因此不能嵌套方法
    • <%  %> 只能出现严格遵循Java语法的代码,每行必须以;结束。
    • 在一个JSP页面中可以有多个脚本片段,不同的脚本片段之间可以嵌入文本,HTML标记或者其他JSP元素, 并且同一个页面之间的脚本片段可以相互访问。本质上这些脚本片段都被翻译为同一个jspService方法里的代码,方法里的变量是可以相互访问的, 但一样要遵循先定义后访问的原则。
    • 单个脚本片段在JSP中可以是不完整的,但是多个顺序结合的脚本片段必须是完整的Java代码。 

    JSP申明

    • <%!   %> JSP页面中编写的所有代码,默认都会翻译到servlet的Service方法当中,除了JSP申明。
    • JSP申明中的Java代码会被翻译到Servlet的service方法外,常常用来定义JSP转化为Servlet程序的静态代码块,成员变量或者是方法。JSP脚本片段不能用来定义方法,只有JSP申明能够用来定义方法。
    • JSP 申明必须满足Java代码规范
    • JSP默认的九大隐式对象都是Servlet Service方法里申明的方法变量,在JSP申明中不能使用这些隐式对象。

    JSP脚本表达式

    用于将程序数据输出到客户端
    <%= 变量或表达式 %>, 表达式后面不能有;。

    JSP 注释

    • <%— —%>, 需要和HTML注释区别开,实践中应该多用JSP注释少用html注释。
    • <!— —>, HTML 注释会被解析到浏览器当中,造成不必要的垃圾数据输出。 

    JSP 指令

    JSP指令是为JSP引擎设计的,它不直接产生可见输出,只是用于告诉JSP引擎如何处理JSP,JSP指令基本语法:<%@ 指令 属性名=“值” %> 。

    JSP指令

    说明

    Page指令

    <%@Page attr1=”value1” attr2=”value2” %>

     

    最常用的JSP指令,作用域是整个页面,通常用于设置JSP的全局属性,实际开发中常常放在JSP页面顶部,重点包括以下几项:

    • language=“java”, 编程语言是java
    • contentType="text/html; charset=UTF-8”, 输出给浏览器的字符编码
    • pageEnconding=“UTF-8”, JSP 页面的编码
    • import=“”,引入的Java包,JSP默认引入的Java包只有java.lang和javax.servlet.*,其余的包需要在JSP页面中用到,则需要在page指令中导入, 否则都编译不过。
    • session="true/false", 是否自动获取session。即使这里设置为false,仍然可以通过request.getSession()获取session对象
    • buffer=“none/kbSize”, 
    • isThreadSafe="true/false"
    • autoFlush="true/false"
    • errorPage="relative_url", 定位页面失败后的自动跳转页面,避免抛500带来的差用户体验。

    include指令

    <%@include file=”url” %>

    静态包含,通过url(相对地址或者是绝对地址)来包含相关的页面,include指令采用的是静态包含的方式,被包含的页面内容会直接输出到包含页面中,然后再进行统一的编译执行,因此要注意被包含页面和包含页面中不要有变量名的冲突,实际开发中,常常用来包含网站的页眉和页脚。

    taglib指令

    <%@taglib prefix=”” url=”url”%>

    引入第三方标签库,比如JSTL标签库,page指定第三方url,prefix指定在jsp页面中的前缀,通过<前缀:标签>的方式使用。

     

    JSP动作标示

    JSP动作标示

    说明

    <jsp:include/>

     

    <jsp:include page=”url”></jsp:include>

    动态包含,可以包含其他JSP页面,此包含是动态包含,当调用被包含页面时会先将被包含页面进行动态编译输出结果,然后把输出结果嵌入到包含页面中,和JSP指令中的<%@include %>不一样。

    <jsp:forward/>

     

    <jsp:forward page=“url”/> 请求转发

    <jsp:param/>

     

    <jsp:param name=“”value=“”/> 可以内嵌在jsp:forward和jsp:include中使用,用于参数传递。

  • 相关阅读:
    自我介绍
    币值转换
    打印沙漏
    对我影响最大的三位老师

    pta
    pta-3
    学习计划
    对我有影响的三个老师
    介绍自己
  • 原文地址:https://www.cnblogs.com/vivian-test/p/5928032.html
Copyright © 2020-2023  润新知