今日内容
- JSP概述
- JSP核心
三大指令
九大内置对象
四大作用域
EL表达式
JSTL标签
- 学生项目完善查询、详情、修改、删除
- JSP简介
JSP(全称JavaServer Pages)java服务器页面。 是一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。
JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求,是简化版的Servlet。
执行的过程为 xxx.jsp---->xxx.java---->xxx.class
- 使用策略
1.纯碎的HTML使用
语法和使用HTML的用法完全一样,可以包含css,javaScript,Jquery等
2.纯粹的Servlet使用
以<% java代码片段 %>写法显示在jsp页面,相当于Servlet中的service方法
但是我们需要注意:
jsp 只用来显示数据,不处理业务
Servlet 只处理业务
案例演示:
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.Date" %> <html> <head> <title>Title</title> <style> div{ border:1px solid red; height: 200px; width: 200px; } </style> </head> <body> <!--纯粹的html演示--> <div>div区域块</div> <!--servlet使用演示--> <% Date d = new Date(); System.out.print(d); %> <%=new Date()%> <%=d%> </body> </html> |
通过以上案例可以看出在jsp中的html内容和java代码都生效了,编译之后的文件看下图:
查看jsp文件对应生成的java源文件路径:
- Jsp核心
Jsp的内容包含除了以上的html,css,js,jquery,java代码外,还可以包含三大指令,九大内置对象,四大作用域,EL表达式,JSTL标签库。
- 三大指令
JSP包含三个指令:page(描述页面)、 include(页面包含) 、taglib(表达式引入)
语法:<%@ 指定名称 属性名=”值”,........%>
1、page(描述页面)
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
用来设置JSP页面的基本描述信息,主要属性如下:
language : 定义页面语言 java
contentType:定义页面返回值的类型及语言(服务器返回response)
pageEncoding:定义页面语言(浏览器的)
errorPage:一旦页面发生未知错误 定义一个跳转的页面errorPage="error.jsp"
import: 导java包
2、include(页面包含)
页面包含说的是一个页面可以包含另一个页面的内容,并且能正常加载。
语法:<%@include file=”被包含的页面名称” %>
案例:
top.jsp页面代码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <h2>我是头部页面内容</h2> |
bottom.jsp页面代码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <h2>我是底部页面内容</h2> |
index..jsp页面代码(包含top.jsp和bottom.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <!-- 头部包含外部top.jsp页面 --> <div><%@include file="top.jsp" %></div>
<div> <h3>我是页面主体</h3> </div> <!-- 底部包含外部bottom.jsp页面 --> <div><%@include file="bottom.jsp" %></div> </body> </html> |
index.jsp页面运行效果:
三个文件最后会被翻译成一个java文件,index_jsp.java代码:
include指令的主要作用:可以将页面公共的部分提取出来,让每个页面包含这个公共的页面,一是为了减少代码量,二是易于后续的维护。
3、taglib(表达式引入)
后面使用JSTL标准标签库时使用。
语法:<%@taglib prefix="简称" uri="具体的表达式的连接" %>
- 九大内置对象
内置对象:也称隐式对象,在jsp中,已经初始化好并且给我们封装好了,不需要程序员创建,可以直接使用的对象就是内置对象。
类 对象名 = new 类();
对象名 功能 类型
Out 页面输出对象 JspWriter
Exception 异常处理对象 Throwable
Page(this) 描述页面的对象 Object
PageContext 页面的全局对象【作用域】 PageContext
Request 请求对象【作用域】 HttpServletRequest
Response 响应对象 HttpServletResponse
Session 会话对象【作用域】 HttpSession
Config 配置 ServletConfig
Application 服务器对象【作用域】 ServletContext
这些内置对象在Jsp页面都是存在的,我们可以直接使用;
这里默认能显示的内置对象共8个,还有一个特殊的对象Exception关于异常的,只有在page指令中设置isErrorPage="true"时才会显示。
可以通过以下方式获取:
pageContext.getException() //获取异常对象
1.application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。该对象的类型是SevletContext类型,它的生命周期在tomcat服务器启动时创建,关闭时销毁。其作用范围为整个Web应用。
2.request 对象是 javax.servlet.HttpServletRequest类型的对象。该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。request对象的作用域为一次请求。
3.response 对象是 javax.servlet.HttpServletRsponse类型的对象。该对象代表客户端的响应信息,主要是将JSP容器处理过的对象信息返回到客户端。
4.config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
5.page:当前jsp页面的实例,相当于this关键字。
6.session:会话对象。session 对象是由服务器自动创建与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。其作用范围为一次会话。
7.exception对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。
8.out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。JSP中的out对象是JspWriter类型。
9.pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,可以获取项目的根目录,还可通过getXXX()获取其他内置对象
- 四大作用域
- 作用
为了在页面、请求、和用户之间传递和共享数据,JSP提供了四个不同的作用域:pageContext(页面作用域)、request(请求作用域)、session(会话作用域)、application(应用程序作用域),这些作用域就规定了数据可以传递和共享的范围以及数据的存活时间。
- 作用域详解
1.application 作用域
如果把变量放到application里,就说明它的作用域是application,它的有效范围是整个应用。 整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。 application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。
2.session作用域
session作用域比较容易理解,同一浏览器对服务器进行多次访问,在这多次访问之间传递信息,就是session作用域的体现。如果把变量放到session里,就说明它的作用域是session,它的有效范围是当前会话。所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程可能包含多个请求响应。也就是说,只要用户不关浏览器,服务器就有办法知道这些请求是一个人发起的,整个过程被称为一个会话(session),而放到会话中的变量,就可以在当前会话的所有请求里使用。
session的开始时刻比较容易判断,它从浏览器发出第一个HTTP请求即可认为会话开始。但结束时刻就不好判断了,因为浏览器关闭时并不会通知服务器,所以只能通过如下这种方法判断:如果一定的时间内客户端没有反应,则认为会话结束。Tomcat的默认值为30分钟,是在web.xml文件配置的,但这个值也可以通过HttpSession的setMaxInactiveInterval()方法来设置:
void setMaxInactiveInterval(int interval),这里设置的时间单位是秒
如果想主动让会话结束,例如用户单击“注销”按钮的时候,可以使用 HttpSession 的 invalidate()方法,用于强制结束当前session:void invalidate()
3.request作用域
一个HTTP请求的处理可能需要多个Servlet合作,而这几个Servlet之间可以通过某种方式传递信息,但这个信息在请求结束后就无效了。request里的变量可以跨越forward前后的两页。但是只要刷新页面,它们就重新计算了。如果把变量放到request里,就说明它的作用域是request,它的有效范围是当前请求周期。 所谓请求周期,就是指从http请求发起,到服务器处理结束,返回响应的整个过程。在这个过程中可能使用forward的方式跳转了多个jsp页面,在这些页面里你都可以使用这个变量。
4.pageContext作用域
page对象的作用范围仅限于用户请求的当前页面,对于page对象的引用将在响应返回给客户端之后被释放,或者在请求被转发到其他地方后被释放。page里的变量只要页面跳转了,它们就不见了。如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里。从把变量放到pageContext开始,到jsp页面结束,你都可以使用这个变量。
- 作用域范围案例
- 在本页面(one.jsp)中放四个作用域的值, 分别在本页面取值
<% pageContext.setAttribute("pc", "pageContext"); request.setAttribute("req", "request"); session.setAttribute("ses", "session"); application.setAttribute("app", "application"); %> <p>pc的值:${pc }</p> <p>req的值:${req }</p> <p>ses的值:${ses }</p> <p>app的值:${app }</p> |
页面显示结果:
- 新建一个JSP(two.jsp),在第二个页面取这四个值(不再存值)
<p>pc的值:${pc }</p> <p>req的值:${req }</p> <p>ses的值:${ses }</p> <p>app的值:${app }</p> |
- 通过转发的方式从one.jsp页面跳转到two.jsp页面
<% request.getRequestDispatcher("two.jsp").forward(request, response); %>
页面显示效果:
- 通过重定向的方式从one.jsp页面跳转到two.jsp页面
<% response.sendRedirect("two.jsp"); %>
页面显示效果:
结论:pageContext作用域范围仅限于当前页面,只要换一个页面数据立马消失。而request作用域仅在一次请求范围内,通过请求转发的方式跳转到第二个页面,数据可以共享,而重定向则无法共享。
3、关闭浏览器重新打开,再次访问two.jsp
结论:
session域数据消失的原因,session是浏览器会话对象,作用范围是当前的浏览器,一旦浏览器关闭这个会话对象就无法找到,暂时当消失处理 ,所以数据也无法获取到。
4、关闭服务器,重新启动,再次直接访问two.jsp
结论:application域的数据在没有关闭服务器之前一直没有消失,是因为这个是服务器作用域,而当服务器关闭后又重启后,值消失,说明application域只要存了值,一直到服务器停止才消失。
- EL表达式
1、简介
EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。
2、作用
是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据)通过以下方式:
在JSP页面的任何静态部分均可通过:${expression}来获取到指定表达式的值
包含以下几种方式:
${绑定名} 获取javaBean对象或者其他类型数据
${绑定名.属性名} 获取javaBean中对应的属性名
${绑定名[索引值]} 获取集合或者数组中对应的值
${绑定名["key"]} 通过key的值获取在Map中对应的value值
同样也可以在el表达式内部做一些简单的运算:
代码示例
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>el基本运算</title> </head> <body> <!--基本运算--> 加法运算:${3+2} <br> 减法运算:${3-2} <br> 乘法运算:${3*2} <br> 除法运算:${3/2} <br> 取余运算:${3%2} <br> <!--逻辑运算--> 与:${5>4 && 7>8} <br> 或:${5>4 || 7>8} <br> 非:${! 5>4 } <br> 非:${not (5>4) } <br> <!--三元运算--> 三元运算:${5>4?"呵呵":"哈哈"} <!-- 空运算符 判断是否为空,如果为空则为true,否则为false--> ${empty uname} </body> </html> |
演示效果:
3、原理
依次从四大作用域对象检索对应的绑定名,如果在某一个对象中获取到了,则不再去其他对象检索,否则继续检索,如果都没有查找到则返回的是一个空字符串,而不是null
例如如下操作时:以表达式${user.name}为例
EL表达式会根据name去User类里寻找这个name的get方法,此时会自动把name首字母大写并加上get前缀,一旦找到与之匹配的方法,El表达式就会认为这就是要访问的属性,并返回属性的值。
所以,想要通过EL表达式获取对象属性的值,那么这个属性就必须有与之对应的get方法。
可以通过指定检索四大作用域对象来提升检索速度,如下:
application-->applicationScope
session-->sessionScope
request-->requestScope
pageContext-->pageScope
比如:
${requestScope.user} 表示直接去request对象中获取user绑定名对应的值
4、案例
分别获取javaBean,javaBean属性,Map值,List,数组类型的值
代码示例:
ElDemoServlet package com.ujiuye.servlet; import com.ujiuye.bean.User; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; 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.HashMap; import java.util.List; import java.util.Map; @WebServlet("/elDemo") public class ElDemoServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决乱码问题的两行代码 req.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); //开始绑定数据 //1.绑定一个字符串数据 req.setAttribute("uname","邓紫棋"); //2.绑定一个Map对象数据 Map<String,String> map = new HashMap<>(); map.put("name","张飒"); req.setAttribute("map",map); //3.绑定一个List集合数据 List<String> list = new ArrayList<>(); list.add("三国演义"); list.add("红楼梦"); req.setAttribute("list",list); //4.绑定一个数组对象 int[] arr ={12,89,10}; req.setAttribute("arr",arr); //5.绑定一个javaBean对象 User u = new User("李思思","666666"); req.setAttribute("user",u); //转发 req.getRequestDispatcher("06-el表达式常用方式.jsp").forward(req,resp); } } |
页面06-el表达式常用方式.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>el表达式常用方式</title> </head> <body> el获取字符串数据:${uname} <br> el获取Map对象中name对应的value值:${map["name"]} <br> el获取List集合中第二个数组:${list[1]} <br> el获取数组的第一个数据:${arr[0]} <br> el获取javaBeand的username属性值:${user.username} </body> </html> |
- JSTL标签库
1.JSTL简介
JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库。它主要提供给JavaWeb开发人员一个标准通用的标签,开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
JSTL的使用步骤:
1、导包:standard.jar jstl.jar
2、标签的引用:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
prefix:前缀,指的是为当前的这个标签起一个别名;
uri:标签的路径;
3、使用
注意:JSTL不能独立使用,需要结合EL表达式。
2.JSTL之核心标签
1、通用标签:
set标签:声明标签
<c:set var="name" value="张三"></c:set>
out标签:输出标签
<c:set var="score1" value="80"></c:set>
<c:set var="score2" value="90"></c:set>
<c:out value="${score1+score2 }"></c:out>
2、分支标签
(1)if单分支判断
<c:set var="score" value="70"></c:set>
<c:if test="${score>=60 }">及格</c:if>
(2)choose多分支判断
<c:set var="score" value="70"></c:set>
<c:choose>
<c:when test="${score>=90 }">优秀</c:when>
<c:when test="${score>=80 }">良好</c:when>
<c:when test="${score>=70 }">中等</c:when>
<c:when test="${score>=60 }">及格</c:when>
<c:otherwise>不及格</c:otherwise>
</c:choose>
3、循环标签forEach
|
- 完善学生系统功能
- 查询
- dao
- serivce
- servlet
分析:由于考虑到一个servlet需要处理多种业务,所以将每种业务操作封装成一个功能方法,在请求这个servlet时,根据请求url中传递的方法名,通过反射机制来确定我们要执行的方法是哪个类的哪个方法。
创建BaseServlet实现service方法
package com.ujiuye.servlet; |
让StudentServlet继承BaseServlet,在StudentServlet中只需要写业务方法即可,不需要重写service方法,当请求StudentServlet时,必须在请求的url地址中传入要执行的方法名。
例如:我们在登录验证成功时,需要跳转到列表页做显示,这里在进入index.jsp页面前必须先请求StudentServlet做查询,所以登录判断成功后,跳转路径需要这样写:
package com.ujiuye.servlet; |
- index.jsp页面:使用jstl+el显示数据,首先将jstl的jar包以及jsp-api.jar包导入到项目中
在index.jsp页面开头引入链接库:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
再使用forEach循环显示数据:
完整代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> |
效果图:
- 详情查询
- dao
- service
- servlet
- 页面:details.jsp
<%-- |
效果图:
- 修改
- 信息回显:底层同根据学号查询,在servlet中创建一个回显方法
效果
- 修改操作
dao:
service:
servlet:
页面:updatestudent.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
- 删除