• jsp详解(3个指令、6个动作、9个内置对象、11个隐式对象)


    jsp概述
    SP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP实际上就是Servlet。    jsp=html+java

    jsp包含3个指令,6个动作,9个内置对象。

    html:静态内容

    servlet:服务器端的小应用程序。适合编写java逻辑代码,如果编写网页内容--苦逼。

    jsp:适合编写输出动态内容,但不适合编写java逻辑。

    所以开发中常使用servlet做为控制器,重点是编写java逻辑;jsp作为代码显示模板,重点是显示数据。

    jsp原理
    浏览器在访问服务器的某个应用下的jsp文件时,服务器会把这个jsp文件翻译为java文件然后编译成class文件(字节码文件),服务器底层执行字节码文件。生成的java文件和class文件存在于tomcat目录下的work/Catalina...下的项目目录中。生成时间是浏览器访问服务器的时候。

    生成的java文件继承了org.apache.jasper.runtime.HttpJspBase类。而这个HttpJspBase类继承了HttpServlet类。所以我们可以说jsp就是Servlet。

    服务器怎么处理jsp文件中的标签?   服务器才不会去解读html标签!他会将标签通过out.write()方法通过http协议写给客户端。如下图所示:

    服务器怎么处理java代码?   直接执行,将执行结果通过out.write()方法写给客户端。

    jsp最佳实践
    jsp建议少些java代码,纯业务逻辑写在jsp中会造成服务器做不必要的操作,我们可以在jsp中写入普通java代码,我们把业务逻辑一般写在Servlet中。例如:我们写一个Login小项目,需要与用户交互的表单页面我们用jsp写,业务逻辑如判断用户合法性我们用Servlet写。

    有的时候我们的jsp中可以不含有任何的java代码,这样的文件是可以被html替代的。但是jsp的好处是,我们需要回显消息的时候,就需要在页面上接收回显消息,因为jsp可以写java代码的原因,就不再使用html了。

    JSP基础
    基本语法
    jsp的脚本
    小脚本的格式:

    <%

       //脚本内容java代码

    %>

    表达式格式:

    <%=表达式 %>    

    通过对编译后的java文件分析发现,表达式脚本的底层就是<% 定义变量的语句;  out.write(变量) %>

    比如下面两个代码块的输出是相同的:

    <% int i=10;
    out.print(i);
    %>
    <%=i%>
    等于说表达式中的值在底层就是传入print()的参数中,所以定义表达式的时候结尾是不加分号的。

    声明格式:

    <%!  %>   表示定义全局变量和静态代码块,也可以声明方法。

    成员变量我们直接在<%    %>中定义即可。

    <%! %>是我们用来声明全局变量、创建静态代码块、声明方法的地方。

    <% %>相当于是一个方法,所以不能在这里声明方法,在这里定义的变量也是局部变量。

    <%=10%>相当于是out.print(10);的作用,将表达式10发送给客户端。

    jsp注释
    jsp文件中包含html的结构,当然可写html注释:<!-- -->。html注释可以在客户端源码中看到,是不安全的;并且是服务器write过来的,耗流量。

    jsp注释:<%-- --%> 。jsp注释不能在客户端看到,是安全的。不发送给客户端,是不耗流量的。

    jsp指令(3个)
    JSP指令(directive)是为JSP引擎设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。

    JSP2.0规范中共同定义了三个指令:page指令、include指令、taglib指令

    page指令
    jsp指令基本语法格式:<%@ 指令 属性名="值" %>   如果一个指令中有多个属性,那么多个指令可以写在一个指令中,也可以写在多个指令中。例如:

    例如:

      <%@ page contentType="text/html;charset=gb2312"%>

      <%@ page import="java.util.Date"%>

      也可以写作:

      <%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>

    jsp2.0中规定中定义page指令的完整语法(下面给出的都是默认值):

    <%@ page

      [ language="java" ]     目前只支持java语言

      [ extends="package.class" ]           因为是单继承,所以我们最好不要写这个指令,除非自己写的比HttpJspBase等类好!

      [ import="{package.class | package.*}, ..." ]   用来导包,多包用逗号隔开

      [ session=“true | false” ]//true创建session对象

      [ buffer="none | 8kb | sizekb" ] 

      [ autoFlush="true | false" ]   是否开启自动刷新功能

      [ isThreadSafe=“true | false” ] false才继承SingleThreadModel接口,线程安全问题将变量写成局部变量即可。上面方法过时了。

      [ info="text" ]

      [ errorPage="relative_url" ]    如果网页出现500错误,跳转到指定url

      [ isErrorPage="true | false" ]    如果是true则导入execption包,我们可以使用exception对象操作错误信息

      [ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] 告诉浏览器解码方式

    contentType包含在pageEncoding中,由后者可以不写前者。

      [ pageEncoding="characterSet | ISO-8859-1" ]  告诉服务器转译java文件的编码方式

      [ isELIgnored="true | false" ] 是否支持EL表达式 

    %>

    这些我们开发的时候大多只保留pageEncoding,其他取默认就行了。导包的话也是自动的。
    include指令
    包含,有静态包含和动态包含两种。

    静态包含是把其他资源包含当当前页面中,在编译(转译)之前就包含了,所以只生成了一个java文件。例如: <%@ include file="/5.jsp" %>

    转译结果bbbb...来自5.jsp文件就生成一个java文件一个class文件,java文件中有两套html标签。

    动态包含,例如:   <jsp:include page="/5.jsp"></jsp:include>     会生成两套java和class文件,因为执行到这句话的时候才包含。

    区别:编译时间不同。

    开发原则:能用动不用静。

    taglib指令
    用来导标签库。

    作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    jsp动作(6个)
    jsp动作的作用是:使用标签的形式来替代一段java代码,好处是可以让前端开发人员读懂,书写简答不带java思想。

    <jsp:include > 动态包含

    <jsp:forward> 请求转发

    <jsp:param> 设置请求参数

    <jsp:useBean> 创建一个对象

    <jsp:setProperty> 给指定的对象属性赋值

    <jsp:getProperty> 取出指定对象的属性值

    基本语句java和jsp动作给属性中变量赋值比较
    <%

            Student stu = new Student();
            stu.setName("tom");
            out.print(stu.getName());

    %>

         <jsp:useBean id="stu" class="com.aloha.entity.Student"></jsp:useBean>
         <jsp:setProperty property="name" name="stu" value="tom"/>
         <jsp:getProperty property="name" name="stu"/>
    请求转发基本语句java和jsp动作比较
    <%

    request.getRequestDispatcher("/7.jsp").forward(request, response);

    %>

    <jsp:forward page="/7.jsp"></jsp:forward>
    jsp内置对象(9个)
    指在JSP的<%=%> 和<% %>中可以直接使用的对象

    对象名

    类型

    说明

    request

    javax.servlet.http.HttpServletRequest

    response

    javax.servlet.http.HttpServletResponse

    session

    javax.servlet.http.HttpSession

    由session="true"开关

    application

    javax.servlet.ServletContext

    exception

    java.lang.Throwable

    由isErrorPage="false"开关

    page

    java.lang.Object当前对象this

    当前servlet实例

    config

    javax.servlet.ServletConfig

    out

     javax.servlet.jsp.JspWriter

    字符输出流,相当于 printWriter对象

    pageContext

     javax.servlet.jsp.PageContext

    通过这个对象可以得到其他8个对象

    标红的是域对象,pageContext只在当前页面有效,所以开发时很少用。

    pageContext本身也是一个域对象,他可以操作其他三个域对象,但是作用域只在当前页面有效。有三个主要方法:

    void setAttribute(String name,Object o);

    设置属性名,值
    Object getAttribute(String name);

    通过属性名获取属性值
    void removeAttribute(String name);

    通过属性名删除属性
    这些方法在其他页面都不好使用,pageContext提供了操作其他域对象的方法:

    void setAttribute(String name,Object o,int Scope);

    Object getAttribute(String name,int Scope);

    void removeAttribute(String name,int Scope);

    scope的值在pageContext中给出了四个字段,对应四种操作方式(见名知意好吧):

    PageContext.PAGE_SCOPE     

    PageContext.REQUEST_SCOPE

    PageContext.SESSION_SCOPE

    PageContext.APPLICATION_SCOPE

    由Servlet&Http的学习中可知,request需要请求转发建立关系。

    pageContext还提供了一个自动查找,找到就取值的方法:

    findAttribute(String name);
    这个方法会通过名字自上而下的查找传值页面的各值setAttribute的值,匹配为null继续找下一条,直到匹配到了就得到它的值并停止查找。

    四大域对象在实际开发
    PageContext : pageConext 存放的数据在当前页面有效。开发时使用较少。

    ServletRequest: request  存放的数据在一次请求(转发)内有效。使用非常多。

    HttpSession: session 存放的数据在一次会话中有效。使用的比较多。如:存放用户的登录信息,购物车功能。

    ServletContext: application 存放的数据在整个应用范围内都有效。因为范围太大,应尽量少用。

    EL表达式
    全称是expression language 表达式语言,可以简化jsp中的java语言。不是一种开发语言,是jsp中获取数据的一种规范。EL表达式的容错性好,出现语法错误时只会空输出,不会导致500错误。

    等效java的代码

    基本表达式是:${   }      底层是java代码  pageContext.findAttribute(String name)  。

    比如我们需要找User类中的name属性,有两种办法:
    ${u.name   }

    ${u['name']} == ${u["name"]} 

    [ ]的作用条件要大于“.”的,不过“.”在大多数情况下都适用。点运算符相当于是用了get方法,点后面跟的是属性名。

    运算
    empty  用来判断是否为null,空字符串和空的集合都会返回null ,则表达式返回true 。

    三元运算符  和java中类似,如果条件为ture执行冒号前的内容,如果条件为false则执行冒号后面的内容。

    <%@page import="java.util.List"%>
    <%@page import="java.util.ArrayList"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!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>Insert title here</title>
    </head>
    <body>
    <%
    String str1 = null;
    request.setAttribute("str1", str1);

    String str2 = "";
    request.setAttribute("str2",str2);

    String str3 = "abc";
    request.setAttribute("str3", str3);


    List list1 = new ArrayList();
    request.setAttribute("list1", list1);

    List list2 = new ArrayList();
    list2.add("asdf");
    request.setAttribute("list2", list2);

    int sex = 0;
    request.setAttribute("s", sex);
    %>

    ${ empty str1 } ---- true<br/>
    ${ empty str2 } ---- true<br/>
    ${ empty str3 } ---- false <br/>
    ${ empty list1 } ---- true <br/>
    ${ empty list2 } ---- false<br/>


    ${ empty list2 ? "你还没有买商品":"你卖的商品如下" }

    <input type="radio" name="sex" value="m" ${s==0 ? "checked='checked'":"" }/>男<br/>
    <input type="radio" name="sex" value="f" ${s==1 ? "checked='checked'":"" }/>女<br/>


    </body>
    </html>
    隐式对象(11个)
    EL隐式对象引用名称

    类型

    JSP内置对象名称

    说明

    pageContext

    javax.servlet.jsp.PageContext

    pageContext

    一样的

    pageScope

    java.util.Map<String,Object>

    没有对应的

    pageContext范围中存放的数据,页面范围

    requestScope

    java.util.Map<String,Object>

    没有对应的

    请求范围数据

    sessionScope

    java.util.Map<String,Object>

    没有对应的

    会话范围数据

    applicationScope

    java.util.Map<String,Object>

    没有对应的

    应用范围数据

    param

    java.util.Map<String,String>

    没有对应的

    一个请求参数

    paramValues

    java.util.Map<String,String[]>

    没有对应的

    重名请求参数

    header

    java.util.Map<String,String>

    没有对应的

    一个请求消息头

    headerValues

    java.util.Map<String,String[]>

    没有对应的

    重名请求消息头

    initParam

    java.util.Map<String,String>

    没有对应的

    web.xml中全局参数

    cookie

    java.util.Map<String,Cookie>

    没有对应的

    key:cookie对象的name值

    前面已经说了,${ }的底层是pageContent.getAttribute(String name) ,那么我们现在希望使用EL表达式获取参数parameter,该怎么搞呢?

    ————我们使用隐式对象param获取表单中的

    比如说我们需要获取userName 这个参数,那么写法为: ${param.userName } 这样的写法相当于request.getParameter(String name)。

    paramValues隐式对象获取的是值对象数组,我们可以加入角标获取想要的位置元素

    header可以取到消息头,比如我们要获得浏览器信息:  ${header["User-agent"]}

    cookie 获取cookieid的示例: ${cookie.JSESSIONID.value}

    JSTL——jsp标准标签库
    可以实现jsp页面中的逻辑处理功能。

    在JSP页面添加taglib指令

    使用JSTL标签

    核心标签库:

    > 通用标签: set、 out、 remove

      

    > 条件标签:if  choose

    > 迭带标签:foreach

    普通循环

    迭带器

    for(类型 变量名:数组或集合)

      

        c:forEach中的varStatus属性。

               指向一个字符串,该字符串引用一个对象。  map.put("vs",一个对象);

               这个对象记录着当前遍历的元素的一些信息:

                      getIndex():返回索引。从0开始

                      getCount():返回计数。从1开始

                      isLast():是否是最后一个元素

                      isFirst():是否是第一个元素

  • 相关阅读:
    未命名 1
    介绍一些实用的IOS手势识别库 (COCOS2D)
    cocos2d-x引擎实现$1Unistroke Recognizer手势识别
    【luogu P4755】Beautiful Pair(ST表)(笛卡尔树)(主席树)
    【ybtoj高效进阶 21290】头文件 D(平衡规划)(线段树)
    【ybtoj高效进阶 21289】头文件 C(图论)(dfs)
    【ybtoj高效进阶 21288】头文件 B(线段树)(图论)
    【ybtoj高效进阶 21282】数字重组(DP)(数学)
    【ybtoj高效进阶 21281】矩阵逆转(模拟)
    【ybtoj高效进阶 21280】景点距离(DP)(换根)
  • 原文地址:https://www.cnblogs.com/mark5/p/11065876.html
Copyright © 2020-2023  润新知