【一】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字节码文件,处理请求
具体运行过程:
- 浏览器发起请求访问jsp
- Tomcat服务器接收到请求后调用对应的Servlet处理请求,调用JspServlet
- JspServlet将请求的jsp文件转换成对应的Java文件并完成编译
- 将编译后的class文件加载到内存并执行,其实就是运行一个Servlet
- 最后得到结果数据响应浏览器
当我们第一次请求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原理图
【二】JSP中的常用指令标签
[1.]JSP页面包含的元素
A.HTML
B.注释[java注释 HTML注释 JSP注释]
C.Java代码[小脚本 声明式 表达式]
D.jsp:xxx:动作标识—-》大部分已经不用了。但是记住
E.%@xxx:指令标识—-》3种
<%@include:把一个网页引入当前页面
<%@page:可以指定当前jsp页面配置信息 例如:当前网页解析编码 导入包 xxx
<%@taglib:JSTL中使用的
[2]
A.静态包含就是把代码复制到当前网页中 动态包含相当于方法调用
B.静态包含不会产生.java和.class 动态包含会产生.java和.class
C.静态包含发生在jsp与运行的第一个阶段 动态包含发生在jsp运行的第三个阶段
[3]常见page指令标签
contenType :指定当前JSP页面的MIME类型和字符编码
errorPage:指定当JSP页面发生异常时需要转向的错误处理页面
errorPage:指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage:指定当前页面是否可以作为另一个JSP页面的错误处理页
extends:指定servlet从哪一个类继承
import:导入要使用的Java类
【三】JSP内置对象
[1]九大内置对象
[2]Servlet与JSP的联系和区别
联系:
- JSP和Servlet都是Sun公司推出的动态网页技术
- 基于Servlet开发页面的繁琐性,推出JSP来简化页面开发
- JSP本质上是一个Servlet,会翻译成一个Servlet
区别:
- JSP使人们把显示和逻辑分隔成为可能,这意味着两者的开发可并行进行;而Servlet并没有把两者分开。
- JSP是在HTML代码里写JAVA代码,框架是HTML;而Servlet是在JAVA代码中写HTML代码,本身是个JAVA类。
- Servlet需要在web.xml中配置,而JSP无需配置。
- 目前JSP主要用在视图层负责显示,而Servlet主要用在控制层负责调度
强调
JSP表面上是一个HTML,本质上是一个Servlet。
[3]JSP的使用总结
- 创建Jsp文件,在项目的web目录下创建。
- 使用page指令设置Jsp的转译细节(一般自动生成的就够用)
- 使用tablib指令引入第三方的自定义标签来使用(JSTL标签)
- 使用HTML,CSS,JQuery完成页面的开发
- 使用<%%>声明java脚本片段完成数据的动态拼接
- 获取request或者session中的数据拼接到当前页面中(内置对象)
【四】MVC模式
[1]mvc:
m:model模型层
v:view视图层
c:controller控制层
[2]Dao模式和mvc模式:
[3]mvc各层分析
[4]JavaBean
符合特定规范的Java类,是一种可重用的组件。
特定规范
public class,提供无参数构造方法。
属性private
提供public的setter和getter方法。
功能分类
封装数据:数据Bean 实体类。
封装业务: 业务Bean service Mapper。
【五】EL
[1.]特点
- 可以获取作用域对象中的数据
- 底层使用的是反射,在使用的时候可以通过键名即可获取对应的值
- 简化了在jsp页面中使用<%%>获取域对象数据的方式
[2.]使用
基本语法
- ${键名},键名是域对象中存储的数据的键
- ${键名.属性名.属性名…},可以获取域对象中级联属性的值
- ${键名[角标]},获取域对象中存储的list集合或者数组中指定角标的数据
- 注意:${}不仅可获取域对象中的数据,而且会将该数据打印到浏览器中。如果获取不到数据,也不会报错,只是不显示而已。
作用域数据查找顺序
使用EL表达式获取域数据的时候,如果没有指明作用域,那会按照作用域由小到大的顺序去找,直到找到为止: pageContext —-> request —-> session —-> application
EL的四个范围和JSP的四个范围对应,分别为pageContextScope、requestScope、sessionScope,applicationScope
指定获取某个作用域中的数据
- ${pageScope.键名} 获取page域对象中的数据
- ${requestScope.键名} 获取request域对象中的数据
- ${sessionScope.键名} 获取session域对象中的数据
- ${applicationScope.键名} 获取application域对象中的数据
获取request对象中的请求数据
${param.键名},可以获取request中携带的请求参数的数据
<%--
EL:表达式主要作用为了代替 xxx.getAttr("");
xxx: pageContext request session application
--%>
替换小脚本中的内容
${pageContext.msg}-->pageContext.getAttribute("msg")
${requestScope.msg}-->request.getAttribute("msg")
${sessionScope.msg}-->session.getAttribute("msg")
${applicationScope.msg}-->servletContext.getAttribute("msg")
<%--这样书写没有指定范围 按照 pageContext /request / session /servletContext--%>
<%--${msg}
<%–EL表达式接受对象–%>
${requestScope.fl.id}
//接收request中对象
Object o= request.getAttribute("fl");
Class clazz=o.getClass();
Method m=clazz.getMethod("get"+"Id");
//通过调用指定get方法获得对应值
Object v= m.invoke(o);--%>
<%--可以进行 + - * / % > < !=都可以--%>
<%--EL中的所有+都是算数运算--%>
${1+2}
${1+"2"}
${"2"+"2"}
<%--EL中支持三木运算--%>
${60>70?"A":"B"}
<%
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
request.setAttribute("li",list);
%>
<%--判断指定内容是否为null/长度是否为0--%>
${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]使用
使用步骤:
- 在项目中导入JSTL的jar包
- 在jsp页面中通过taglib指令引入jstl标签库
- 使用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”>
<title>My JSP 'jstlel.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
环境的搭建<%
//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
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—%>
姓名:${requestScope.emp.ename}
生日:${requestScope.emp.birth}
*生日:
//年月日类型的转换 分数:
*
<%—如果字符串使用逗号进行分割 这样字符串才可以遍历—%> **
<%—delims 按照指定符号进行分割 把分割后每一个值赋值给变量c—%>
*<%—从map集合中取值—%>