• jsp基础


     1.jsp页面中的注释 comment

      第一种:
        <!-- html/xml中的注释方式 -->
        特点:
          1.用户在浏览器中右键查看源代码 [能] 看到这个注释。
          2.在服务器端,这个jsp页面被翻译成的java文件中 [能] 看到这个注释.

        注意: 【jsp动作元素】 放在这种注释里面依旧有用,【注释不起作用】,失效了!
          例如:
           <!-- <jsp:forward page="main.jsp"></jsp:forward> -->

      第二种:
        <%--
          jsp中的注释方式【隐藏注释】
        --%>
        特点:
          1.用户在浏览器中右键查看源代码 [不能] 看到这个注释。
          2.在服务器端,这个jsp页面被翻译成的java中 [不能] 看到这个注释.

      第三种:
        java中的注释方式,但是这种注释方式只能在【jsp的脚本】或者【声明】中使用。

        //String name = "tom";

        /*
          int b = 40;
        */

        /**
          int a = 20;
          */
          特点:
            1.用户在浏览器中右键查看源代码 [不能] 看到这个注释。
            2.在服务器端,这个jsp页面被翻译成的java中 [能] 看到这个注释.

    2.内置对象
      在jsp页面代码中不需要声明,直接可以使用的对象。

      其实是只有在这个【_jspService()】方法中才能使用
        jsp脚本和jsp表达式
        <% 脚本 %>
        <%= 表达式 %>

    2.1 所有内置对象
      一共有【9个内置对象】可以直接使用.
      类型 名字
      PageContext pageContext
      HttpServletRequest request
      HttpSession session
      ServletContext application
      Object page
      HttpServletResponse response
      JspWriter out
      ServletConfig config
      Throwable exception 【isErrorPage才可以用】

    注意:在生成的中间java文件中,源码可以观察到它们的声明和定义。

    注意:为什么这些对象可以直接使用,因为他们都是在_jspService这个方法中默认声明了出来.而我们在表达式和脚本中所写的java代码将来是要翻译到_jspService方法中的,所以我们在表达式和脚本中写java代码的时候可以直接使用这些对象.

    2.2 范围对象
    范围对象有四个,在一定范围内可以存取数据。

      pageContext 【比request小】
        页面范围(只能在同一个页面中起作用)
      request

        在同一次请求中
      session

        在一次会话中
      application

        在应用中

    测试:
      在一个页面中通过上述 对象.setAttribute("name","tom");
      然后页面跳转 <%=对象.getAttribute("name") %>

    page
      page指的是中间类对象,【jsp页面会被翻译生成一个java类】,服务器使用这个java类【创建的对象】就是page。

      把page值输出即可看到,所以说page对象代表jsp页面本身。
      这个对象一般用不到,了解即可。

    response
      往浏览器发送数据时会用到。
      但在jsp里面用的不多,因为已经有了 out。所以一般只在【重定向时才用】。
      response.sendRedirect("test.jsp");

    out
      n用于向浏览器输出内容的输出流.
      n看中间生成的源码,由response得到pageContext,再获得out.

    config
    它的方法主要有四个,在jsp内实际上没有用。

      nconfig.getServletName();
        返回值为jsp,不是原来的servlet了。
      config.getServletContext();
        获取app,不需要,观察application与之是否相同。

      config.getInitParameter(name);
        需要在web.xml配置参数,所以现在基本废弃
      config.getInitParameterNames();
        同上 废弃


    exception
    跳转后显示页面错误。【前面专门讲过】
    这个对象我们并不能直接使用,需要isErrorPage="true"设置后才能使用,这个可以算是一个隐藏对象.
    这个对象表示将来这个jsp页面运行出错的时候所抛出的异常对象.

    以上就是9种内置对象,必须完全掌握
    *************************** ****************

    3.jsp页面中的路径
    一般情况下,jsp中路径问题是和我们之前在servlet中讨论的html里面的路径问题是一样的,但是在【jsp中可以动态获得该项目的url】。

      如果在jsp页面的上面写了这样一个脚本:
      <%
        String path = request.getContextPath();
        String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
      %>
      并且再<head>标签中加入了一个子标签:
      <base href="<%=basePath%>" />

      那么在这个jsp页面中,我们再去写上一个相对路径(最左边没有加/的那种路径),它就不是相对于地址栏中的当前路径了,而是要相对于这个basePath变量所代表的这个路径.

    使用test/test.jsp中的超链接进行测试。

    4.EL表达式
      形式:${ }
      作用:从一个【范围对象里面取值】或者从一个对象中取值或是向页面输出值.
      之前我们使用<% ... %>等形式,并不够简洁。
      例如:
        <% request.setAttribute("name","zs") %>
        <%=request.getAttribute("name") %>

      可以简写为:
        ${name } 类似mybatis中的${id}

      注意:el表达式只适用于四种范围对象里面存放的数据。

      4.1 接收客户端url传递的参数
        ${param.name1 }
        等同于
        <%=request.getParameter("name1") %>

        看源码发现 java代码实现了其功能。

        注意:不管是get还是post,都可以获取到参数值。

      4.2 指定范围取值

        ${pageScope.pname }
        ${requestScope.rname }
        ${sessionScope.sname }
        ${applicationScope.aname }

        如果上述代码想要得到结果,得先执行下面代码,将值放入。
        <%
          pageContext.setAttribute("pname","1");
          request.setAttribute("rname","2");
          session.setAttribute("sname","3");
          application.setAttribute("aname","4");
        %>

      4.3 不指定范围内取值
        ${name }

        按照范围从小到大顺序,即pageContext request session application依次去找叫name的值。
        一旦找到了就输出,最终没有找到就什么都不输出。

        <%
          pageContext.setAttribute("name","p1");
          request.setAttribute("name","r2");
          session.setAttribute("name","s3");
          application.setAttribute("name","a4");
        %>

      4.4 取出一个对象中的属性值.
        先准备一个值
        <%
          Student s = new Student(1,"zs",20);
          request.setAttribute("student",s);
        %>

        然后去获取值
          ${requestScope.student.id} 先获得s然后再获取id值
          ${requestScope.student.name}
          ${requestScope.student.age}

          或者
            ${student.id }
            找对应的get方法调用获取值。
            ${student.name }
            ${student.age }
            ${student.score }
            //只要有getScore()方法即可,而非score属性

            也可以 ${student.addr.city } 其中addr是子对象。

          或者
            有时候student并非对象,比如(student.id,request.setAttribute("student.id","10"));被当成了一个名字,
            对于这样的特殊情况,可以使用下面的形式获取值。
              ${student["id"]}
              ${student["name"]}
              ${student["age"]}

          注意:${student.id}表示是要调用student对象中的getId方法,至于对象中有没有id属性对这个操作没有任何影响.所以这和id指的是对象中的property而不是attribute。

          如果Student类中一个方法是getAddress,返回一个Address类的对象,Address类中有一个方法getCity,这个时候我们就可以这样写去拿到city属性的值.
              ${student.address.city}


      4.5 输出字符串
        ${"hello" }

        注意,${hello } 是取值,而非输出字符串

        实际应用:
        ${"hello" == 表达式的值}

      4.6 输出运算结果或者boolean表达式
        ${1+1 }
        ${(1+2)*3-4+5*3 }
        ${1<3 }


        【空测试】
        ${empty "" }
          为空的话返回true
        ${empty "hello" }

        又例如:
        <%
          String str="go"; | str = "";
          request.setAttribute("str",str);
        %>
        ${empty str }
        //也可以判断变量

        【取否】 不为空的话返回true
          ${not empty "hello" }
          ${! empty "hello" }

        【条件判断】
          ${param.score>50 }
          ${param.score>60?"good":"bad" }

    7.获取并输出数组、集合中的元素值
      先准备数据放入request里面
      <%
        String[] str = {"hello","world"};

        List<String> list = new ArrayList<String>();
        list.add("zhangsan");
        list.add("lisi");

        Map<String,Integer> map = new HashMap<String,Integer>();
        map.put("a",100);
        map.put("b",200);
        map.put("c",300);

        request.setAttribute("str",str);
        request.setAttribute("list",list);
        request.setAttribute("map",map);
      %>

      数组和list可以直接下标取值
        ${str[0] }<br>
        ${list[1] }<br>

        map通过key值取值
        ${map["c"] }<br>

    *********************

    五.JSTL标签库
      JSTL: JSP Standard Tag Library
      JSTL根据功能可以分成很多种类:核心标签库、格式化标签库、数据库标签库等。
      我们关心的是核心标签库core部分。

      和【EL配合】使用,可以让用户【尽可能少的使用java源码】。

      需要先导入jstl的jar包。 jstl.jar standard.jar

      1.让web项目支持JSTL标签库
        在eclipse中,建一个文本项目,默认都是不支持JSTL,所以需要我们自己把JSTL的jar包导入到项目中(复制粘贴到项目中的lib目录):jstl.jar standard.jar

      2.把JSTL标签库导入到jsp页面中
        使用jsp中的taglib指令,将标签库引入:
        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
        注意,加前缀避免与其他人写的标签重名。

      【uri的值可以自动提示补全】。
        prefix="c"相当于给这个标签库起一个别名,将来在页面中就是用以c开头的标签来使用标签库中的标签。这个别名也可以叫其他的名字。

      <c:forEach>标签
      循环遍历操作,【使用率最高】。
      先准备一个集合:
      <%
    List<Student> list = new ArrayList<Student>();
    list.add(new Student(12,"tom1",21));
    list.add(new Student(21,"tom2",22));
    list.add(new Student(34,"tom3",23));
    list.add(new Student(14,"tom4",24));
    request.setAttribute("list", list);
    %>

    使用<c:forEach>标签 【完整代码】 遍历
    <c:forEach var="stu" items="${list }" begin="0" end="3" varStatus="status" step="1">
    ${status.index } : ${stu.id } - ${stu.name } - ${stu.age } <br>
    </c:forEach>

    varStatus表示循环的状态,用status表示。
    step是每次跳过几个,默认值为1,逐个遍历。

    el表达式十分强大,基本可以写到任何地方。

    注意:
    begin="" 默认值是0,
    end ="" 默认值是最后一个元素,
    一般遍历只要写var和items来个属性即可。

    【常规写法】:
    <c:forEach items="${list }" var="stu">
    ${stu.id } | ${stu.name } | ${stu.age } <br>
    </c:forEach>

    【遍历List集合】:
    list是放进request对象中的一个List集合,集合中存放的是Student类型的对象.
    items=""属性值是要遍历的集合
    var="" 属性值是每次遍历到的对象用什么名字的变量去接收。
    <table>
    <c:forEach items="${list }" var="stu">
    <tr>
    <td>${stu.id }</td>
    <td>${stu.name }</td>
    <td>${stu.age }</td>
    </tr>
    </c:forEach>
    </table>

    【遍历Map集合】:

    准备数据
    <%
    Map<Integer,Student> map = new HashMap<Integer,Student>();
    map.put(76,new Student(76,"tom1",21));
    map.put(42,new Student(42,"tom2",25));
    map.put(31,new Student(31,"tom3",21));
    map.put(88,new Student(88,"tom4",20));
    session.setAttribute("map",map);
    %>
    map是一个Map类型的集合,放到了session对象中,entry是我们定义的一个变量,用做接收每次遍历到的集合中的一组键值对。
    我们可以通过entry.key, entry.value分别拿到这次遍历到的key值和value值。

    <c:forEach items="${map }" var="entry">
    ${entry.key }-->${entry.value.id } &nbsp; ${entry.value.name } &nbsp; ${entry.value.age }<br>
    </c:forEach>

    <c:if>标签:
    条件判断
    <%
    request.setAttribute("score",90);
    %>

    <c:if test="${score>85 }">
    <font color="red">你的分数超过了85分</font>
    </c:if>
    <c:if test="${score>95 }">
    <font color="blue">你的分数超过了95分</font>
    </c:if>

    这样写相当于:
    if(score>85){
    ...
    }
    if(score>95){
    ...
    }

    <c:choose>标签
    <c:when>标签
    <c:otherwise>标签
    例如:
    <c:set scope="request" var="score" value="85"></c:set>

    <c:choose>
    <c:when test="${score>=90 }">优</c:when>
    <c:when test="${score>=80 }">良</c:when>
    <c:when test="${score>=70 }">中</c:when>
    <c:when test="${score>=60 }">及格</c:when>
    <c:otherwise>差</c:otherwise>
    </c:choose>

    相当于:
    if(score>=90){

    }else if(score>=80){

    }else if(score>=70){

    }eles if(score>=60){

    }else{

    }

    <c:import>标签
    和<jsp:include>的作用基本相同

    <c:import url="main.jsp"></c:import>
    将main.jsp页面导入当前jsp中。

    //先放入date,然后再引入date即可
    <c:import var="data" url="main.jsp" />
    <c:out value="<a href=''>测试</a>"></c:out>
    <c:out value="${data }"></c:out>
    ${data }

    注意【观察c:out】 与上述标签${data }区别。
    我们发现 c:out 有点类似CDATA,没有解析过程。

    <c:redirect>
    重定向标签
    <c:redirect url="main.jsp"/>

    <c:out>标签
    向页面输出内容,就像<%=... > ${ }
    但是可以输出表达式。

    <c:out value="hello"></c:out>
    <c:out value="${5+5 }"></c:out>

    //list是放在request中的List集合,集合里面是Student对象
    <c:out value="${list[2].id }"></c:out>

    <c:set>标签:
    向某一个范围对象[pageContext,request,session,application]中存放一个值。
    <c:set var="name" value="zhangsan" scope="request"></c:set>
    往scope范围中放入一个值。

    测试:
    <c:out value="${requestScope.name }"></c:out>

    <c:remove>标签:
    从某个范围对象中把某个值给移除掉
    <c:remove var="name" scope="request"/>
    再次打印,就没有了
    <c:out value="${requestScope.name }"></c:out>

    <c:catch>标签
    处理产生错误的异常状况,并且将错误信息储存起来。

    <c:catch var="catchException">
    <% int x = 5/0; %>
    </c:catch>

    <c:if test = "${catchException != null}">
    <p>异常为 : ${catchException } <br />
    发生了异常: ${catchException.message }</p>
    </c:if>

  • 相关阅读:
    java web spring challenge01
    eclipse的一个小失误
    创建线程的方式三:实现Callable接口。 --- JDK 5.0新增
    线程通信的应用:经典例题:生产者/消费者问题
    8.5 练习
    8.4 练习1
    LockTest.java
    DeadLock.java
    线程死锁
    使用同步机制将单例模式中的懒汉式改写为线程安全的
  • 原文地址:https://www.cnblogs.com/nyhhd/p/12640784.html
Copyright © 2020-2023  润新知