jsp介绍

JSP(全称 Java Server Pages)Java 服务端页面技术 ,它允许使用特定标签在HTML网页中插入Java代码

为什么需要jsp

Servlet输出HTML⾮常困难,JSP就是替代Servlet输出 HTML的

创建jsp项目

1、create project->web Application
2、Project Settings->Libraries-> + 导入servlet-api.jar包

JSP使用

JSP三种原始标签

<%! %>声明标签:定义成员变量与方法
<% %>脚本标签:编写业务逻辑
<%= %>赋值标签:做内容输出。注:赋值时不需要在代码中添加“;”
注:标签之间不能嵌套

JSP原始标签使用案例

  1. //需求:以 20%概率显示你中奖了。
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <%
  8. int flag = new Random().nextInt(100);
  9. if(flag<=20){
  10. %>
  11. 恭喜你,中奖了!
  12. <%= flag%>
  13. <%}else {%>
  14. 谢谢惠顾!
  15. <%}%>
  16. </body>
  17. </html>

JSP指令标签

  1. //作用:声明JSP页面的一些属性和动作
  2. <%@指令名称 属性="值" 属性="值"%>
  3. //JSP指令标签分类
  4. -page:主要声明 JSP 页面的一些属性
  5. -contentType:设置相应类型和编码
  6. -pageEncoding:设置页面的编码
  7. -session:设置jsp页面是否获取session内置对象
  8. -include:静态包含
  9. -可以将其他页面内容包含进来,一起进行编译运行.生成一个 java 文件.
  10. -<%@include file="被包含 JSP 的相对路径" %>
  11. -taglib:导入标签库
  12. -<%@taglib prefix="前缀名" uri="名称空间" %>

JSP内置对象(面试会问)

  1. 1request 对象是 HttpServletRequest 类型的对象。
  2. 2response 对象是 HttpServletResponse 类型的对象。
  3. 3session 对象是 HttpSession 类型的对象。只有在包含 session=“true 的页面中才可以被使用。
  4. 4application 对象是 ServletContext 类型的对象
  5. 5out 对象是 JspWriter 类型的对象。
  6. 6config 对象是 ServletConfig 类型的对象。
  7. 7pageContext 对象是 PageContext 类型的对象。作用是取得任何范围的参数,通过它可以获取 JSP 页面的 outrequestreponsesessionapplication 等对象。pageContext对象的创建和初始化都是由容器来完成的,在 JSP 页面中可以直接使用 pageContext 对象。
  8. 8page 对象代表 JSP 本身。
  9. 9exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中
  10. 才可以被使用

请求转发

  1. //请求转发:服务端的一种请求方式,在服务端中直接请求某个资源
  2. request.getRequestDispatcher("/test.jsp").forword(request,response);
  3. //英文翻译
  4. -dispatcher:调度器,分配器,
  5. -forword:向前

image.png

请求转发和重定向区别


请求转发 重定向
又称 服务端跳转 客户端跳转
请求和响应次数 对于客户端而言,在一次请求和响应中完成(直接在服务端中资源访问 两次请求和响应中完成
服务端给客户端产生响应,在响应当中添加头中添加了一个location的key,location后面给定的是个地址;客户端根据这个头信息再次发送url请求,然后响应回来)
是否改变客户端浏览器地址栏中的内容 不改变 改变
是否使用request对象传递数据 通过forward(request,response)传递 不使用request对象传递数据
对于DML操作(添加,修改等)
(核心问题:客户端浏览器地址栏不会改变,刷新就会导致表单重复提交)
(对于查询操作)使用请求转发,查询涉及数据传递问题 (对于DML操作)使用重定向方式客户端浏览器产生响应

请求转发案例

servlet代码

  1. /**
  2. * 需求:在 Servlet 中获取客户端浏览器所支持的语言,并通过 JSP 页面将客户端浏览器
  3. * 所支持的语言响应给客户端浏览器。
  4. */
  5. @WebServlet("/language.do")
  6. public class LanguageServlet extends HttpServlet {
  7. @Override
  8. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  9. this.doPost(req,resp);
  10. }
  11. @Override
  12. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13. //获取请求头
  14. String header = req.getHeader("Accept-Language");
  15. //设置属性 以 传给对应的jsp
  16. req.setAttribute("key",header);
  17. //请求转发(在服务端将资源从servlet发送到jsp中)
  18. req.getRequestDispatcher("/showmsg.jsp").forward(req,resp);
  19. }
  20. }

jsp代码

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <%
  8. String key = (String)request.getAttribute("key");
  9. %>
  10. 支持的语言为:<%= key%>
  11. </body>
  12. </html>

jsp四大作用域对象

作用域:”数据的共享范围”,也就是数据在多大范围有效

对象名称 作用范围
application 整个应用都有效
session 当前会话有效
request 当前请求有效(存放业务数据)
page 当前页面有效

JSTL标签库

JSTL(Java server pages standarded tag library,即 JSP 标准标签库),这些标签封装了不同的功能。 JSTL 的目标是 使 JSP 页面的可读性更强、简化 JSP 页面的设计、实现了代码复用、提高效率

JSTL分类

  1. 在使用 JSTL 标签库时需要在 JSP 中添加对应的 taglib 指令标签。
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

核心标签( 最常用、最重要,也是最基本的标签 )

image.png

格式化标签

SQL标签

XML标签

JSTL函数

JSTL标签库使用步骤

  1. //1、添加 jstl.jar 与 standard.jar。
  2. 选中项目->Project Structure->Libraries->"+",选择java导入jar包->Apply->(重要)Artifacts栏右侧Available Elements下面右键put into
  3. //2、在 Idea 中添加 JSTL 标签的约束文件(DTD)。
  4. File->Settings...->Languages&Frameworks->Schemas and DTDs->"+",URI:http://java.sun.com/jsp/jstl/core,File:D:\Java\sxt课件\jsp\软件\jakarta-taglibs-standard-1.1.2\tld\c.tld
  5. //3、在 JSP 页面中添加 taglib 指令标签。
  6. 选中web目录,新建jsp文件->添加指令标签<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

JSTL核心标签使用

  1. //1、-<c:if>
  2. -标签判断表达式的值,如果表达式的值为 true 则执行其主体内容,(注意)当双引号内容为表达式时需使用*EL表达式*
  3. -eg:
  4. <c:if test="${1==1}">
  5. 执行了
  6. </c:if>
  7. //2、-<c:choose>, <c:when>, <c:otherwise>
  8. -<c:choose>标签与 Java switch 语句的功能一样,用于在众多选项中做出选择。
  9. -switch case defaul对应<c:choose> <c:when> <c:otherwise>
  10. -eg:
  11. <c:choose>
  12. <c:when test="${2==1}">
  13. when1执行了
  14. </c:when>
  15. <c:when test="${1==3}">
  16. when2执行了
  17. </c:when>
  18. <c:otherwise>
  19. otherwise执行了
  20. </c:otherwise>
  21. </c:choose>
  22. //3、-<c:forEach>
  23. -迭代器,用于迭代集合
  24. -需求:
  25. 创建 Users 对象,含有 useridusername 属性。
  26. 创建一个 Servlet,在 Servlet 中创建多个 Users 对象并放到 Map 集合中,在 showUsers2.jsp
  27. 的页面中显示所有的 Users 对象的信
  28. -eg:
  29. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  30. <html>
  31. <head>
  32. <title>Title</title>
  33. </head>
  34. <body>
  35. <table border="1" align="center">
  36. <tr>
  37. <th>map_key</th>
  38. <th>用户ID</th>
  39. <th>用户名</th>
  40. </tr>
  41. <c:forEach items="${requestScope.key}" var="map">
  42. <tr>
  43. <td>${map.key}</td>
  44. <td>${map.value.userid}</td>
  45. <td>${map.value.username}</td>
  46. </tr>
  47. </c:forEach>
  48. </table>
  49. </body>
  50. </html>

JSTL 格式化标签的使用

  1. <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
  2. //对日期的格式化处理
  3. <fmt:formatDate value="${requestScope.data}" pattern="yyyy-MM-dd"/>
  4. //对数字格的式化处理
  5. <fmt:formatNumber value="${requestScope.num}" type="currency"/>