- 什么是JSP?
-
Java Server Pages : Java服务器端页面,也和Servlet一样,用于动态Web技术!JSP的本质其实就是一个Servlet。
-
可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
- JSP与HTML的区别
-
HTML只给用户提供静态的数据
-
JSP页面中可以嵌入JAVA代码,为用户提供动态数据
- JSP与Servlet的区别
-
servlet 很难对数据进行排版
-
JSP容易对数据进行排版
| 类别 | 适用场景 |
| — | — |
| HTML | 只能开发静态资源,不能包含java代码,无法添加动态数据。 |
| Servlet | 写java代码,可以输出页面内容,但是很不方便,开发效率极低。 |
| JSP | 它包括了HTML的展示技术,同时具备Servlet输出动态资源的能力。但是不适合作为控制器来用。 |
-
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文件
——返回到客户浏览器上。
-
JSP的脚本就是JSP定义Java代码的方式
-
JSP 作为java技术的一种应用,它拥有一些自己扩充的语法,但是Java所有语法都支持!
1.2.1、java脚本段
- 第一种:java脚本段,可以定义局部变量、编写语句
- 格式:
<% %>
<%-- jsp脚本片段 --%>
<%
int sum = 0;
for (int i = 1; i <=100 ; i++) {
sum+=i;
}
out.println(“
Sum=”+sum+“
”);%>
1.2.2、jsp声明
- 第二种:jsp声明,可以定义全局变量、方法、类
- 格式:
<%! %>
<%!
static {
System.out.println(“Loading Servlet!”);
}
private int Var = 0;
public void kuang(){
System.out.println(“进入了方法Kuang!”);
}
%>
1.2.3、jsp表达式
- 第三种:jsp表达式,用来将程序的输出,输出到客户端(浏览器)
- 格式:
<%= 变量或者表达式 %>
<%= new java.util.Date()%>
使用包含操作,可以将一些重复的代码包含进来继续使用,从正常的页面组成来看,有时可能分为几个区域。而其中的一些区域可能是一直不需要改变的, 改变的就其中的一个具体内容区域。现在有两种方法可以实现上述功能。
-
方法一:在每个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” %>
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” %>
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” />
在JSP中支持两种注释的语法操作
-
一种是显示注释,这种注释是允许客户端(浏览器)看见的;
-
显示注释语法:从HTML风格继承而来
-
另一种是隐式注释,此种注释是客户端无法看见的
-
隐式注释语法:从JAVA风格继承,JSP自己的注释
- html注释:
- jsp注释:推荐使用
<%-- --%>:可以注释所有
我们可以自己定制错误页面,并在web.xml中进行配置,例如
jsp2.jsp
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
<%
<%-- 手动制造错误 --%>
int x = 1/0;
%>
- 测试启动
-
此时弹出500的错误页面,我们可以自己写错误页面,让其发生错误时跳转到一个更美观的错误页面
-
我们新建一个error包,新建500.jsp
500.jsp
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
自定义500错误的界面
- 我们在web.xml中进行错误页面的配置
500
/error/500.jsp
- 访问测试
- 此时发生错误就会跳转到我们自己写的500.jsp页面了
- 同理,我们也可以自己定制404页面,只需要在web.xml中再次配置404页面路径即可
404.jsp
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
- web.xml中配置
404
/error/404.jsp
- 测试访问
内置对象:在jsp页面中不需要创建,直接使用的对象(由jsp自动创建的对象,可以直接使用)
| 变量名 | 真实类型 | 作用 |
| — | — | — |
| pageContext | PageContext(存东西) | 当前页面共享数据,还可以获取其他八个内置对象 |
| request | HttpServletRequest(存东西) | 一次请求访问的多个资源(转发) |
| session | HttpSession(存东西) | 一次会话的多个请求间 |
| application | ServletContext(存东西) | 所有用户间共享数据 |
| response | HttpServletResponse | 响应对象 |
| page | Object | 当前页面(Servlet)的对象 this |
| out | JspWriter | 输出对象,数据输出到页面上 |
| config | ServletConfig | Servlet的配置对象 |
| exception | Throwable | 异常对象 |
- 简介
它是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” %>
<%–内置对象–%>
<%
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” %>
<%
// 从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
:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;
| 域对象名称 | 范围 | 级别 | 备注 |
| — | — | — | — |
| PageContext | 页面范围 | 最小,只能在当前页面用 | 因范围太小,开发中用的很少 |
| ServletRequest | 请求范围 | 一次请求或当期请求转发用 | 当请求转发之后,再次转发时请求域丢失 |
| HttpSession | 会话范围 | 多次请求数据共享时使用 | 多次请求共享数据,但不同的客户端不能共享 |
| ServletContext | 应用范围 | 最大,整个应用都可以使用 | 尽量少用,如果对数据有修改需要做同步处理 |
============================================================================
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,“西安”);
}
对于JavaBean实体类的包名,我们有以下建立的方式:
-
com.XXX.pojo
-
com.XXX.entity
-
com.XXX.dto
-
com.XXX.vo
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” %>
<%
// 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
===========================================================================
- 什么是MVC?
Model、View、Controller
模型、视图、控制器
模型:JavaBean实体类和数据库表中对应的字段
视图:jsp页面
控制器:servlet,负责跳转页面
Model:
-
业务处理:完成具体的业务操作(Service)
-
数据持久层:数据库的增删改查(Dao)
View:
-
展示页面。动态展示用jsp页面,静态数据展示用html。
-
提供链接发起Servlet请求
Controller:(Servlet)
-
接受用户的请求 ,拿到用户的请求参数
-
交给业务层处理对应的代码
-
控制视图的跳转
流程如下:
登录—>接收用户的登录请求—>处理用户的请求(获取用户登录的参数,username,password)---->交给业务层处理登录业务(判断用户名密码是否正确)—>Dao层查询用户名和密码是否正确–>数据库
=========================================================================
-
概念:Expression Language 表达式语言
-
作用:替换和简化jsp页面中java代码的编写
-
语法:
${表达式}
-
使用之前要进行配置依赖
javax.servlet.jsp.jstl
jstl-api
1.2
taglibs
standard
1.1.2
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
面试是跳槽涨薪最直接有效的方式,马上金九银十来了,各位做好面试造飞机,工作拧螺丝的准备了吗?
掌握了这些知识点,面试时在候选人中又可以夺目不少,暴击9999点。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
达式的依赖 -->
javax.servlet.jsp.jstl
jstl-api
1.2
taglibs
standard
1.1.2
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-u4Ptcnbk-1713120707049)]
[外链图片转存中…(img-o6pBKgRs-1713120707049)]
[外链图片转存中…(img-qghHgMWK-1713120707049)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
面试是跳槽涨薪最直接有效的方式,马上金九银十来了,各位做好面试造飞机,工作拧螺丝的准备了吗?
掌握了这些知识点,面试时在候选人中又可以夺目不少,暴击9999点。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。
[外链图片转存中…(img-nZz6XmsO-1713120707050)]
[外链图片转存中…(img-GJ2Bo3EV-1713120707050)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!