书城项目

JavaEE三层架构介绍

搭建书城项目环境


IDEA工具Debug的使用






JSP

什么是jsp


jsp页面的本质






jsp的page指令


  • 虽然 /浏览器解析的时候是端口号,但是jsp本质最终还是被翻译成servlet程序,所以还是被 服务器 解析,那么 /服务器解析得到的还是工程路径

声明脚本

<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html>
<head><title>Title</title>
</head>
<body><%--1. 声明类属性--%><%!private Integer id;private String name;private static Map<String, Object> map;%><%--2.声明static静态代码块--%><%!static {map = new HashMap<String, Object>();map.put("key1", "value1");map.put("key2", "value2");map.put("key3", "value3");}%><%--3.声明类方法--%><%!public int abc() {return 12;}%><%--4.生成内部类--%><%!public static class A {private Integer id = 12;private String abc = "abc";}%>
</body>
</html>
  • jsp也会自动导包
  • 在声明了类的属性后,进入a.java即翻译后的程序后,发现我们定义的属性已经在源码中啦



表达式脚本

<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html>
<head><title>Title</title>
</head>
<body><%--1. 声明类属性--%><%!private Integer id;private String name;private static Map<String, Object> map;%><%--2.声明static静态代码块--%><%!static {map = new HashMap<String, Object>();map.put("key1", "value1");map.put("key2", "value2");map.put("key3", "value3");}%><%--3.声明类方法--%><%!public int abc() {return 12;}%><%--4.生成内部类--%><%!public static class A {private Integer id = 12;private String abc = "abc";}%><%--表达式脚本可以在页面输出 整型、浮点型、字符串、对象--%><%=12 %> <br><%=12.12 %> <br><%="这是一个字符串" %> <br><%=map %> <br></body>
</html>

  • 翻译后的程序中,在 _jspService 这个方法中 :
<%--表达式脚本可以在页面输出 整型、浮点型、字符串、对象--%><%=12 %> <br><%=12.12 %> <br><%="这是一个字符串" %> <br><%=map %> <br><%=request.getParameter("username")%>
</body>
</html>

代码脚本

  • _jspService方法中的现有对象都可以直接使用 :

  • 由多个代码脚本块组合完成一个完整的java语句 :

  • 代码脚本可以和表达式脚本一起使用,在jsp页面输出数据 :

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html>
<head><title>Title</title>
</head>
<body><table border="1" cellspacing="0"><%for (int j = 0; j < 10; j ++ ) {%><tr><td>第 <%=j + 1%>行</td></tr><%}%></table>
</body>
</html>



jsp中的三种注释

1.html注释
<!-- 这是html注释 -->
html注释会被翻译到java源代码中。在_jspService方法里,以out.write输出到客户端

  • jsp注释是jsp中真正的注释

jsp中的九大内置对象

jsp中的内置对象,是指tomcat在翻译jsp页面成为servlet源代码后,内部提供的九大对象,叫内置对象

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)throws java.io.IOException, javax.servlet.ServletException {final java.lang.String _jspx_method = request.getMethod();if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");return;}final javax.servlet.jsp.PageContext pageContext;javax.servlet.http.HttpSession session = null;final javax.servlet.ServletContext application;final javax.servlet.ServletConfig config;javax.servlet.jsp.JspWriter out = null;final java.lang.Object page = this;

request : 请求对象
response :响应对象
pageContext :jsp的上下文对象
session :会话对象
application :ServletContext对象(Servlet上下文对象)
config :ServletConfig对象
out :jsp输出流对象
page :指向当前jsp的对象
第九个对象需要isErrorPage为true才会出现,也就是 exception :异常对象

jsp四大域对象的演示

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><h1>scope.jsp页面</h1><%// 往四个域中都分别存了数据pageContext.setAttribute("key", "pageContext");request.setAttribute("key", "request");session.setAttribute("key", "session");application.setAttribute("key", "application");%>pageContext域是否有值 :<%=pageContext.getAttribute("key")%> <br>request域是否有值 :<%=request.getAttribute("key")%> <br>session域是否有值 :<%=session.getAttribute("key")%> <br>application域是否有值 :<%=application.getAttribute("key")%> <br><%request.getRequestDispatcher("/scope2.jsp").forward(request, response);%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><h1>scope2.jsp页面</h1>pageContext域是否有值 :<%=pageContext.getAttribute("key")%> <br>request域是否有值 :<%=request.getAttribute("key")%> <br>session域是否有值 :<%=session.getAttribute("key")%> <br>application域是否有值 :<%=application.getAttribute("key")%> <br>
</body>
</html>


  • 整个请求转发还是 一次请求
  • 关闭浏览器以后再打开scope2.jsp页面(没有关闭服务器) :
  • 重新部署tomcat,再访问scope2 :
  • 数据存储在域对象中需要占据空间,如果使用范围大的,可能已经被用过了,但是并没有释放空间,所以优先使用范围小的,使用完自动销毁

out和response.getWriter输出的区别


<%out.write("out 1");out.flush();out.write("out 2");response.getWriter().write("res 1");response.getWriter().write("res 2");%>

常用标签之 静态包含

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>main.jsp</title>
</head>
<body>头部信息 <br>主题内容 <br><%--<%@include file=""%> 就是静态包含file属性制定你要包含的jsp页面的路径地址中第一个斜杠 / 表示 http://ip:port/工程路径/      映射到代码的web目录静态包含的特点 :1、静态包含不会翻译被包含的jsp页面2、静态包含其实是被被包含的jsp页面的代码拷贝到包含的位置执行输出--%><%@include file="/include/footer.jsp"%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>footer.jsp</title>
</head>
<body>页脚信息 <br>
</body>
</html>

常用标签之 动态包含


动态包含的底层原理 :

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>main.jsp</title>
</head>
<body>头部信息 <br>主题内容 <br><%--<jsp:include page=""></jsp:include> 这是动态包含动态包含也可以像静态包含一样把被包含的内容输出到包含位置动态包含的特点 :1、动态包含会把包含的jsp页面也翻译成为java代码2、动态包含底层代码使用如下去调用被包含的jsp页面执行输出JspRuntimeLibrary.include(request, response, "/include/footer.jsp", out, false);3、动态包含,还可以传递参数--%><jsp:include page="/include/footer.jsp"><jsp:param name="username" value="bbj"/><jsp:param name="password" value="root"/></jsp:include>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>footer.jsp</title>
</head>
<body>页脚信息 <br><%=request.getParameter("password")%>
</body>
</html>
  • 一般用jsp只是输出页面数据,不会有太复杂代码,因此一般使用的是 静态包含

常用标签之 请求转发

练习一 :在jsp页面中输出九九乘法口诀表

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><table><% for (int i = 1; i <= 9; i ++ ) { %><tr><% for (int j = 1; j <= i; j ++ ) { %><td><%= j + "x" + i + "=" + (i * j)%></td><% } %></tr><% } %></table>
</body>
</html>

练习二 :遍历输出十个学生信息到表格中

package com.atguigu.pojo;public class Student {private Integer id;private String name;private Integer age;private String phone;// 构造器(无参 + 全参)+ Getter+Setter + toString@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", phone='" + phone + '\'' +'}';}public Student(Integer id, String name, Integer age, String phone) {this.id = id;this.name = name;this.age = age;this.phone = phone;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public Student() {}
}
<%@ page import="com.atguigu.pojo.Student" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title><style>table {border: 1px pink solid;width: 600px;border-collapse: collapse;}td, th {border: 1px pink solid;}</style>
</head>
<body><%List<Student> studentList = new ArrayList<Student>();for (int i = 0; i < 10; i++) {int t = i + 1;studentList.add(new Student(t, "name" + t, 18 + t, "phone" + t));}%><table><tr><td>编号</td><td>姓名</td><td>年龄</td><td>电话</td><td>操作</td></tr><% for (Student student : studentList) { %><tr><td><%=student.getId() %></td><td><%=student.getName()%></td><td><%=student.getAge()%></td><td><%=student.getPhone()%></td><td>操作、修改</td></tr><% } %></table>
</body>
</html>

请求转发的使用说明

请求转发的使用 :

  • servlet程序其实是不太适合回传html数据给后端的,比较麻烦,而是jsp页面比较适合干这件事
  • 因此,我们把这件事交给jsp,专门用来显示学生信息
  • 那么,我们就需要serlet和jsp共同完成这件事情,
  • 因此,需要 请求转发,刚好请求转发共享request域数据
package com.atguigu.pojo;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class SearchStudentServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求的参数// 发sql语句查询学生的信息// 使用for循环生成查询到的数据做模拟List<Student> studentList = new ArrayList<Student>();for (int i = 0; i < 10; i++) {int t = i + 1;studentList.add(new Student(t, "name" + t, 18 + t, "phone" + t));}// 保存查询到的结果(学生信息)到request域中req.setAttribute("stuList", studentList);// 请求转发到 showStudent.jsp页面req.getRequestDispatcher("/test/showStudent.jsp").forward(req, resp);}
}
<%@ page import="com.atguigu.pojo.Student" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title><style>table {border: 1px pink solid;width: 600px;border-collapse: collapse;}td, th {border: 1px pink solid;}</style>
</head>
<body><%List<Student> studentList = (List<Student>) request.getAttribute("stuList");%><table><tr><td>编号</td><td>姓名</td><td>年龄</td><td>电话</td><td>操作</td></tr><% for (Student student : studentList) { %><tr><td><%=student.getId() %></td><td><%=student.getName()%></td><td><%=student.getAge()%></td><td><%=student.getPhone()%></td><td>操作、修改</td></tr><% } %></table>
</body>
</html>
  • 注意,写完代码以后直接访问showStudent.jsp会 空指针异常
  • 因为,我们直接访问jsp页面,没有经过servlet程序,还没有数据
  • 所以,访问的时候一定要先访问这个servlet
  • 记得给这个servlet加上地址

什么是Listener监听器

ServletContextListener监听器



package com.atguigu.listener;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;public class MyServletContextListenerImpl implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("ServletContext对象被创建了");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("ServletContext对象被销毁了");}
}
<?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"><servlet><servlet-name>SearchStudentServlet</servlet-name><servlet-class>com.atguigu.pojo.SearchStudentServlet</servlet-class></servlet><servlet-mapping><servlet-name>SearchStudentServlet</servlet-name><url-pattern>/searchStudentServlet</url-pattern></servlet-mapping><!-- 配置监听器--><listener><listener-class>com.atguigu.listener.MyServletContextListenerImpl</listener-class></listener>
</web-app>

尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(二)相关推荐

  1. 尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(一)

    HTML和CSS ctrl + shift + / 在同一行代码中的后半截产生注释 HTML标签的介绍 标签拥有自己的属性,分为 基本属性 和 事件属性 标签的基本属性 :bgcolor=" ...

  2. 尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(四)

    文件的上传和下载 文件上传的介绍 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns= ...

  3. 尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(三)

    EL表达式 什么是EL表达式 <%@ page contentType="text/html;charset=UTF-8" language="java" ...

  4. 尚硅谷大数据技术Zookeeper教程-笔记01【Zookeeper(入门、本地安装、集群操作)】

    视频地址:[尚硅谷]大数据技术之Zookeeper 3.5.7版本教程_哔哩哔哩_bilibili 尚硅谷大数据技术Zookeeper教程-笔记01[Zookeeper(入门.本地安装.集群操作)] ...

  5. PowerMill模具数控编程视频教程全套产品三轴零基础入门到精通

    最近有很多人在问什么是结构设计?结构要处理的东西算是比较灵活,因为一个产品有了外形设计之后,要做结构设计来处理其运动特性.这样的产品在结构上是否坚固,是否能满足产品的要求,就成了结构设计的重要内容,而 ...

  6. 新版思科CCNA认证1.0 零基础入门技术VTP协议解析-ielab网络实验室

     新版思科CCNA认证1.0 零基础入门技术VTP协议解析-ielab网络实验室 VTP(VLAN Trunking Protocol):VLAN中继协议,是Cisco专用协议.也被称为虚拟局域网干道 ...

  7. cad vba编程从入门到精通_【CAD教程】CAD2020零基础入门到精通全套视频教程

    AutoCAD是如今一款使用最广泛的工程绘图软件.普及率非常高,相信不管你从事的工作是哪个行业,都有机会接触到它,重要性仅次于Office办公套件了.如果你还不熟悉或还不够熟悉,建议都尽快来学习一下. ...

  8. 计算机pscs6教程,photoshop CS6零基础入门教程

    <photoshop CS6零基础入门教程>针对零基础学员开设,以教案和实际操作演示相结合的方式,详细地介绍adobe photoshop cs6的各项工具和命令.由浅入深.循序渐进地全面 ...

  9. 【3d建模】zbrush教程非常适合零基础入门,一学就会

    ZBrush 是一款新型的 CG 软件,它的优秀的Z球建模方式,不但可以做出优秀的静帧,而且也参与了很多电影特效.游戏的制作过程(大家熟悉的指环王III,半条命II都有Zbrush 的参与).它可以和 ...

最新文章

  1. 一则利用内核漏洞获取root权限的案例【转】
  2. Can you answer these queries III (线段树维护最大子段和)
  3. jar中的类文件更新遇到的问题:请分析下原因呢
  4. iOS App 上架(Analysis 工具使用)
  5. COVID-19研究助理
  6. java单例模式(饿汉式和懒汉式的几种不同写法)
  7. 【POJ - 3211】Washing Clothes (dp,0-1背包中点问题)
  8. 手机QQ浏览器如何同时下载多个文件
  9. IRT模型的参数估计方法(EM算法和MCMC算法)
  10. python 图像模糊处理实现
  11. OSN 7500 智能光交换系统是继承了MSTP技术的全部特点
  12. android9系统WIFI提示已连接,无法访问互联网
  13. C语言程序设计作业——摘苹果
  14. 单片机可以替代PLC吗?
  15. ESRGAN - Enhanced Super-Resolution Generative Adversarial Networks论文翻译——中英文对照
  16. SUMO学习日志(一)SUMO安装
  17. 发货100虚拟商品自动发货系统
  18. 计算机教师教学日记,计算机教师实习日记30篇.doc
  19. 【云原生之Docker实战】使用Docker部署Duplicati备份工具
  20. 德州仪器撤出手机芯片市场:新一轮洗牌开始

热门文章

  1. 使用公式给参数赋默认初始值
  2. 通用分销渠道和通用产品组的解析
  3. 应收应付重组配置和操作解析
  4. 为什么你的记忆总会越来越模糊?
  5. SAP ABAP逻辑数据库
  6. SAP登陆界面TITLE修改方法(Method of SAP Logon GUI Title Modification)
  7. 元宇宙教不会区块链赚钱
  8. 宏光MINI EV收割的年轻人,又被苏宁、小米、欧拉盯上了
  9. 我们都准备好进入数字货币+无现金世界了?
  10. java搜索项目内的异常_java中用Lucene做搜索,在建索引时遇到的2个异常