JSP

声明:看黑马视频自学,笔记也是老师的,只是我自己在整理了一下。

github地址:https://github.com/zhenyusu/j2eeDemo.git

**
本笔记项目为:
day11_02_jsp2
day11_03_PageContext
day11_04_el
day11_05_jstl
**

1.jsp概述

SP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP实际上就是Servlet。
jsp = html + java
html:静态内容
servlet:服务器端的小应用程序。适合编写java逻辑代码.
jsp:适合编写输出动态内容,但不适合编写java逻辑。

2.jsp的特点

1)jsp的运行必须交给tomcat服务器!!!! tomcat的work目录: tomcat服务器存放jsp运行时的临时文件
2)jsp页面既可以写html代码,也可以写java代码。(html页面不能写java代码 。而jsp页面可以写java代码)

3.jsp的运行过程

问题: 访问http://localhost:8080/day12/01.hello.jsp 如何显示效果?
1)访问到01.hello.jsp页面,tomcat扫描到jsp文件,在%tomcat%/work把jsp文件翻译成java源文件
(01.hello.jsp -> _01_hello_jsp.java) (翻译)
2)tomcat服务器把java源文件编译成class字节码文件 (编译)
(_01_hello_jsp.java -> _01_hello_jsp.class)
3)tomcat服务器构造_01_hello_jsp类对象
4)tomcat服务器调用_01_hello_jsp类里面方法,返回内容显示到浏览器。
第一次访问jsp: 走(1)(2)(3)(4)
第n次访问jsp: 走(4)

注意:
1)jsp文件修改了或jsp的临时文件被删除了,要重新走翻译(1)和编译(2)的过程

4.jsp的基本语法

4.1 JSP模版元素

网页的静态内容。如:html标签和文本。

4.2 JSP的脚本

  1. 小脚本 <% java代码 %>
  2. 表达式 <%= 2+3 %> 等价于out.print(2+3);
  3. <%! %> 表示在类中定义全局成员,和静态块。
<%!
      int num1 = 10;
 %>
    <%
        int num2 =10;
        num2++;
        num1++;
        //out.print(num2);
    %>
    <%=num1 %>
    <%=num2 %>

4.3 JSP注释

JSP注释:<%– 被注释的内容 –%> 特点:安全,省流量
网页注释:<!-- 网页注释 --> 特点:不安全,费流量

5. JSP三个指令

5.1 page

作用: 告诉tomcat服务器如何翻译jsp文件

 <%@ page  language="java"--告诉服务器使用什么动态语言来翻译jsp文件
import="java.util.*" --告诉服务器java文件使用什么包.导入包,多个包之间用逗号分割
pageEncoding="utf-8"  --告诉服务器使用什么编码翻译jsp文件(成java文件)
 contentType="text/html; charset=utf-8" _服务器发送浏览器的数据类型和内容编码
                     注意:在开发工具中,以后只需要设置pageEncoding即可解决中文乱码问题
errorPage="error.jsp"--如果页面中有错误,则跳转到指定的资源。
isErrorPage="false"--是否创建throwable对象。默认是false;
buffer="8kb"--JSP中有javax.servlet.jsp.JspWriter输出字符流。设置。输出数据的缓存大小,默认是8kb.
session="true"--是否会自动创建session对象。默认值是true;
isELIgnored="false"--是否支持EL表达式。 默认是false
    %>

5.2 include

作用: 在当前页面用于包含其他页面
静态包含:把其它资源包含到当前页面中。
<%@ include file="/include/header.jsp" %>
动态包含
<jsp:include page="/include/header.jsp"></jsp:include>
两者的区别:翻译的时间段不同
前者:在翻译时就把两个文件合并
后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。
注意
1)静态包含原理是把被包含的页面(header.jsp)的内容翻译到包含页面(index.jsp)中,合并成翻译成一个java源文件,再编译运行!!,这种包含叫静态包含(源码包含)
2)如果使用静态包含,被包含页面中不需要出现全局的html标签了!!!(如html、head、body)
3)能用静的就不用动的。

5.3 taglib

作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

6. jsp六个标签

<jsp:include> 动态包含
<jsp:forward> 请求转发
<jsp:param>设置请求参数
<jsp:useBean> 创建一个对象
<jsp:setProperty> 给指定的对象属性赋值
<jsp:getProperty> 取出指定对象的属性值

<%
        Student stu = new Student();//(1)
        stu.setName("tom");//(2)
        out.print(stu.getName());//(3)
        request.getRequestDispatcher("/1.jsp").forward(request,response);//(4)
    %>
    <jsp:useBean id="stu1" class="com.itheima.entity.Student"></jsp:useBean><%--类似于Student stu = new Student(); --%>
    <jsp:setProperty property="name" name="stu1" value="jerry"/><%--类似于 --stu1.setName("jerry");%>
    <jsp:getProperty property="name" name="stu1"/><%--类似于out.print(stu1.getName()) --%>
    <%--http://localhost:8080/day11_02_jsp2/6.jsp?name=123  --%>
    <jsp:forward page="/1.jps">
        <jsp:param value="123" name="name"/>
    </jsp:forward><%--类似于(4)语句 --%>

7. jsp的9个内置对象


pageContext(重要)
1、本身也是一个域对象:它可以操作其它三个域对象(request session application)的数据

void setAttribute(String name,Object o);
Object getAttribute(String name);
void removeAttribute(String name);

操作其它域对象的方法

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

Object getAttribute(String name,int Scope);

void removeAttribute(String name,int Scope);

scpoe的值
PageContext.PAGE_SCOPE

PageContext.REQUEST_SCOPE

PageContext.SESSION_SCOPE

PageContext.APPLICATION_SCOPE

findAttribute(String name); 自动从page request session application依次查找,找到了就取值,结束查找。

<%

        //pageContext.setAttribute("p","pp",pageContext.PAGE_SCOPE);
        pageContext.setAttribute("p","pp");

        //pageContext.setAttribute("p","request",pageContext.REQUEST_SCOPE);
        request.setAttribute("p","request");

        //pageContext.setAttribute("p","session",pageContext.SESSION_SCOPE);
        session.setAttribute("p","session");

        //pageContext.setAttribute("p","application",pageContext.APPLICATION_SCOPE);
        application.setAttribute("p","application");

        //request.getRequestDispatcher("/2.jsp").forward(request,response);//转发

        response.sendRedirect(request.getContextPath()+"/2.jsp");//重定向

    %>

2、它可以创建其它的8个隐式对象
在普通类中可以通过PageContext获取其他JSP隐式对象。自定义标签时就使用。

3、提供了的简易方法

pageContext.forward("2.jsp");
pageContext.include("2.jsp");

8. 四大域对象:实际开发

PageContext : pageConext 存放的数据在当前页面有效。开发时使用较少。
ServletRequest: request 存放的数据在一次请求(转发)内有效。使用非常多。
HttpSession: session 存放的数据在一次会话中有效。使用的比较多。如:存放用户的登录信息,购物车功能。
ServletContext: application 存放的数据在整个应用范围内都有效。因为范围太大,应尽量少用。

9. EL表达式

9.1 EL作用

jsp的核心语法: jsp表达式 <%=%>和 jsp脚本<% %>。以后开发jsp的原则: 尽量在jsp页面中少写甚至不写java代码。

使用EL表达式替换掉jsp表达式
EL表达式作用: 向浏览器输出域对象中的变量值或表达式计算的结果!!!(要注意只能是域对象)
语法: ${变量或表达式}

9.2 EL的具体功能

9.2.1 获取数据

  • EL表达式只能获取存在4个作用域中的数据
    ${u} 原理: pageContext.findAttribute(“u”);

    url?name=tom ${param.name}

  • EL获取对于null这样的数据,在页面中表现为空字符串

  • ${u.name} == u.getName()方法

    点(.) 运算符相当于调了getter方法,点后页面跟的是属性名。
    “`html
    <%
    Student stu = (Student)request.getAttribute(“s”);
    out.print(stu.getName());
    %>

    s<! {s}==findAttribute(“s”)–>
    s.name {s.city.address}


- []运算符:点能做的,它也能做; 它能做的,点不一定能做

    `${student.name}== ${student['name']} == ${student["name"]}`

```html
<%
        List list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        request.setAttribute("list",list);

        Map map = new HashMap();
        map.put("a","aaa");
        map.put("b","bbb");
        map.put("c","ccc");
        request.setAttribute("map",map);

    %>

    ${list}<%--[aaa,bbb,ccc] --%>
    ${list[1]}<%--bbb --%>
    ${map}<%--{b=bbb, c=ccc, a=aaa} --%>
    ${map["b"]}<%-- bbb--%>
    ${map.b }<%-- bbb--%>




<div class="se-preview-section-delimiter"></div>

9.2.2 运算

  • empty:判断null,空字符串和没有元素的集合(即使集合对象本身不为null)都返回true
<%
        String str1 = null;
        request.setAttribute("str",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("asfd");
        request.setAttribute("list2",list2);

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

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




<div class="se-preview-section-delimiter"></div>
  • 三元运算符
<%--三元运算符 --%>
    ${empty list1 ? "list为空":"list不是空"}</br>
    <input type = "radio" name = "sex" value = "m" ${s==0 ? "checked='checked'":"" }/>男<br/>
    <input type = "radio" name = "sex" value = "f" ${s==1 ? "checked='checked'":"" }/>女<br/>




<div class="se-preview-section-delimiter"></div>

隐式对象:11个

    <%
        //pageContext.setAttribute("p","pageContext",pageContext.PAGE_SCOPE);
        pageContext.setAttribute("p","pageContext");

        //pageContext.setAttribute("p","request",pageContext.REQUEST_SCOPE);
        request.setAttribute("p","request");

        //pageContext.setAttribute("p","session",pageContext.SESSION_SCOPE);
        session.setAttribute("p","session");

        //pageContext.setAttribute("p","application",pageContext.APPLICATION_SCOPE);
        application.setAttribute("p","application");

    %>
    ${p}<%--findAttribute("p") --%>
    ${pageScope.p}<%-- page--%>
    ${requestScope.p }<%--request --%>
    ${sessionScope.p }<%--session --%>
    ${applicationScope.p}<%--application --%>
    ${pp}<%--"" --%>




<div class="se-preview-section-delimiter"></div>

login.jsp

<body>
        <form action="${pageContext.request.contextPath }/success.jsp" method="post">
            用户名:<input type="text" name="userName" /><br /> 密码:<input
                type="password" name="pwd" /><br /> <input type="submit" value="登录" /><br />
        </form>
    </body>




<div class="se-preview-section-delimiter"></div>

success.jsp

<body>
    欢迎你:${param.userName}<%--request.getParameter("userName") --%>

    ${paramValues.hobby[0]}

    ${header["user-agent"] }

    ${cookie.JSESSIONID.value}
</body>




<div class="se-preview-section-delimiter"></div>

10. JSTL

10.1 什么是JSTL

JSTL(JavaServerPages Standard Tag Library)JSP标准标签库

10.2 JSTL的作用

使用JSTL实现JSP页面中逻辑处理。如判断、循环等

10.3 使用JSTL

在JSP页面添加taglib指令
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix= "c" %>

10.4 常用标签

通用标签: set、 out、 remove

    设置变量:<c:set var = "num" value = "10" scope = "session"></c:set>
    输出变量:<c:out value="${num}"></c:out>
    移除变量:<c:remove var="num" scope="session"/>
    输出变量:<c:out value="${num}"></c:out>




<div class="se-preview-section-delimiter"></div>

条件标签:if choose

<c:if test="${5>3}">
        aaaaa
    </c:if>

    <c:set var = "num" value ="${1}"></c:set>

    <%--switch语句 --%>
    <c:choose>
        <c:when test="${num==1}">aaa</c:when>
        <c:when test="${num==2}">bbb</c:when>
        <c:when test="${num==3}">ccc</c:when>
        <c:otherwise>
            ddd
        </c:otherwise>
    </c:choose>




<div class="se-preview-section-delimiter"></div>

迭带标签:foreach

<!-- 普通循环 -->
    <%--for(i = 1; i <=10; i++) --%>
    <c:forEach var="i" begin="1" end="10" step="1">
        ${i}<br/>
    </c:forEach>




<div class="se-preview-section-delimiter"></div>
<%
        List list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");

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

    <!-- 迭代器 -->
    <%--
        for(List l:list){}
     --%>
    <c:forEach items="${list}" var ="l">
        ${l }
    </c:forEach>
<table border = "1">
        <tr>
            <th>数据</th>
            <th>索引</th>
            <th>计数</th>
            <th>第一个</th>
            <th>最后一个</th>
        </tr>

        <!-- c:forEach中的varStatus属性.
            指向一个字符串,该字符串引用一个对象.map.put("vs",一个对象);
            这个对象记录着当前遍历的元素的一些信息:
            getIndex():返回索引,从0开始
            getCount():返回技术,从1开始
            isLast():是否是最后一个元素
            isFirst():是否是第一个元素
             -->
        <c:forEach items="${list}" var = "l" varStatus="vs">
            <tr ${vs.count%2==0 ? "style='background-color:lime'":"style='background-color:green'"}>
                <td>${l}</td>
                <td>${vs.index }</td>
                <td>${vs.count }</td>
                <td>${vs.first }</td>
                <td>${vs.last }</td>
            </tr>
        </c:forEach>
    </table>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值