JavaWeb之JSP技术(三)

  1. 什么是JSP?
  • Java Server Pages : Java服务器端页面,也和Servlet一样,用于动态Web技术!JSP的本质其实就是一个Servlet。

  • 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码

  1. JSP与HTML的区别
  • HTML只给用户提供静态的数据

  • JSP页面中可以嵌入JAVA代码,为用户提供动态数据

  1. JSP与Servlet的区别
  • servlet 很难对数据进行排版

  • JSP容易对数据进行排版

| 类别 | 适用场景 |

| — | — |

| HTML | 只能开发静态资源,不能包含java代码,无法添加动态数据。 |

| Servlet | 写java代码,可以输出页面内容,但是很不方便,开发效率极低。 |

| JSP | 它包括了HTML的展示技术,同时具备Servlet输出动态资源的能力。但是不适合作为控制器来用。 |

1.1、JSP原理


  • JSP本质上就是一个Servlet

  • 当我们第一次访问Jsp的时候,Jsp 引擎都会将这个Jsp翻译成一个Servlet,这个文件存放在tomcat (源码目录)中的work目录中。

  • 在JSP页面中,只要是 JAVA代码就会原封不动的输出,如果是HTML代码,就会被转换为

out.write(“\r\n”);

这样的格式,输出到前端!

1.1.1、JSP执行过程分析图

在这里插入图片描述

JSP的原理:

​ 客户端提交请求

​ ——Tomcat服务器解析请求地址

​ ——找到JSP页面

​ ——Tomcat将JSP页面翻译成Servlet的java文件

​ ——将翻译好的.java文件编译成.class文件

​ ——返回到客户浏览器上。

1.2、JSP的脚本


  • JSP的脚本就是JSP定义Java代码的方式

  • JSP 作为java技术的一种应用,它拥有一些自己扩充的语法,但是Java所有语法都支持!

1.2.1、java脚本段

  1. 第一种:java脚本段,可以定义局部变量、编写语句
  • 格式:<% %>

<%-- jsp脚本片段 --%>

<%

int sum = 0;

for (int i = 1; i <=100 ; i++) {

sum+=i;

}

out.println(“

Sum=”+sum+“

”);

%>

1.2.2、jsp声明

  1. 第二种:jsp声明,可以定义全局变量、方法、类
  • 格式:<%! %>

<%!

static {

System.out.println(“Loading Servlet!”);

}

private int Var = 0;

public void kuang(){

System.out.println(“进入了方法Kuang!”);

}

%>

1.2.3、jsp表达式

  1. 第三种:jsp表达式,用来将程序的输出,输出到客户端(浏览器)
  • 格式:<%= 变量或者表达式 %>

<%= new java.util.Date()%>

在这里插入图片描述

1.3、JSP指令


使用包含操作,可以将一些重复的代码包含进来继续使用,从正常的页面组成来看,有时可能分为几个区域。而其中的一些区域可能是一直不需要改变的, 改变的就其中的一个具体内容区域。现在有两种方法可以实现上述功能。

  • 方法一:在每个JSP页面(HTML)都包含工具栏、头部信息、尾部信息、具体内容

  • 方法二:将工具栏、头部信息、尾部信息都分成各个独立的文件,使用的时候直接导入

  • 很明显,第二种方法比第一种更好,第一种会存在很多重复的代码,并且修改很不方便

  • 在JSP中如果要想实现包含的操作,有两种做法:静态包含、动态包含,静态包含使用include指令即可,动态包含则需要使用include动作标签

1.3.1、include静态包含

格式:

<%@ include file=“要包含的文件路径”%>

  • 静态包含就是将内容进行了直接的替换,就好比程序中定义的变量一样,是在 servlet 引擎转译时,就把此文件内容包含了进去,所以只生成了一个 servlet,所以两个页面不能有同名的变量

<%–@include会将两个页面合二为一–%>

<%@include file=“common/header.jsp”%>

网页主体

<%@include file=“common/footer.jsp”%>

在使用include动态包含的时候我们可以传递参数,例如:

jsptag.jsp

我们在此jsp中放入参数,这样我们访问:http://localhost:8080/jsptag.jsp 就相当于http://localhost:8080/jsptag.jsp?name=kuangshen&age=12

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

Title

1

<%-- http://localhost:8080/jsptag.jsp?name=kuangshen&age=12 --%>

<jsp:forward page=“/jsptag2.jsp”>

<jsp:param name=“name” value=“kuangshen”/>

<jsp:param name=“age” value=“12”/>

</jsp:forward>>

jsptag2.jsp

我们在另一个页面获取参数

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

Title

2

<%–取出参数–%>

名字:<%=request.getParameter(“name”)%>

年龄:<%=request.getParameter(“age”)%>

  • 访问测试

在这里插入图片描述

1.3.2、include动态包含

格式:

<jsp:include page=“要包含的文件路径” />

动态包含在代码的编译阶段,包含和被包含部分是两个独立的部分,只有当运行时,才会动态包含进来,好比方法的调用。

<%–jsp:include:拼接页面,本质还是三个–%>

<jsp:include page=“/common/header.jsp” />

网页主体

<jsp:include page=“/common/footer.jsp” />

1.4、JSP注释


在JSP中支持两种注释的语法操作

  • 一种是显示注释,这种注释是允许客户端(浏览器)看见的;

  • 显示注释语法:从HTML风格继承而来

  • 另一种是隐式注释,此种注释是客户端无法看见的

  • 隐式注释语法:从JAVA风格继承,JSP自己的注释

  1. html注释:
:只能注释html代码片段
  1. jsp注释:推荐使用

<%-- --%>:可以注释所有

1.5、定制错误页面


我们可以自己定制错误页面,并在web.xml中进行配置,例如

jsp2.jsp

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

Title

<%

<%-- 手动制造错误 --%>

int x = 1/0;

%>

  • 测试启动

在这里插入图片描述

  • 此时弹出500的错误页面,我们可以自己写错误页面,让其发生错误时跳转到一个更美观的错误页面

  • 我们新建一个error包,新建500.jsp

500.jsp

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

自定义500错误的界面

自定义500错误的界面

500
  • 我们在web.xml中进行错误页面的配置

500

/error/500.jsp

  • 访问测试

在这里插入图片描述

  • 此时发生错误就会跳转到我们自己写的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、基本语法


自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

面试是跳槽涨薪最直接有效的方式,马上金九银十来了,各位做好面试造飞机,工作拧螺丝的准备了吗?

掌握了这些知识点,面试时在候选人中又可以夺目不少,暴击9999点。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
达式的依赖 -->

javax.servlet.jsp.jstl

jstl-api

1.2

taglibs

standard

1.1.2

4.1、基本语法


自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-u4Ptcnbk-1713120707049)]

[外链图片转存中…(img-o6pBKgRs-1713120707049)]

[外链图片转存中…(img-qghHgMWK-1713120707049)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

面试是跳槽涨薪最直接有效的方式,马上金九银十来了,各位做好面试造飞机,工作拧螺丝的准备了吗?

掌握了这些知识点,面试时在候选人中又可以夺目不少,暴击9999点。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。

[外链图片转存中…(img-nZz6XmsO-1713120707050)]

[外链图片转存中…(img-GJ2Bo3EV-1713120707050)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值