Java之JSP核心知识

JSP

JSP(Java Server Pages) 和Servlet技术一样,用于开发动态web资源的技术
JSP实际上就是Servlet。

JSP = HTML + Java
HTML:静态内容
Servlet:适合编写Java逻辑代码 不适合写界面显示的部分
JSP:适合编写输出动态内容,但不适合编写Java逻辑

JSP原理(编译执行过程):
    访问JSP页面时,JSP页面会被翻译成.java文件
    然后.java文件会被编译成.class文件(字节码文件)

JSP的最佳写法:
JSP:界面、一些简单逻辑以及获取显示数据
Servlet:Java处理逻辑

JSP的基础语法

小脚本<% %>:里面可以正常书写Java代码
例如:获取当前系统的时间

    <%
        Date date = new Date();
        out.write(date.toLocaleString());
    %>

表达式<%= %>

    <%
        int num1 = 10;
        out.print(num1);
    %>
    <!-- 相当于 out.print(num1) 并且可以运算 -->
    <%=num1 %>

声明

    <%!
        // 加上叹号会被翻译到类的下面 也就是全局变量
        // 还可以声明方法 静态块
        int num2 = 10;
    %>
    <%
        int num1 = 10;
        num1++;
        num2++;
    %>
    <%=num1 %>
    <%=num2 %>

JSP注释: <%– 被注释的内容 –%> 特点:安全(不会再源码中显示)
网页注释:< ! - - html注释 - - > 特点:不安全

JSP指令

page

page(import)

import和Java代码中的import是一样的
例如:
    导入多个包:
        <%@ page import="java.util.Date,java.util.List"%>
    或者 分开写:
        <%@ page import="java.util.Date"%>
        <%@ page import="java.util.List"%>

JSP会自动导入以下的包:
    import java.lang.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.jsp.*;

page(session) 默认值是true 相当于session开关

    <%@ page session="true" %>

page(errorPage) 如果页面中有错误,则跳转到指定的资源
page(isErrorPage): 是否创建throwable对象。默认是false;

    <%@ page errorPage="/error.jsp" %>
    <%
        int num = 10/0;
    %>
    error.jsp:
        <!-- 默认是关闭状态的 打开捕获异常信息的对象的创建 Throwable -->
        <%@ page isErrorPage="true" %>
        服务器正在紧张的建设当中..请稍后访问
        <br>
        <%
            String msg = exception.getMessage();
            out.print("错误信息:" + msg);
        %>

page(contextType)等同于response.setContextType(“text/html;charset=utf-8”);

include

include指令: file指包含哪个页面
静态包含

    <%@ include file="/4.jsp" %>
    静态包含:在翻译成.java文件前就已经合成了页面

动态包含

    <jsp:include page="/4.jsp"></jsp:include>
    动态包含:代码逐行执行,当执行到动态包含的时候 才会去编译被包含的页面
    动态包含会生成两套文件

原则:能用静就不用动的

taglib

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

    // prefix="c" 代表给jstl标签库中的标签 起个别名
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <c:if test=""></c:if>

需要导入的jar包:
    jstl.jar 
    standard.jar

JSP动作

6个动作:

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

useBean、setProperty、getProperty 配合使用

    <%
        // 创建一个User对象
        User user = new User();
        user.setName("sc");
        user.setPwd("123");
        out.print(user.getName());
    %>
    <br>
    /*
     * class:JavaBean的全限定类名
     * id: 合法的Java变量名称,指明JavaBean对象的名称。
     *      JSP中可以使用该名称引用该JavaBean对象区分大小写
     */
    <jsp:useBean id="user1" class="com.lanou3g.User"/>
    // name 对象 property 属性
    <jsp:setProperty property="name" name="user1" value="dp"/>
    <jsp:setProperty property="pwd" name="user1" value="456"/>
    <%=user.getName() %>
    <br>
    <jsp:getProperty property="name" name="user1"/>
    <jsp:getProperty property="pwd" name="user1"/>

    结果:   sc
            sc
            dp 456

forward和param配合使用

<jsp:forward> 转发 
<jsp:param> 携带参数相当于在网址后面拼接/2.jsp?username=sc&password=123
    <!--携带请求的参数 不要在中间加注释-->
    <jsp:forward page="/2.jsp">
        <jsp:param value="sc" name="username"/>
        <jsp:param value="123" name="password"/>
    </jsp:forward>
    <!--获取转发中的参数-->
    <%= request.getAttribute("username") %>
    <!--获取参数(是保存在参数中不是域中)-->
    <%= request.getParameter("username") %>
    <%= request.getParameter("password") %>

JSP内置对象

九个内置对象

request对象: 封装了来自客户端、浏览器的各种信息。
response对象:封装了服务器的响应信息。
session对象: 用来保存会话信息。也就是说,可以实现在同一用户的不同请求之间共享数
application对象:代表了当前应用程序的上下文。可以在不同的用户之间共享信息。
exception对象:封装了jsp程序执行过程中发生的异常和错误信息。
page对象:当前servlet实例 指向了当前jsp程序本身(this)
config对象:封装了应用程序的配置信息。
out对象:用于向客户端、浏览器输出数据。
pageContext对象:提供了对jsp页面所有对象以及命名空间的访问。 (指当前页面 域对象)

pageContext内置对象

查看pageContext中的方法

    public void fun(PageContext pageContext) {
        // 强大的pageContext可以获取任何域对象(从小到大)
        pageContext.getRequest();
        pageContext.getSession();
        pageContext.getServletContext();
    }
el表达式就依赖这个方法
测试pageContext域:
    该域对象只在本页面有效,出了页面获取不到
    例如:
    <%
        pageContext.setAttribute("page", "pageContext");
    %>
    <%=pageContext.getAttribute("page") %>
    在2.jsp中就获取不到
    <!-- 获取pageContext中的内容 -->
    <%= pageContext.getAttribute("page") %>

域中的查找顺序

操作其它域对象的方法:
    void setAttribute(String name,Object o,int Scope);
    Object getAttribute(String name,int Scope);
    void removeAttribute(String name,int Scope);
注意:一般系统方法中,需要一个int参数一般会是常量
只要有pageContext,就能向各个域中添加值(参数三表示对应域的常量)
scpoe的值:
    PageContext.PAGE_SCOPE 
    PageContext.REQUEST_SCOPE 
    PageContext.SESSION_SCOPE 
    PageContext.APPLICATION_SCOPE

使用findAttribute(String name)方法

自动从page request session application依次查找,找到了就取值,结束查找。
例如:
    pageContext.setAttribute("p", "pageContext", PageContext.PAGE_SCOPE);
    pageContext.setAttribute("p", "request", PageContext.REQUEST_SCOPE);
    pageContext.setAttribute("p", "session", PageContext.SESSION_SCOPE);
    pageContext.setAttribute("p", "application", PageContext.APPLICATION_SCOPE);
    // 从小到大找
    <%=pageContext.findAttribute("p") %>

EL表达式

el表达式是为了简化jsp中java代码开发
它不是一种开发语言,是jsp中获取数据的一种规范
容错性强,域中没有该值什么都不显示,不会显示null

使用el表达式获取域中的数据

实际上就是使用pageContext.findAttribute这个方法在域中查找的
    ${p }

使用el表达式获取域中保存的对象

    <%
        User user = new User();
        user.setUsername("sc");
        user.setPassword("123");
        // 添加地址对象
        Address address = new Address();
        address.setCity("zh");
        user.setAddress(address);
        out.print(user);
        request.setAttribute("u", user);
    %>

    <!--相当于调用get方法(前提必须有个体方法)-->
    ${u.username }

    <!--JavaBean导航:通过get方法获取的,直接使用点-->
    ${u.address.city }

    <!--使用[]获取值,注意:使用[]要加引号-->
    ${u["username"] }
    ${u['username'] }
注意:[]运算符 点能做的,它也能做;它能做的,点不一定能做
${student.name} == ${student['name']} == ${student["name"]}

使用el表达式获取域中保存的集合

    <%
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        HashMap<String,String> map = new HashMap<>();
        map.put("username", "sc");
        map.put("password", "123");
        request.setAttribute("l", list);
        request.setAttribute("m", map);
    %>

    <!-- 如果是集合的话 只能使用[] -->
    ${l[0] }
    ${m.username }
    ${m['username'] }

empty判断空值

测试empty判断空值

空字符串和没有元素的集合(即使集合对象本身不为null)都返回true
    <% 
        String str1 = null;
        String str2 = "";
        String str3 = "jsadjas";
        request.setAttribute("s1", str1);
        request.setAttribute("s2", str2);
        request.setAttribute("s3", str3);

        ArrayList<String> list1 = new ArrayList<>();
        list1.add("aaaa");
        ArrayList<String> list2 = new ArrayList<>();

        ArrayList<String> list3 = null;
        request.setAttribute("list1", list1);
        request.setAttribute("list2", list2);
        request.setAttribute("list3", list3);
    %>

    <!-- 判断是否是空的,只要没有值就返回true -->
    ${empty s1 }
    ${empty s2 }
    ${empty s3 }
    ${empty list1 }
    ${empty list2 }
    ${empty list3 }
结果:true true false false true true

三目运算符

    ${empty list3 ? "我是前面的" : "我是后面的" }

html中测试三目运算符

    <% 
        String sex = "女";
        request.setAttribute("s", sex);
    %>

    <!--根据域中的值默认选择男女-->
    <input type="radio" name="sex" value="男" ${s == "男" ? "checked ='checked'" : "" }>男
    <input type="radio" name="sex" value="女" ${s == "女" ? "checked ='checked'" : "" }>女

EL表达式的隐式对象

    pageContext(对象)

    pageScope

    requestScope

    sessionScope

    applicationScope

    param ${param.userName } = request.getParamemter("userName");

    paramValues

    header ${header["User-agent"]}

    headerValues

    cookie ${cookie.JSESSIONID.value } 测试不加value

测试隐式对象(可以直接在el表达式中使用)

    <% 
        pageContext.setAttribute("p", "pageContext", PageContext.PAGE_SCOPE);
        pageContext.setAttribute("p", "request", PageContext.REQUEST_SCOPE);
        pageContext.setAttribute("p", "session", PageContext.SESSION_SCOPE);
        pageContext.setAttribute("p", "application", PageContext.APPLICATION_SCOPE);
    %>

    ${pageScope.p }
    ${requestScope.p }
    ${sessionScope.p }
    ${applicationScope.p }

pageContext代表对象可以使用方法

    <!--${pageContext.request.contextPath }代表工程路径-->
    <form action="${pageContext.request.contextPath }/9.jsp" method="post">
        账号<input type="text" name="username"><br>
        密码<input type="password" name="passowrd"><br>
        爱好<input type="checkbox" name="hobby" value="篮球">篮球
        <input type="checkbox" name="hobby" value="唱歌">唱歌<br>
        <input type="submit" value="提交">
    </form>

9.jsp:
    <%
        <!--处理乱码-->
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
    %>

    <!--获取参数(相当于调用了getParameter()方法)-->
    ${param.username }

    <!--获取多个参数-->
    ${paramValues.hobby[0] }

    <!--获取请求头-->
    ${header["User-Agent"] }

    <!--获取cookie中的值-->
    ${cookie.JSESSIONID }

    <!--获取SessionID-->
    ${cookie.JSESSIONID.value }

JSTL

什么是JSTL?
JSTL是JSP的标准标签库

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

使用JSTL需要JSP页面添加taglib指令,添加核心库
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
导入jar包:
    jstl-1.2.jar
    standard-1.1.2.jar

通用标签

set out remove

    <!-- 声明一个变量 默认是放在page域中 -->
    <c:set var="num" value="10" scope="session"></c:set>

    <!-- 相当于直接输出到网页上 out对象一样 -->
    <c:out value="${num }" default="aaa"></c:out><br>

    ${num }<br>

    <!-- 删除 -->
    <c:remove var="num" scope="session"/>
    ${num }

条件标签

if choose

    <!-- 声明变量 -->
    <c:set var="n" value="10"></c:set>
    <!-- 逻辑表达式 if choose -->
    <c:if test="${n<5 }">aaa</c:if>
    <c:if test="${n>5 }">bbb</c:if>
    <c:choose>
        <c:when test="${n==5 }">5</c:when>
        <c:when test="${n==10 }">10</c:when>
        <c:otherwise>yyy</c:otherwise>
    </c:choose>

迭代标签

foreach

    <!-- 循环 step循环增量 -->
    <c:forEach var="i" begin="0" end="10" step="2">
        ${i }<br>
    </c:forEach>

    <%
        ArrayList<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");
        list.add("eee");
        request.setAttribute("list", list);
    %>
    <!-- items 要遍历的容器 var表示容器中的对象 -->
    <c:forEach items="${list }" var="l" step="2">
        ${l }<br>
    </c:forEach>

foreach动态生成表格

    <table border="1">
        <tr>
            <th></th>
            <th>索引</th>
            <th>计数</th>
            <th>第一个元素</th>
            <th>最后一个元素</th>
        </tr>
        <c:forEach items="${list }" var="l" varStatus="vs" >
            <tr>
                <td>${l }</td>
                <td>${vs.index }</td>
                <td>${vs.count }</td>
                <td>${vs.first }</td>
                <td>${vs.last }</td>
            </tr>
        </c:forEach>
    </table>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值