写点什么

JavaWeb 之 JSP 技术 (三)

  • 2022 年 4 月 25 日
  • 本文字数:6793 字

    阅读完需:约 22 分钟

<location>/error/500.jsp</location>


</error-page>


  • 访问测试



  • 此时发生错误就会跳转到我们自己写的 500.jsp 页面了


[](()1.6、定制 404 页面




  • 同理,我们也可以自己定制 404 页面,只需要在 web.xml 中再次配置 404 页面路径即可


404.jsp


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


<html>


<head>


<title>404</title>


</head>


<body>


<img src="../img/404.png" alt="404" >


</body>


</html>


  • web.xml 中配置


<error-page>


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


<location>/error/404.jsp</location>


</error-page>


  • 测试访问



[](()1.7、九大内置对象




内置对象:在 jsp 页面中不需要创建,直接使用的对象(由 jsp 自动创建的对象,可以直接使用)


| 变量名 | 真实类型 | 作用 |


| --- | --- | --- |


| pageContext | PageContext(存东西) | 当前页面共享数据,还可以获取其他八个内置对象 |


| request | HttpServletRequest(存东西) | 一次请求访问的多个资源(转发) |


| session | HttpSession(存东西) | 一次会话的多个请求间 |


| application | ServletContext(存东西) | 所有用户间共享数据 |


| response | HttpServletResponse | 响应对象 |


| page | Object | 当前页面(Servlet)的对象 this |


| out | JspWriter | 输出对象,数据输出到页面上 |


| config | ServletConfig | Servlet 的配置对象 |


| exception | Throwable | 异常对象 |


[](()1.8、PageContext 对象




  • 简介


它是 JSP 独有的对象,Servlet 中没有这个对象。本身也是一个域(作用范围)对象,但是它可以操作其他 3 个域对象中的属性。而且还可以获取其他 8 个隐式对象。


PageContext 用来代表整个 JSP 页面,是当前页面的作用域对象,一旦跳转则失效


  • 生命周期


它是一个局部变量,所以它的生命周期随着 JSP 的创建而诞生,随着 JSP 的结束而消失。每个 JSP 页面都有一个独立的 PageContext。


  • PageContext 对象操作其他作用域存储和获取


通过pageContext.setAttribute("name",value) 存储值


通过pageContext.getAttribute("name") 获取值


  • PageContext 获取其他内置对象


pageContext.getRequest(); //返回 request 内置对象


pageContext.getResponse(); //返回 response 内置对象


pageContext.getServletConfig(); //返回 config 内置对象


pageContext.getException(); //返回 exception 内置对象


pageContext.getPage(); //返回 page 内置对象


pageContext.getOut(); //返回 out 内置对象


pageContext.getServletContext(); //返回 application 内置对象


pageContext.getSession(); //返回 session 内置对象




需求:我们在 pageContextDemo01.jsp 存入四个数据,我们去其他 jsp 页面去取


pageContextDemo01.jsp


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


<html>


<head>


<title>Title</title>


</head>


<body>


<%--内置对象--%>


<%


pageContext.setAttribute("name1","1 号");


request.setAttribute("name2","2 号");


session.setAttribute("name3","3 号");


application.setAttribute("name4","4 号");


%>


pageDemo02.jsp


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


<html>


<head>


<title>Title</title>


</head>


<body>


<%


// 从 pageContext 取出,通过寻找的方式来


// 从底层到高层(作用域):page->request->session->application


String name1 = (String) pageContext.findAttribute("name1");


String name2 = (String) pageContext.findAttribute("name2");


String name3 = (String) pageContext.findAttribute("name3");


String name4 = (String) pageContext.findAttribute("name4");


String name5 = (String) pageContext.findAttribute("name5");


%>


<%--使用 EL 表达式输出 ${} --%>


<h1>取出的值为:</h1>


<h3>${name1}</h3>


<h3>${name2}</h3>


<h3>${name3}</h3>


<h3>${name4}</h3>


<%--使用 jsp 表达式输出--%>


<h3><%=name5%></h3>


<%--使用 EL 表达式输出--%>


<h3>${name5}</h3>


</body>


</html>


  • 注意此时的 name5 数据不存在,但是我们用jsp表达式EL表达式分别去取,会发生什么呢?

  • 我们先访问/pageContextDemo01.jsp去存入数据,再访问/pageDemo02.jsp去取数据



  • 只取到了 3、4 号数据,那么这就是域对象的问题了


| 对象 | 作用域 |


| --- | --- |


| pageContext.setAttribute | 保存的数据只在一个页面中有效 |


| request.setAttribute | 保存的数据只在一次请求中有效,请求转发会携带这个数据 |


| session.setAttribute | 保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器 |


| application.setAttribute | 保存的数据只在服务器中有效,从打开服务器到关闭服务器 |


pageContext.setAttribute("name1","1 号"); //保存的数据只在一个页面中有效


request.setAttribute("name2","2 号"); //保存的数据只在一次请求中有效,请求转发会携带这个数据


session.setAttribute("name3","3 号"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器


application.setAttribute("name4","4 号"); // 保存的数据只在服务器中有效,从打开服务器到关闭服务器


  • 所以一般这几个对象都会有如下使用场景

  • request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!

  • session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;

  • application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;


[](()1.9、四大域对象




| 域对象名称 | 范围 | 级别 | 备注 |


| --- | --- | --- | --- |


| PageContext | 页面范围 | 最小,只能在当前页面用 | 因范围太小,开发中用的很少 |


| ServletRequest | 请求范围 | 一次请求或当期请求转发用 | 当请求转发之后,再次转发时请求域丢失 |


| HttpSession | 会话范围 | 多次请求数据共享时使用 | 多次请求共享数据,但不同的客户端不能共享 |


| ServletContext | 应用范围 | 最大,整个应用都可以使用 | 尽量少用,如果对数据有修改需要做同步处理 |


[](()2、JavaBean


============================================================================


JavaBean 就是实体类。是特殊的 Java 类,使用 Java 语言书写,并且遵守 JavaBean API 规范。


JavaBean 有特定的写法:


  • 必须要有一个无参构造

  • 属性必须私有化

  • 必须有对应的 get/set 方法


JavaBean 一般用来和数据库的字段做映射


  • 数据库中的表对应 java 中的类

  • 表中的字段对应 java 类中的属性

  • 表中的行记录对应 java 创建的对象


例如:这是数据库的一张 people 表


| id | name | age | address |


| --- | --- | --- | --- |


| 1 | 秦疆 1 号 | 3 | 西安 |


| 2 | 秦疆 2 号 | 18 | 西安 |


| 3 | 秦疆 3 号 | 100 | 西安 |


class People{


private int id;


private String name;


private int id;


private String address;


}


class A{


new People(1,"秦疆 1 号",3,"西安");


new People(2,"秦疆 2 号",3,"西安");


new People(3,"秦疆 3 号",3,"西安");


}


[](()2.1、实体类的包名




对于 JavaBean 实体类的包名,我们有以下建立的方式:


  1. com.XXX.pojo

  2. com.XXX.entity

  3. com.XXX.dto

  4. com.XXX.vo


[](()2.2、实体类




JavaBean 实体类一般用来和数据库的字段做映射,例如,我们创建一个 People 类


public class People {


private int id;


private int age;


private String address;


// 无参构造


public People() {


}


// 有参构造


public People(int id, int age, String address) {


this.id = id;


this.age = age;


this.address = address;


}


// get/set 方法


public int getId() {


return id;


}


public void setId(int id) {


this.id = id;


}


public int getAge() {


return age;


}


public void setAge(int age) {


this.age = age;


}


public String getAddress() {


return address;


}


public void setAddress(String address) {


this.address = address;


}


// 重写 toString 方法


@Override


public String toString() {


return "People{" +


"id=" + id +


", age=" + age +


", address='" + address + ''' +


'}';


}


}


  • 如果我们只是单纯的创建一个类,那么这只能称之为一个 People 类,不能称为实体类。那如何才能称为实体类呢?

  • 我们需要在数据库中建立对应的 People 表

  • 实体类一般都是和数据库中的表结构一一对应



javabean.jsp


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


<html>


<head>


<title>Title</title>


</head>


<body>


<%


// People people = new People();


// people.setId();


// people.setName();


// people.setAge();


// people.setAddress();


// people.getId();


// people.getName();


// people.getAge();


// people.getAddress();


%>


<jsp:useBean id="people" class="com.kuang.pojo.People" scope="page" />


<jsp:setProperty name="people" property="id" value="1" />


<jsp:setProperty name="people" property="name" value="李沁" />


<jsp:setProperty name="people" property="age" value="3" />


<jsp:setProperty name="people" property="address" value="西安" />


id<jsp:getProperty name="people" property="id"/>


姓名<jsp:getProperty name="people" property="name"/>


年龄<jsp:getProperty name="people" property="age"/>


地址<jsp:getProperty name="people" property="address"/>


</body>


</html>


这段代码的意思就是注释的代码的意思


  • jsp:userBean 相当于new People

  • jsp:setProperty 相当于 people.setXXX

  • jsp:getProperty 相当于 people.getXXX



[](()3、MVC 三层架构


===========================================================================


  1. 什么是 MVC?


Model、View、Controller


模型、视图、控制器


模型:JavaBean 实体类和数据库表中对应的字段


视图:jsp 页面


控制器:servlet,负责跳转页面


Model


  • 业务处理:完成具体的业务操作(Service)

  • 数据持久层:数据库的增删改查(Dao)


View


  • 展示页面。动态展示用 jsp 页面,静态数据展示用 html。

  • 提供链接发起 Servlet 请求


Controller:(Servlet)


  • 接受用户的请求 ,拿到用户的请求参数

  • 交给业务层处理对应的代码

  • 控制视图的跳转


流程如下:


登录—>接收用户的登录请求—>处理用户的请求(获取用户登录的参数,username,password)---->交给业务层处理登录业务(判断用户名密码是否正确)—>Dao 层查询用户名和密码是否正确–>数据库


![在这里插入图片描述](http 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 s://img-blog.csdnimg.cn/f6e3215353d344a2a999567be17cbd10.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0F1Z2Vuc3Rlcm5fUVhM,size_16,color_FFFFFF,t_70#pic_center)


[](()4、EL 表达式


=========================================================================


  • 概念:Expression Language 表达式语言

  • 作用:替换和简化 jsp 页面中 java 代码的编写

  • 语法:${表达式}

  • 使用之前要进行配置依赖


<dependency>


<groupId>javax.servlet.jsp.jstl</groupId>


<artifactId>jstl-api</artifactId>


<version>1.2</version>


</dependency>


<dependency>


<groupId>taglibs</groupId>


<artifactId>standard</artifactId>


<version>1.1.2</version>


</dependency>


[](()4.1、基本语法




EL 表达式的语法格式非常简单,写为 ${表达式内容}


EL 表达式就是把内容输出到页面上


例如:在浏览器中输出请求域中名称为 message 的内容。


假定,我们在请求域中存入了一个名称为 message 的数据(request.setAttribute("message","EL");),此时在 jsp 中获取的方式,如下表显示:


| Java 代码块 | JSP 表达式 | EL 表达式 |


| :-- | :-- | :-- |


| <% String message = (String)request.getAttribute(“message”); out.write(message);%> | <%=request.getAttribute(“message”)%> | ${message} |


通过上面我们可以看出,都可以从请求域中获取数据,但是 EL 表达式写起来是最简单的方式。这也是以后我们在实际开发中,当使用 JSP 作为视图时,绝大多数都会采用的方式。


在 JSP 页面中编写代码


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


<html>


<head>


<title>EL 表达式入门案例</title>


</head>


<body>


<%--使用 java 代码在请求域中存入一个名称为 message 的数据--%>


<% request.setAttribute("message","Expression Language");%>


Java 代码块获取:<% out.print(request.getAttribute("message"));%>


<br/>


JSP 表达式获取:<%=request.getAttribute("message")%>


<br/>


EL 表达式获取:${message}


</body>


</html>


[](()4.2、获取四大域中的数据




EL 表达式的作用,它就是用于获取数据的,它只能从四大域中获取数据,调用的就是findAttribute(name,value);方法,根据名称由小到大逐个域中查找,找到就返回,找不到就什么都不显示。


[](()4.3、EL 表达式的注意事项




在使用 EL 表达式时,它帮我们做了一些处理,使我们在使用时可以避免一些错误。它没有空指针异常,没有数组下标越界,没有字符串拼接。


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


<html>


<head>


<title>EL 表达式的注意事项</title>


</head>


<body>


<%--EL 表达式的三个没有--%>


第一个:没有空指针异常<br/>


<% String str = null;


request.setAttribute("testNull",str);


%>


${testNull}


<hr/>


第二个:没有数组下标越界<br/>


<% String[] strs = new String[]{"a","b","c"};


request.setAttribute("strs",strs);


%>


取第一个元素:${strs[0]}


取第六个元素:${strs[5]}


<hr/>


第三个:没有字符串拼接<br/>


<%--${strs[0]+strs[1]}--%>


{strs[1]}


</body>


</html>


[](()4.4、EL 表达式的运算符




EL 表达式中运算符如下图所示,它们都是一目了然的:




但是有两个特殊的运算符,使用方式的代码如下

[](()4.4.1、empty

empty 运算符:判断对象是否为 null,字符串是否为空字符串,集合中元素是否是 0 个。若为空或者 null,返回空字符串、空数组,否则返回 false。

[](()4.4.2、三元运算符

条件?真:假


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


<%@ page import="com.itheima.domain.User" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">


<html>


<head>


<title>EL 两个特殊的运算符</title>


</head>


<body>


<%--empty 运算符:


它会判断:对象是否为 null,字符串是否为空字符串,集合中元素是否是 0 个


--%>


<% String str = null;


String str1 = "";


List<String> slist = new ArrayList<String>();


pageContext.setAttribute("str", str);


pageContext.setAttribute("str1", str1);


pageContext.setAttribute("slist", slist);


%>


${empty str}============当对象为 null 返回 true<br/>


${empty str1 }==========当字符串为空字符串是返回 true(注意:它不会调用 trim()方法)<br>


${empty slist}==========当集合中的元素是 0 个时,是 true


<hr/>


<%--三元运算符


条件?真:假


--%>


<% request.setAttribute("gender", "female"); %>


<input type="radio" name="gender" value="male" ${gender eq "male"?"checked":""} >男


<input type="radio" name="gender" value="female" ${gender eq "female"?"checked":""}>女


</body>


</html>


[](()5、JSTL 表达式


===========================================================================


JSTL 标签库的使用就是为了弥补 HTML 标签的不足,它自定义许多标签,可以供我们使用,标签的功能和 java 代码是一样的,我们只需看核心标签库里面的几个常用标签即可!


[](()5.1、使用要求




要想使用 JSTL 标签库,在 javaweb 工程中需要导入坐标。


<dependency>


<groupId>javax.servlet</groupId>


<artifactId>jstl</artifactId>


<version>1.1.2</version>


</dependency>


<dependency>


<groupId>taglibs</groupId>


<artifactId>standard</artifactId>


<version>1.1.2</version>


</dependency>


[](()5.2、核心标签库




我们经常可能用到的标签列在此处


| 标签名称 | 功能分类 | 分类 | 作用 |


| --- | --- | --- | --- |


| <c:if> | 流程控制 | 核心标签库 | 用于判断 |


| <c:choose> ,<c:when>,<c:otherwise> | 流程控制 | 核心标签库 | 用于多个条件判断 |


| <c:foreache> | 迭代操作 | 核心标签库 | 用于循环遍历 |


[](()5.3、JSTL 使用



[](()5.3.1、if

  • if:相当于 java 代码的 if 语句


属性:


  • test 为必须属性,接受 boolean 表达式

  • 如果表达式为 true,则显示 if 标签体内容,如果为 false,则不显示标签体内容

  • 一般情况下,test 属性值会结合 el 表达式一起使用


注意


  • c:if 标签没有 else 情况,想要 else 情况,则可以在定义一个 c:if 标签

[](()5.3.2、c:out

用于在 JSP 中显示数据,就像<%= >


coreis.jsp


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


<%--引入 JSTL 核心标签库,这样我们才能使用 JSTL 标签--%>


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


<html>


<head>


<title>Title</title>


</head>


<body>


<h4>if 测试</h4>


<hr>


<form action="coreif.jsp" method="get">


<%--

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
JavaWeb之JSP技术(三)_Java_爱好编程进阶_InfoQ写作社区