2024年JavaWeb之JSP技术(三),Java从入门到精通

最后

我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?

既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?

架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。

如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。

中高级开发必知必会:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 访问测试

在这里插入图片描述

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

1.6、定制404页面


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

404.jsp

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

404 404
  • web.xml中配置

404

/error/404.jsp

  • 测试访问

在这里插入图片描述

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” %>

Title

<%–内置对象–%>

<%

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” %>

Title

<%

// 从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表达式输出 ${} --%>

取出的值为:

${name1}

${name2}

${name3}

${name4}

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

<%=name5%>

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

${name5}

  • 注意此时的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” %>

Title

<%

// 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”/>

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

  • 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层查询用户名和密码是否正确–>数据库

在这里插入图片描述

4、EL表达式

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

  • 概念:Expression Language 表达式语言

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

  • 语法:${表达式}

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

javax.servlet.jsp.jstl

jstl-api

1.2

taglibs

standard

1.1.2

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” %>

EL表达式入门案例

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

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

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


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


EL表达式获取:${message}

4.2、获取四大域中的数据


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

4.3、EL表达式的注意事项


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

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

EL表达式的注意事项

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

第一个:没有空指针异常

<% String str = null;

request.setAttribute(“testNull”,str);

%>

${testNull}


第二个:没有数组下标越界

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

request.setAttribute(“strs”,strs);

%>

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

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


第三个:没有字符串拼接

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

s t r s [ 0 ] + {strs[0]}+ strs[0]+{strs[1]}

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” %>

EL两个特殊的运算符

<%–empty运算符:

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

–%>

<% String str = null;

String str1 = “”;

List slist = new ArrayList();

pageContext.setAttribute(“str”, str);

pageContext.setAttribute(“str1”, str1);

pageContext.setAttribute(“slist”, slist);

%>

${empty str}============当对象为null返回true

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

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


<%–三元运算符

条件?真:假

–%>

<% 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”:“”}>女

5、JSTL表达式

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

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

5.1、使用要求


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

javax.servlet

jstl

1.1.2

taglibs

standard

1.1.2

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” %>

Title
if测试

<%–

EL表达式获取表单中的数据

最后

小编精心为大家准备了一手资料

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

BATJ面试要点及Java架构师进阶资料

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取


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” %>

Title
if测试

<%–

EL表达式获取表单中的数据

最后

小编精心为大家准备了一手资料

[外链图片转存中…(img-pjo4vjnH-1714841002285)]

[外链图片转存中…(img-uPSuyPsc-1714841002286)]

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

[外链图片转存中…(img-BZlOlkPm-1714841002286)]

BATJ面试要点及Java架构师进阶资料

[外链图片转存中…(img-pj9tyxhL-1714841002286)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 13
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值