• web核心(2)jsp


    1.什么是jsp

    Jsp的本质是servlet,当用户向servlet发送请求的时候 servlet利用输出流动态的生成html页面,包含每一个静态的html和所有在html页面出现的内容

     

    2.jsp的三大指令

    1)page 指令:<%@page 属性名1=“属性值1”  属性名2=“属性值2”...%> 用于定义JSP页面的各种属性,作用于整个JSP页面

    错误页面的另一种方式是在相应的xml文件中配置

    <%@ page errorPage="/error.jsp" %> <%--错误页面跳转 是一种转发--%>

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

    <%--language="java"语言java  contentType="text/html; charset=utf-8"指定当前 JSP 页面的响应类型 相当于response.setContentType("text/html; charset=UTF-8")--%>

    <%--contentType="text/html;备注:text/plain:纯文本;text/html 纯文本的html  application/x-msexcel execl表格  application/x-msword word文件--%>

    <%@ page language="java" contentType="text/html; charset=utf-8"

        pageEncoding="utf-8" %> 

    <%--session是否可用默认为可用--%>

    <%@page session="true" %>

    <%--指定当前 JSP 页面是否可以使用 EL 表达式. 通常取值为 false--%>

    <%@page isELIgnored="true" %>

    各属性的含义

    Language:声明当前 jsp页面使用的脚本语言种类,因为页面是jsp,该属性的值通常是java,该属性的默认值也是java,所以通常无需设置

    Extends:指定jsp页面编译所产的java类所继承的父类,或者所实现的接口

    Import:导包,默认包会自动导入不需要显示导入,默认包有  java.lang.*   javax.servlet.*  javax.servlet.jsp.*    javax.servlet.http.*

    Session:设定这个页面是否需要session

    Buffer:指定缓冲区的大小  默认值为8kb,可以设置为none,或者自定义大小单位为kb

    Autoflush:当输出缓冲区即将溢出时,是否需要强制的将缓冲区的内容输出,设置为true正常输出,设置为false,则会在buffer溢出时产生有个异常

    Info:设置jsp程序的信息,可以通过servlet,getservketinfo()方法获取该值

    Erropage:指定错误页面,当页面出现错误或者异常的时候,而该jsp没有对应的处理代码,那么就会自动的调用该属性所指定的jsp页面

    Iserrorpage:设置该jsp页面是否为错误处理程序,如果该页面已是错误处理页面,那么无需指定errorpage属性

    Contenttype:设置生成网页的文件格式和编码字符集  默认文件格式为text/html,默认的字符集为iso-8859-1

    Pageencoding:指定生成页面的编码字符集 需要与Contenttype的charset一致

    2)include指令 可以是jsp html 文本文件 一段java代码 一般包含不变的信息 且不能有同名方法和变量名

    <%@include  属性名=“属性值”%><%--静态引入--%>

    <%--静态引入,将引入合并到当前页面成一个jsp--%>

    <%@ include file=path %>

    3)taglib指令 引入jsp需要用到的标签库

    <%@taglib  属性名=“属性值”%>:

     

    3.jsp9大内置隐含对象

    JSP的运行原理: JSP 本质上是一个 Servlet.

    Jsp书写上:JSP文件是在HTML文件中添加了Java代码

    jsp中的隐含变量:request, response, pageContext, session , application, config, out, page 这 8 个隐含对象. (实际上还可以使用一个叫 exception 的隐含对象)

    request:相当于httpservletrequest

    response:相当于httpservletresponse

    pageContext:可以获得其余的隐含变量

    session:相当于httpsession  在<%@ page  session=true %>的时候会新建  在<%@ page session="false" %>不能新建,且只允许传入的方式

    application:相当于servletcontext

    config:相当于servletconfig

    out:相当于response.getwrite 输出至页面

    page:作用于当前页面

    exception:只有指定了exception的iserrorpage=true才能使用,但是ie不支持

     

    4.jsp4大作用域

    pageContext:作用于当前页面

    request:作用于同一请求

    session:作用于一次对话,在没有设置时长的前提下

    application:作用于当前web

     

    5.jsp 13大内置标签中的常用的内置标签

    1)jsp:incluce 标签: 动态映入,两个jsp页面通过方法引入

    <jsp:include page=path></jsp:include>

    2)jsp:forward:转发

    <jsp:forward page=path></jsp:forward>

    相等于request.getRequestDispatcher("/include/b.jsp").forward(request, response);

    3)javabean

    1><jsp:useBean id="名称" class="包名点类名 " scope="作用范围"> </jsp:useBean> 获取一个名为名称的对象

    scope作用范围:  page(当前页面)   request(同一请求) session(一次会话)  application(当前web)

    相当于如下代码

    Student student=(Student)request.getAttribute("student");

    if(student1==null){

           student=(Student)Class.forName(包名点类名).newInstance();

           request.setAttribute("student", student);

    }

    2><jsp:setProperty property="属性名"  value="属性值"  name="相应usebean的id名"/>

    设置属性值,javabean类需要遵循其自身规则

    3><jsp:getProperty  property="属性名" name=" 相应usebean的id名"></jsp:getProperty>

    获取属性值,javabean类需要遵循其自身规则

    4><jsp:param>

    <jsp:param name="parameterName" value="{parameterValue | <%= expression %>

    设置传递的参数例如密码等

    不能够单独的存在 用于传递信息 需要与jsp.include   jsp:forword    jsp:plugin结合使用,Jsp:plugin中很少使用  主要用于下载服务器端的javabean和applet到客户端执行

     

    6.jsp<%--   --%>与<!--  -->的区别

    <%--   --%>这页面源码中是不可见的  代码写在这个里面不会执行,在其中只能定义局部变量不能是成员变量,

    <!--  -->在页面的源码中是可见的  写在这么里面会相应的执行

    <%! 声明部分  %> 用于声明变量和方法,在外表看起来似乎不需要定义类就可以直接的定义方法,方法似乎可以脱离类独立存在,实际上,jsp声明将会转化成对应的servlet的成员变量或者成员方法,因此jsp声明依然符合java的语法,不能用abstract定义方法,否则会将jsp对应的servlet变为抽象类而无法实体化,可以定义为其他的类型

     

    7.include的动态与静态加载

    <%@ include file=path %>与<jsp:include page=path></jsp:include>的区别

    <%@ include file=path %>: 静态引入,将引入合并到当前页面成一个jsp,

    <jsp:include page=path></jsp:include>:动态映入,两个jsp页面通过方法引入

     

    8.错误页面的引入方式

    配置错误页面的方式

    方式1:

    <%@ page errorPage="/error.jsp" %>  发生错误时跳转

    <%@ page isErrorPage="true"%>:是否可以用exception来捕获异常信息,不能用于ie

    方式2

    还可以在 web.xml 文件中配置错误页面:  这个是根据相应的错误代码编写的,在相应的httpservlet中不需要书写其余的东西,这样可以减少维护,优化代码,

           <error-page>

          <!-- 指定出错的代码: 404 没有指定的资源, 500 内部错误. -->

                 <error-code>404</error-code>

                 <!-- 指定响应页面的位置  至于是转发还是重定向,好像应该是转发,可以将错误页面放入web-inf中,假如能到那么就是转发,因为只能转发访问-->

                 <location>/WEB-INF/error.jsp</location>

           </error-page>

            <error-page>

                 <!-- 指定异常的类型 -->

                 <exception-type>java.lang.ArithmeticException</exception-type>

                 <location>/WEB-INF/error.jsp</location>

           </error-page>

     

    9.el的11大隐含对象

    pagescope对应el中 Page

    requestscope对应el中Request

    sessionscope对应el中的Session

    applicationscope对应el中的Application

    PageContext:表示jsp中的PageContext

    Param:相当于request.Getparameter

    paramValues:如同

    cookie:相当于request.getcookies

    initParam:相当于servletconfig.getInitparameter

    header:如同request.getheader

    headerValues: 如同request.getheaders

    使用方式:

    ${sessionScope.user.sex}相当于User user = (User)session.getAttribute("user"); String sex = user.getSex( );

    ${sessionscope.username}  相当于object username=session.getattribute(“username”)

    这里注意在属性名字有下滑线,点时等(非字母数字)需要用【】例如如下

    ${user["My_Name"] } , ${sessionScope["com.student"]}   

    注意上述属性需要遵循javabean规则

     

    10.el的表达式

    1)在1.2版本之前一律是string ,1.2之后假如是纯数字会相应的转化成数字

    2)el中的运算符

    向上转型

    3)el的关系运算符

    都是数字,按数字比较, 有string转化为string比较 string按自然顺序比较

    4)el中的逻辑运算符

    ||  && !

    5)其他运算符

    Empty 判断是否为空  例如${empty requestScope.list}   返回boolean

    ${ A ? B : C} 

    6)el函数

    6.1)需要导入的包

    标准标签库:Jstl包和standard包 

    6.2)需要使用

    <%@taglib prefix="fn"  uri="http://java.sun.com/jsp/jstl/functions" %>  引入包

    6.33)使用方法如下:

    ${fn:length(param.name)}:获取长度

    基本和string的方法类似

    7)自定义el函数

    tld配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd" version="2.0">
    <!--下面三行主要是描述信息不是很重要可以随便写-->
      <description>JSTL 1.1core library</description>
      <display-name>JSTL core</display-name>
      <tlib-version>1.1</tlib-version>
    <!--Prefix=“fn” 中的fn就是下面定义的内容-->
    <short-name>fn</short-name>
    <!--指定的uri  紧随prefix后面的-->
    <uri>http://java.sun.com/jsp/jstl/function1</uri>
    <function>
    <!--描述信息随便写-->
    <description>
       Tests if an input string contains the specified substring.
    </description>
    <!—函数使用的名称 就像${fn:length(param.name)}的length -->
    <name>contains</name>
    <!—支撑该函数的类 -->
    <function-class>包名点类名 </function-class>
    <!--string 返回的类型 concat静态方法,java.lang.String, java.lang.String参数类型(需要包名点类名) -->
    <function-signature>java.lang.String concat (java.lang.String, java.lang.String)</function-signature>
    </function>
    </taglib>
    

    支撑类

    package day01;
    
    public class demo{
          public static Boolean contains(String str1,String str2){   
                return str1+str2
            }
    }
    

    11.jstl

    1)导包

    1>需要导包:同el

    2>核心标签库引入如下,其他类似

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

    2)核心库常用标签

    1><c:out>输出内容,就像是 <%= scripting-language %>

    例如: <c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />

    【】表示可选,escapeXml表示是否实现符号转换,default表示当value为null时输出的默认值,value输出显示的值

    2><c:set> 保存相应的属性

    用法1:设置在相应的scope中默认为page,倘若scope为request那么相当于

    <% requst.setattribute(“vername”,”value”)%>  具体写法如下

    <c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>

    用法2:

    Target需要为javabean(那么就类似jsp内置标签setproperty),或者map集合,按键值对保存

    < c:set value="value" target="target" property="propertyName" />

    其中var 和scope 这两个属性不能使用表达式来表示

    3><c:remove> 移除属性

    <c:remove var="varName" [scope="{ page|request|session|application }"] />

    移除相应的属性,scope指定为request是类似于request.removeattribute(“name”)

    4><c:catch> 捕获异常并且存储

    <c:catch [var="varName"] >… 欲抓取错误的部分</c:catch>

    将相应的信息捕获至var变量中,类似于set中的带主体的方式,但是多了捕获异常

    5>流程

    <c:if>

    不带主体

    <c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>

    Test:结果true/false var保存结果 scope作用范围 没有内容输出

    带主体

    <c:if test="testCondition" [var="varName"][scope="{page|request|session|application}"]>

    具体内容</c:if>

    当没有var时默认输出至页面相应的内容,有时则会保存,不会输出

    <c:choose>

    <c:choose>本体内容( <when> 和 <otherwise> )</c:choose>

    其中when相当于elseif otherwise相当于switch中的default  用法如下

    <c:choose>

    <c:when test="${condition1}">condition1 为true</c:when>

    <c:otherwise>condition1 和condition2 都为false</c:otherwise>

    </c:choose>

    6><c:forEach> 循环遍历

    <c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"]

    [end="end"] [step="step"]>

    var 用来存放现在指到的成员

    items 被迭代的集合对象

    varStatus 用来存放现在指到的相关成员信息

    begin 开始的位置

    end 结束的位置

    step 每次迭代的间隔数

    varStatus 不能同begin  end  和step  一起使用  旗下的属性有如下

    index number 现在指到成员的索引

    count number 总共指到成员的总数

    first boolean 现在指到的成员是否为第一个成员

    last boolean 现在指到的成员是否为最后一个成员

    <c:forEach items="${requestScope.custMap}" var="cust1" varStatus="stus">

           ${stus.index}, ${stus.count}, ${stus.first}, ${stus.last}: ${cust1.value.id }: ${cust1.value.name }<br>

    </c:forEach>

    默认的是pagescope ,上面的${stus.index}实际上是${pagescope.stus.index}的简写

    7><c:forTokens> 类似于StringTokenizer类

    <c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"]

    [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>

    var 用来存放现在指到的成员

    items 被迭代的字符串

    delims 定义用来分割字符串的字符

    varStatus 用来存放现在指到的相关成员信息

    begin 开始的位置

    end 结束的位置

    8><c:import> 载入页面

    <c:import url="url" [context="context"] [var="varName"]

    [scope="{page|request|session|application}"] [charEncoding="charEncoding"]>

    url 文件被包含的地址

    context相同Container 下,其他web站台必须以“/”开头 一般不写直接都写在url中

    var 储存被包含的文件的内容(以String类型存入)

    scope var 变量的JSP 范围

    charEncoding 被包含文件之内容的编码格式

    varReader 储存被包含的文件的内容(以Reader类型存入)

    9><c:url> 重写 禁用session后数据的导入

    <c:url value="value" [context="context"] [var="varName"]

    [scope="{page|request|session|application}"] />

    value 执行的URL

    context 相同容器下,其他web 必须以“/”开头  一般不写直接都写在value中

    var 储存被包含文件的内容(以String 类型存入)

    scope var 变量的JSP 范围 

    <c:url value="http://www.javafan.net " ><c:param name="param" value="value"/>

    </c:url>

    相当于<%=response.encodeURL("test1.jsp")%>

    10><c:redirect> 重定向

    <c:redirect url="url" [context="context"] > <c:param> </c:redirect >

    url:地址

    context:相同容器下,其他web 必须以“/”开头  一般不写这个都写在url中

    <c:param>:参数 jsp隐含标签

    <c:redirect url="/test.jsp"/>

    11>自定义jstl函数

    1)非嵌套

    配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <!--下面三行主要是描述信息不是很重要可以随便写-->
      <description>JSTL 1.1 core library</description>
      <display-name>JSTL core</display-name>
      <tlib-version>1.1</tlib-version>
    <!--Prefix=“c” 中的fn就是下面定义的内容-->
    <short-name>c</short-name>
    <!--指定的uri  紧随prefix后面的-->
    <uri>http://java.sun.com/jsp/jstl/core1</uri>
    <tag>
      <!--标签的名字:在jsp页面上使用时的名称 例如foreach 调用的名字-->
      <name>hello</name>
      <!--标签的支撑的全类名 调用的类-->
      <tag-class>包名点类名</tag-class>
      <!-- 标签体的类型  共三种
      empty  标签体为空
      scriptless:代表了可以有标签体 ,可以是EL、JSTL等,但是不能有 java表达式
      tagdependent:jsp引擎对标签不做任何处理而且把最原始的标签体内容传递给
      标签处理器类  这个基本不用-->
      <body-content>empty</body-content>
      <!-- 描述当前标签的属性 -->
      <attribute>
      <!-- 属性名 -->
      <name>count</name>
      <!-- 该属性名是否必须 -->
      <required>true</required>
      <!--运行时是否可以动态的接受表达式的值-->
      <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    

    支撑类需实现simpletag接口,通常继承的方式继承实现simpletag接口的simpletagsupport类(原由:simpletagsupport类只需要重写dotag方法就好了,其他的方法已被写好,简洁方便)

    public class HelloSimpleTag1 extends SimpleTagSupport{
           private String count;  //count需要与相应的<name>一致
           public void setCount(String count) {
                    this.count = count;    //需要遵循setter方式
           }
           @Override
           public void doTag() throws JspException, IOException {
                    System.out.println(count);
           }
    }
    

    使用:

    <c:hello  count="10"/>

    2)嵌套

    1>父子标签的定义

    同上普通标签

    2>支撑类

    父类
    public class ParentTag extends SimpleTagSupport{
           private String name="name";
           public String getName() {
                   return name;
           }
    
           @Override
           public void doTag() throws JspException, IOException {
                    getJspBody().invoke(null);       
           }
    }
    
    子类
    public class SonTag extends SimpleTagSupport{
           @Override
           public void doTag() throws JspException, IOException {
                    String name=((ParentTag)getParent()).getName();
                    getJspContext().getOut().println(name);
           }
    }
    

    3>jsp中的使用

    <c:parent>

    <c:son></c:son>

    </c:parent>

  • 相关阅读:
    BestCoder Round #71 (div.2) (hdu 5621)
    BestCoder Round #71 (div.2) (hdu 5620 菲波那切数列变形)
    BestCoder Round #69 (div.2) Baby Ming and Weight lifting(hdu 5610)
    BestCoder Round #70 Jam's math problem(hdu 5615)
    BestCoder Round #68 (div.2) tree(hdu 5606)
    poj 2299 Ultra-QuickSort(归并排序或是bit 树+离散化皆可)
    hdu 3874 Necklace(bit树+事先对查询区间右端点排序)
    HDU 4300 Clairewd’s message(KMP)
    HDU 3308 LCIS(线段树单点更新区间合并)
    PKU 3667 Hotel(线段树)
  • 原文地址:https://www.cnblogs.com/gg128/p/9683676.html
Copyright © 2020-2023  润新知