【一】JSP的使用
[1]JSP的引入
[a]目前书写登录最大问题:
我们目前学习所有的功能 页面操作都是使用Servlet进行展示的,Servlet虽然可以开发动态页面,但是我们发现这样
书写【非常非常非常】麻烦,而且非常容易出错,后期维护非常麻烦
[b]解决方案:
JSP :本质就是一个Servlet 相当于对Servlet的封装
[c]是不是JSP出现了Servlet就不再使用了?
JSP只是代替了Servlet的作用一:动态页面的开发,我们现在不使用Servlet进行动态页面开发,但是
我们现在使用Servlet 进行流程控制。
[d]为什么使用JSP代替Servlet 难道不可以使用HTML吗?
HTML可以开发网页,也可以提交数据,但是HTML不可以接受服务端转发过来携带Request中数据,
JSP 除了可以写HTML代码 还可以写java JSP=HTML+Java—->动态网页
[2]JSP的概念
JSP(全称Java Server Pages)是由Sun公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的WEB网页,然后返回给请求者。简单来说:JSP(JavaServer Pages)是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来。
[3]JSP执行原理及流程

  • JSP看似是HTML代码,看似是页面,但其实是一种后端技术
  • 当我们第一发送请求访问jsp资源时,Tomcat服务器中的JSP加载引擎会将该JSP资源转换成一个 .java 文件(Servlet)
  • 这个 .java文件其实就是一个Servlet,在这个Servlet中已经将写在JSP中的HTML代码以writer.write()的方式编写好了,然后将数据响应给浏览器的
  • JSP本质上就是一个Servlet,JSP中的HTML代码就相当于我们之前在Servlet中写的writer.write()代码

[3.1]JSP执行过程
转换/翻译(translation):Tomcat中的JSP引擎将JSP网页转换成Servlet,得到一个.java文件
编译(compile):通过javac命令将.java文件编译成 .class文件
运行:运行.class字节码文件,处理请求
05.jsp执行步骤.png
具体运行过程:

  1. 浏览器发起请求访问jsp
  2. Tomcat服务器接收到请求后调用对应的Servlet处理请求,调用JspServlet
  3. JspServlet将请求的jsp文件转换成对应的Java文件并完成编译
  4. 将编译后的class文件加载到内存并执行,其实就是运行一个Servlet
  5. 最后得到结果数据响应浏览器

当我们第一次请求jsp页面时,会将jsp页面进行转换、编译、运行。再次请求jsp页面时,如果没有页面内容没有改变,就只执行【运行】步骤
[4]
1.JSP页面中包含的内容
A、HTML
B、注释:[Java注释 HTML注释 JSP注释]
<%—jsp注释—%>
<!—HTML注释—%>
C、Java代码:[小脚本 声明式 表达式]
小脚本:<%%> 声明式:<%!%> 表达式:<%=直接写输出语句%>
2.小脚本和声明式之间的区别
A.小脚本定义的Java代码最后都会放到service方法中 声明式中的代码最后放到方法外
B.小脚本定义的所有变量都是局部变量 声明式中定义的变量式成员变量
C.小脚本中不可以定义方法 声明式中可以定义方法
D.小脚本中可以直接使用JSP的内置对象 声明式中不可以使用JSP内置对象
3.何为JSP内置对象
JSP本身就给我们提供的对象称为内置对象 我们使用内置对象的时候不用创建 不用获得 直接使用即可。
因为JSP底层就已经把这些对象创建好了。
JSP内置对象一共9个。例如:out request response
4.JSP注释和HTML注释的区别
JSP注释更优越 JSP减少网络带宽
[5]JSP的使用建议

  • JSP和Servlet本质上是相同的。所以说,JSP页面功能和Servlet中功能完全可以互换
  • JSP的编码风格是在HTML中嵌入少量的Java代码,它用于展示数据比较方便
  • Servlet适合编写Java代码
  • 所以在MVC分层上,我们往往将Servlet作为控制层,将JSP作为视图层
  • 以后通过Servlet去处理请求,得到结果,然后通过JSP来进行结果展示

[6]jsp原理图
04.jsp原理图.png
【二】JSP中的常用指令标签
[1.]JSP页面包含的元素
A.HTML
B.注释[java注释 HTML注释 JSP注释]
C.Java代码[小脚本 声明式 表达式]
D.jsp:xxx:动作标识—-》大部分已经不用了。但是记住
E.%@xxx:指令标识—-》3种
<%@include:把一个网页引入当前页面
<%@page:可以指定当前jsp页面配置信息 例如:当前网页解析编码 导入包 xxx
<%@taglib:JSTL中使用的
[2] 动态包含 和%@include 静态包含
A.静态包含就是把代码复制到当前网页中 动态包含相当于方法调用
B.静态包含不会产生.java和.class 动态包含会产生.java和.class
C.静态包含发生在jsp与运行的第一个阶段 动态包含发生在jsp运行的第三个阶段
[3]常见page指令标签
contenType :指定当前JSP页面的MIME类型和字符编码
errorPage:指定当JSP页面发生异常时需要转向的错误处理页面
errorPage:指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage:指定当前页面是否可以作为另一个JSP页面的错误处理页
extends:指定servlet从哪一个类继承
import:导入要使用的Java类
11.png
【三】JSP内置对象
[1]九大内置对象
33.png
[2]Servlet与JSP的联系和区别
联系:

  1. JSP和Servlet都是Sun公司推出的动态网页技术
  2. 基于Servlet开发页面的繁琐性,推出JSP来简化页面开发
  3. JSP本质上是一个Servlet,会翻译成一个Servlet

区别:

  1. JSP使人们把显示和逻辑分隔成为可能,这意味着两者的开发可并行进行;而Servlet并没有把两者分开。
  2. JSP是在HTML代码里写JAVA代码,框架是HTML;而Servlet是在JAVA代码中写HTML代码,本身是个JAVA类。
  3. Servlet需要在web.xml中配置,而JSP无需配置。
  4. 目前JSP主要用在视图层负责显示,而Servlet主要用在控制层负责调度

强调
JSP表面上是一个HTML,本质上是一个Servlet。
[3]JSP的使用总结

  1. 创建Jsp文件,在项目的web目录下创建。
  2. 使用page指令设置Jsp的转译细节(一般自动生成的就够用)
  3. 使用tablib指令引入第三方的自定义标签来使用(JSTL标签)
  4. 使用HTML,CSS,JQuery完成页面的开发
  5. 使用<%%>声明java脚本片段完成数据的动态拼接
  6. 获取request或者session中的数据拼接到当前页面中(内置对象)

【四】MVC模式
[1]mvc:
m:model模型层
v:view视图层
c:controller控制层
22.png
[2]Dao模式和mvc模式:
08.Dao模式和mvc模式.png
[3]mvc各层分析
09.mvc各层分析.png

[4]JavaBean
符合特定规范的Java类,是一种可重用的组件。
特定规范
public class,提供无参数构造方法。
属性private
提供public的setter和getter方法。
功能分类
封装数据:数据Bean 实体类。
封装业务: 业务Bean service Mapper。
【五】EL
[1.]特点

  1. 可以获取作用域对象中的数据
  2. 底层使用的是反射,在使用的时候可以通过键名即可获取对应的值
  3. 简化了在jsp页面中使用<%%>获取域对象数据的方式

[2.]使用
基本语法

  1. ${键名},键名是域对象中存储的数据的键
  2. ${键名.属性名.属性名…},可以获取域对象中级联属性的值
  3. ${键名[角标]},获取域对象中存储的list集合或者数组中指定角标的数据
  4. 注意:${}不仅可获取域对象中的数据,而且会将该数据打印到浏览器中。如果获取不到数据,也不会报错,只是不显示而已。

作用域数据查找顺序
使用EL表达式获取域数据的时候,如果没有指明作用域,那会按照作用域由小到大的顺序去找,直到找到为止: pageContext —-> request —-> session —-> application
EL的四个范围和JSP的四个范围对应,分别为pageContextScope、requestScope、sessionScope,applicationScope
指定获取某个作用域中的数据

  • ${pageScope.键名} 获取page域对象中的数据
  • ${requestScope.键名} 获取request域对象中的数据
  • ${sessionScope.键名} 获取session域对象中的数据
  • ${applicationScope.键名} 获取application域对象中的数据

获取request对象中的请求数据
${param.键名},可以获取request中携带的请求参数的数据

  1. <%--
  2. EL:表达式主要作用为了代替 xxx.getAttr("");
  3. xxx: pageContext request session application
  4. --%>
  5. 替换小脚本中的内容
  6. ${pageContext.msg}-->pageContext.getAttribute("msg")
  7. ${requestScope.msg}-->request.getAttribute("msg")
  8. ${sessionScope.msg}-->session.getAttribute("msg")
  9. ${applicationScope.msg}-->servletContext.getAttribute("msg")
  10. <%--这样书写没有指定范围 按照 pageContext /request / session /servletContext--%>
  11. <%--${msg}
  12. &lt;%&ndash;EL表达式接受对象&ndash;%&gt;
  13. ${requestScope.fl.id}
  14. //接收request中对象
  15. Object o= request.getAttribute("fl");
  16. Class clazz=o.getClass();
  17. Method m=clazz.getMethod("get"+"Id");
  18. //通过调用指定get方法获得对应值
  19. Object v= m.invoke(o);--%>
  20. <%--可以进行 + - * / % > < !=都可以--%>
  21. <%--EL中的所有+都是算数运算--%>
  22. ${1+2}
  23. ${1+"2"}
  24. ${"2"+"2"}
  25. <%--EL中支持三木运算--%>
  26. ${60>70?"A":"B"}
  27. <%
  28. ArrayList<Integer> list = new ArrayList<>();
  29. list.add(1);
  30. request.setAttribute("li",list);
  31. %>
  32. <%--判断指定内容是否为null/长度是否为0--%>
  33. ${empty requestScope.li}

【六】JSTL
[1.] 简介
1.可以使用JSTL标签来完成一些例如循环、判断等情况的与数据输出。
2.JSTL的作用就是:替换在Jsp中声明的Java逻辑代码。
3.JSTL可以更好的辅助EL。对于遍历结合很方便。
4.JSTL标签库是第三方发明的自定义的标签,每个标签都有自己特定的含义表示一个具体的java逻辑。我们要在JSP中使用JSTL必须使用taglib标签引入第三方的标签库资源。
标签库的内容有:
1. 核心标签库
2. SQL标签库
3. 函数标签库
4. 格式化标签库
5. XML标签库
[2]使用
使用步骤:

  1. 在项目中导入JSTL的jar包
  2. 在jsp页面中通过taglib指令引入jstl标签库
  3. 使用jstl标签完成开发 ```java <%@page import=”com.bjsxt.pojo.Employee”%> <%@page import=”java.sql.Date”%> <%@ page language=”java” import=”java.util.*” pageEncoding=”UTF-8”%> <%@taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix=”fmt” uri=”http://java.sun.com/jsp/jstl/fmt“ %> //prefix=”c”和prefix=”fmt”可以自定义。代表前缀

<% String path = request.getContextPath(); String basePath = request.getScheme()+”://“+request.getServerName()+”:”+request.getServerPort()+path+”/“; %>

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

  1. <title>My JSP 'jstlel.jsp' starting page</title>
  2. <meta http-equiv="pragma" content="no-cache">
  3. <meta http-equiv="cache-control" content="no-cache">
  4. <meta http-equiv="expires" content="0">
  5. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  6. <meta http-equiv="description" content="This is my page">
  7. <!--
  8. <link rel="stylesheet" type="text/css" href="styles.css">
  9. -->

环境的搭建<% //1.准备数据
int n=87;//基本类型 double avgScore = 57.45678;//基本类型 //Student stu = null; Employee emp=new Employee();//引用类型 emp.setEid(1); emp.setEname(“张晓红”); emp.setBirth(Date.valueOf(“1999-12-12”)); String [] strs = {“Java”,”Oracle”,”JSP”,”HTML”};//数组 String courses=”Java,Oracle,JSP,HTML,Servlet”;//特殊的字符串 String courses2=”Java#Oracle#JSP#HTML#Servlet”;//特殊的字符串 List list = new ArrayList();//分配空间 list.add(90); list.add(80); Map map = new HashMap();//Map map.put(“cn”, “China”); map.put(“fr”, “France”); //setAttribute request.setAttribute(“r1”,n); request.setAttribute(“avgScore”,avgScore); request.setAttribute(“emp”,emp); request.setAttribute(“strs”,strs); request.setAttribute(“courses”,courses); request.setAttribute(“courses2”,courses2);
request.setAttribute(“now”,new java.util.Date());
request.setAttribute(“list”, list);
request.setAttribute(“map”, map);
%>

//2.使用JSTL和EL输出 分数:${requestScope.r1} <%—如果分数大于90 A 大于80 B 大于 70 C D—%> A B C D


姓名:${requestScope.emp.ename}
生日:${requestScope.emp.birth}
*生日:
//年月日类型的转换 分数:
* ${s}——-> //数组的遍历
<%—如果字符串使用逗号进行分割 这样字符串才可以遍历—%> ** ${c}——> //字符串分割
<%—delims 按照指定符号进行分割 把分割后每一个值赋值给变量c—%> ${c}——>
*<%—从map集合中取值—%> ${m.key}—>${m.value} //遍历集合并且取值

```

JSP执行过程