JavaWeb day05 JSPELJSTLMVC

Posted halulu.me

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb day05 JSPELJSTLMVC相关的知识,希望对你有一定的参考价值。

JSP

JSP(Java Server Pages):是一种动态网页技术标准。

JSP 部署在服务器上,可以处理客户端发送的请求,并根据请求内容动态的生成 html文档的 Web 网页,然后再响应给客户端。

JSP 是基于 Java 语言的,它的本质就是 Servlet

在这里插入图片描述

1、JSP运行原理

在这里插入图片描述

jsp生成的java类本质就是一个Servlet
jsp生成的java代码就是HttpServlet的子类
jsp本质就是servlet,所以也可以处理请求与响应输出数据

注意:

jsp文件只有在访问的时候自动生成。

2、JSP注释

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、脚本java代码的3种方式

java脚本代码片段,是一个service方法内部的局部代码,运行逻辑控制代码
java脚本表达式,是一个service方法内部的局部代码,输出数据的代码
java脚本声明,是一个全局方法,在service外部

java脚本代码片段
在这里插入图片描述

java脚本表达式
在这里插入图片描述

java脚本声明
在这里插入图片描述

4、page指令

page:页面指令,用于设置JSP上各种页面的属性

在这里插入图片描述在这里插入图片描述

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

1、language=“java” 设置脚本语言使用java,目前jsp只支持java脚本。

2、 import=“java.util.*” 导入 java.util 下所有类,导包(一个 page 指令的 import属性导入所有的包,包之间使用逗号分隔)
<%@page import="java.util.Date,java.text.SimpleDateFormat"%>

3、ContentType=“text/html; charset=utf-8” 或 pageEncoding=“UTF-8” 2个功能一样。相当于 response.setContentType("text/html;charset=utf-8");这句话,每个jsp默认解决了输出乱码

isErroePage设置友好页面

代码位置
在这里插入图片描述

web.xml

使用 error-page、error-code、location三个标签

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--统一配置所有jsp页面的错误友好信息页面
        含义:如果任何位置发生500错误,就跳转到友好页面/error/500.jsp
    -->
    <error-page>
        <error-code>500</error-code>
        <location>/error/500.jsp</location>
    </error-page>

    <!--含义:如果发生404,就跳转到友好页面/error/404.jsp-->
    <error-page>
        <error-code>404</error-code>
        <location>/error/404.jsp</location>
    </error-page>
</web-app>

500.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<%--
    isErrorPage: 配置当前页面是否接收异常,默认为false不接收异常
    使用步骤:将其值修改为true, 代表接收异常信息,这里就可以使用一个对象exception
              exception就是接收到的异常对象
--%>

<%--打印异常日志--%>
<%
    exception.printStackTrace();
%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2>服务器忙,请明天再来访问。。。</h2>
<a href="../index.jsp">返回首页</a>
</body>
</html>

注意:

isErrorPage: 配置当前页面是否接收异常,默认为false不接收异常
使用步骤:将其值修改为true, 代表接收异常信息,这里就可以使用一个对象exception
exception就是接收到的异常对象

400.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2>您访问的资源走丢了,请访问其他资源。。。</h2>
<a href="../index.jsp">返回首页</a>
</body>
</html>

注意:

404友好页面不能配置isErrorPage 。因为404不是开发人员需要解决的异常

5、include指令(静态包含)

作用:

在一个 JSP 页面中静态包含另一个 JSP

在这里插入图片描述

静态包含:

用户访问A.jsp页面的时候,服务器会将A.JSP页面与B.jsp页面内容合并,最后翻译生成1个java文件,是A.java

静态包含特点:

A页面包含B页面,在A页面里面可以共享B页面的成员变量

在这里插入图片描述

注意:

如果xx.jsp文件都有定义变量,那么不能多次include同一个xx.jsp文件,会包变量重复定义的错误。
如果没有定义变量,就可以多次include同一个xx.jsp文件

6、JSP动态标签

在这里插入图片描述

1、include动态包含标签

在这里插入图片描述在这里插入图片描述

静态包含:

是将2个页面内容合并在一起后翻译成一个java,再编译运行;2个页面共享变量

动态包含:

是将2个页面分别翻译成2个java文件,再编译运行的结果合并在一起,由于是2个java文件,所以不共享变量

注意:

静态包含速度比动态包含速度快

2、forward转发跳转标签

在这里插入图片描述

JSP底层是Servlet,forward的底层是request请求转发跳转

页面路径没有变化

3、Param传递参数标签

在这里插入图片描述
one.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--目标:转发跳转使用param标签传递参数,注意:jsp的动作标签的复合标签形式中间不能有jsp注释,否则发生异常--%>
<jsp:forward page="two.jsp">
    <jsp:param name="username" value="admin"/>
    <jsp:param name="password" value="123456"/>
</jsp:forward>

two.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<p>username=<%=request.getParameter("username") %></p>
<p>password=<%=request.getParameter("password") %></p>

注意:

配合forward使用,底层是请求域传递参数

7、JSP九大内置对象

在这里插入图片描述

8、JSP四大内置域对象

1、pageContext,页面域,在一个页面内(一个资源内)有效,一个servlet内,不能实现资源之间传递数据(最小的域)

2、 request,请求域,一次请求内有效,适合转发传递数据

3、session,会话域,一次会话内有效,应用场景存储验证码和用户登录数据

4、servletContext(application别名),上下文域,整个应用程序有效,存储的数据所有用户共享,应用场景统计某个资源访问量等等

pageContext

PageContext作用:

1.是一个页面域对象, 只能在当前页面内使用
2.自动查找域数据。可以依次查找pageContext、request、session、application4个对象的数据,查到为止。
3.可以获取其他8个内置对象

在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--
PageContext作用:
    1.是一个页面域对象, 只能在当前页面内使用
	2.自动查找域数据。可以依次查找pageContext、request、session、application4个对象的数据,查到为止。
	3.可以获取其他8个内置对象

示例:使用不同的域对象存储一个key为one, 不同的域存储的值value不一样,使用pageContext查找域中的数据
--%>
<h2>页面域对象</h2>
<%
    pageContext.setAttribute("one","pageContext");//页面域
    request.setAttribute("one","request"); //请求域
    session.setAttribute("one","session");//会话域
    application.setAttribute("one","application");//上下文域
%>
<p>获取pageContext域中的数据:<%=pageContext.getAttribute("one") %></p><%--结果:pageContext--%>
<p>获取request域中的数据:<%=request.getAttribute("one") %></p><%--结果:request--%>
<p>获取session域中的数据:<%=session.getAttribute("one") %></p><%--结果:session--%>
<p>获取application域中的数据:<%=application.getAttribute("one") %></p><%--结果:application--%>

<h2>自动查找域数据</h2>
<p>使用pageContext的findAttribute查找域中的数据:<%=pageContext.findAttribute("one") %></p>
<%--结果:pageContext
    原因:findAttribute方法功能是从pageContext、request、session、application域对象依次查找数据,找到就停止,没有找到返回null
--%>

<h2>获取其他内置对象</h2>
<%--
pageContext对象可以获取所有其他内置对象,eg:
        pageContext.getSession();
        pageContext.getRequest();
        pageContext.getServletContext();
        pageContext.getServletConfig();
        pageContext.getOut() ....
--%>
<%
    pageContext.getOut().print("hello");  //获取其他内置对象的意义:就是为了el可以根据pageContext获取其他内置对象进行操作
%>
</body>
</html>

EL

Expression Language(表达式语言),使用el代替页面上的脚本表达式,简化输出

el作用

1、从域(jsp四大域)里面获取数据进行输出

2、可以进行运算符表达式计算,将结果输出

3、以后servlet从数据库获取的数据放到域对象中,跳转到jsp,jsp使用el技术从域里面获取数据显示

注意:

通过el获取数据,必须得把数据写进域里面。
JSP四大内置域.setAttribute();

1、EL获取指定域对象数据

在这里插入图片描述

2、EL获取域中不同类型数据

在这里插入图片描述

<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="com.itheima.entity.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--
目标:使用el从域中获取不同类型的数据
--%>
<h2>el获取域中JavaBean类型数据</h2>
<%
    //1.创建对象
    User user = new User("播仔","15");
    //2.写入域
    pageContext.setAttribute("user",user);
    //3.使用el读取域中数据输出
    //el读取JavaBean属性数据的格式:${域的key.javaBean对象的属性字段名}
    //获取数据原理,是调用javaBean对象的属性名的get封装方法获取数据
%>
<%--<p>user对象name属性值:${user.getName()}</p>  这是正确的--%>
<p>user对象name属性值:${user.name}</p> <%--优化的--%>
<p>user对象age属性值:${user.age}</p>


<h2>el获取域中Map类型数据</h2>
<%
    //1.创建对象
    Map<String,User> map = new HashMap<>();
    map.put("bozai",new User("播仔","15"));
    map.put("boniu",new User("播妞","13"));

    //2.写入域
    pageContext.setAttribute("userMap",map);
    //3.使用el读取域中数据输出
    //el读取Map数据的格式:${域的key.map的key} 获取map的key对应的值
%>
<p>map对象key为bozai的user对象name属性值:${userMap.bozai.name}</p>
<p>map对象key为bozai的user对象age属性值:${userMap.bozai.age}</p>
<p>map对象key为boniu的user对象name属性值:${userMap.boniu.name}</p>
<p>map对象key为boniu的user对象age属性值:${userMap.boniu.age}</p>

<h2>el获取域中List类型数据</h2>
<%
    //1.创建对象
    List<User> userList = new ArrayList<>();
    userList.add(new User("播仔","15"));
    userList.add(new User("播妞","13"));

    //2.写入域
    pageContext.setAttribute("userList",userList);
    //3.使用el读取域中数据输出
    //el读取List数据的格式:${域的key[索引]} 获取集合指定索引位置的元素对象,索引从0开始
%>
<p>List对象第一个元素的user对象name属性值:${userList[0].name}</p>
<p>List对象第一个元素的user对象age属性值:${userList[0].age}</p>
<p>List对象第二个元素的user对象name属性值:${userList[1].name}</p>
<p>List对象第二个元素的user对象age属性值:${userList[1].age}</p>

<h2>el获取域中数组类型数据</h2>
<%
    //1.创建对象
    User[] users = {new User("播仔","15"),new User("播妞","13")};

    //2.写入域
    pageContext.setAttribute("users",users);
    //3.使用el读取域中数据输出
    //el读取数组数据的格式:${域的key[索引]} 获取数组指定索引位置的元素对象,索引从0开始
%>
<p>数组对象第一个元素的user对象name属性值:${users[0].name}</p>
<p>数组对象第一个元素的user对象age属性值:${users[0].age}</p>
<p>数组对象第二个元素的user对象name属性值:${users[1].name}</p>
<p>数组对象第二个元素的user对象age属性值:${users[1].age}</p>

</body>
</html>

3、EL中使用运算符表达式

在这里插入图片描述

注意:

${5/2} —》 2.5

除法是除得尽的,如果除不尽会保留16位小数。

1+2+3+a=${1+2+3+a+1} —》 7
在域中获取不到数据不会参与运算

在这里插入图片描述
在这里插入图片描述

判空表达式

作用:

1.判断表达式是否null, null返回true, 否则返回false
2.判断表达式是否为空字符串, 空字符串返回true, 否则返回false
3.判断表达式是集合是否有元素, 集合对象不为空,但是里面没有元素返回true, 否则返回false

格式:
在这里插入图片描述

<h2>判空表达式</h2>
<%--
    格式:${empty 表达式}
    作用:
        1.判断表达式是否null, null返回true, 否则返回false
        2.判断表达式是否为空字符串, 空字符串返回true, 否则返回false
        3.判断表达式是集合是否有元素, 集合对象不为空,但是里面没有元素返回true, 否则返回false
--%>
<p>空字符串:${empty ""}</p><%--输出:true--%>
<p>空对象:${empty null}</p><%--输出:true--%>
<%
    List<String> list =new ArrayList<>();
    request.setAttribute("list",list);
%>
<p>空集合:${empty list}</p><%--输出:true--%>
<%
    list.add("abc");
    request.setAttribute("list",list);
%>
<p>有元素集合:${empty list}</p><%--输出:false--%>

注意:

el获取数据需要写进JSP四大域中。

4、EL隐式对象

在这里插入图片描述
在这里插入图片描述

pageContext的使用

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--
目标:el隐式对象pageContext
  el隐式对象pageContext 作用: 用于获取里面get封装方法的属性数据
--%>
<h2>获取项目路径【重要】</h2>
<p>脚本表达式方式:<%=request.getContextPath() %></p>
<p>el表达式方式:${pageContext.request.contextPath}</p>  <%--jsp的pageContext.getRequest().getContextPath()--%>

<h2>获取请求资源路径</h2>
<p>脚本表达式方式:<%=request.getRequestURI() %></p>
<p>el表达式方式:${pageContext.request.requestURI}</p>

<h2>当前会话id</h2>
<p>脚本表达式方式:<%=session.getId() %></p>
<p>el表达式方式:${pageContext.session.id }</p>
</body>
</body>
</html>

cookie的使用

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    //目标:创建cookie写入到浏览器,使用el读取cookie的数据

    //1.创建cookie写入浏览器
    Cookie cookie = new Cookie("username","admin");
    response.addCookie(cookie);
    out.print("cookie写入成功");
%>

<%--2.使用el读取cookie的数据
    格式:${cookie.cookie的name.value}  获取cookie的name对应的value
    注意:第一次访问获取不到,需要第二次访问才可以获取到
--%>
<p>cookie的name对应的value:${cookie.username.value}</p><%--输出:admin--%>
</body>
</html>

param 和 paramValues 使用

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--目标:使用el读取请求参数数据
比如:url?name=admin&hobby=game&hobby=爱编程

--%>
<p>读取参数名name的数据:${param.name}</p>  <%--admin--%>
<p>读取参数名hobby的第一个爱好数据:${paramValues.hobby[0]}</p><%--game--%>
<p>读取参数名hobby的第二个爱好数据:${paramValues.hobby[1]}</p><%--爱编程--%>
</body>
</html>

header的使用

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--
header对象: el的隐式对象用于获取请求头数据
--%>
<p>请求:${header.host}</p>
<p>请求:${header.user-agent}</p><%--这个写法是错误的,因为key里面不能有特殊字符--%>
<p>请求:${header["user-agent"]}</p><%--使用[""]解决含有特殊字符的key--%>
</body>
</html>

注意:

1、有特殊字符需要使用【“ ”】


JSTL

JSTL(Java Server Pages Standarded Tag Library):JSP 标准标签库。

主要提供给开发人员一个标准通用的标签库。

开发人员可以利用这些标签取代 JSP 页面上的 Java 代码,从而提高程序的可读性,降低程序的维护难度。

在这里插入图片描述

在这里插入图片描述

jsp页面导入核心标准标签库

<%--
使用taglib指令导入jstl核心标签库
    prefix="c" 设置使用jstl核心标签里面标签的前缀
    uri="http://java.sun.com/jsp/jstl/core" 指向核心标签库的地址
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
</body>
</html>

1、JSTL常用标签----if标签

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2>if标签的使用[重要]</h2>
<%--
格式:<c:if test="${条件表达式}">
        //符合条件运行的代码
      </c:if>
作用:用于条件判断,与java的if功能一样,没有else-if
需求:判断会话域里面是否有登录数据,有显示的欢迎xx登录成功,否则显示请登录
--%>
<%
    session.setAttribute("loginUser","admin");
%>
    <p>欢迎xxxx,登录成功</p>
    <p>请登录...</p>
以上是关于JavaWeb day05 JSPELJSTLMVC的主要内容,如果未能解决你的问题,请参考以下文章

day05 Request Response

崔希凡JavaWeb笔记day25-day27(11月11日22:02:34)

崔希凡JavaWeb笔记day28(JavaWeb完毕)(期末,暂停更新)(11月16日12:35:27)

day24(JAVAWEB上传与下载)

Day08 JavaWeb学习之Xml 01

崔西凡JavaWeb笔记day13-day15(8月30日22:36:30)