jsp原理及常见使用

jsp原理及使用

  • jsp是什么?与servlet有什么关系?
  • 一、jsp源码刨析
    • (1)jsp原理。
    • (2)index_jsp页面解读
    • (3)jsp页面工作的流程图
  • 二、jsp基础语法和指令
    • (1)jsp相关的依赖:
    • (2)jsp表达式
    • (3)jsp语法
      • 1.定制错误页面
      • 2.提取公共页面:
  • 三、jsp内置对象和作用域
    • (1)九大内置对象
    • (2)四个内置对象的作用域
      • 使用el表达式和jsp表达式取值的区别。
    • (3)四个作用域的应用
  • 四、jsp、jstl标签、el表达式
    • (1)jsp标签
    • (2)el表达式
    • (3)JSTL表达式
      • 1. jstl标签的引入
      • 2.jstl标签的使用步骤
      • 3. jstl常用标签的使用
        • 3.1 if标签
        • 3.2 choose,when
        • 3.3 for-each
      • (4)jstl解析错误
  • 五、补充
    • 1. WEB-INF文件夹
    • 2.main文件夹
    • 3.双亲委派机制


jsp是什么?与servlet有什么关系?

Java Servler pages: java服务器端页面,和servlet一样,用于动态web技术。
最大的特点:

  • 写jsp就像写html。
  • 区别:
    • html只给用户提高静态的数据。
    • jsp页面可以嵌入java代码,为用户提高动态的数据。

一、jsp源码刨析

(1)jsp原理。

jsp是怎么执行的?

服务器的内部工作:

  • 在tomcat中有一个work目录
  • 每次IDEA使用tomcat,就会在tomcat中重新生成一个work目录,最终发现jsp页面转换成了java页面。

jsp原理及常见使用_第1张图片
jsp原理及常见使用_第2张图片

jsp原理及常见使用_第3张图片
jsp原理及常见使用_第4张图片
jsp原理及常见使用_第5张图片
通过观察源码,发现Jsp页面本质上还是Servlet

浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet。

(2)index_jsp页面解读

jsp原理及常见使用_第6张图片
html页面的内存在底层是用java代码去渲染的。
jsp本质上就是java中:

response.setContentType("text/html;charset=UTF-8");

jsp原理及常见使用_第7张图片
jsp原理及常见使用_第8张图片
jsp原理及常见使用_第9张图片
jsp原理及常见使用_第10张图片
jsp原理及常见使用_第11张图片
jsp原理及常见使用_第12张图片
jsp原理及常见使用_第13张图片

<%%>会直接就是java代码。
<%= %>会print到页面上。

jsp原理及常见使用_第14张图片

(3)jsp页面工作的流程图

jsp原理及常见使用_第15张图片
客户端向服务器请求jsp资源,服务器会在work工作目录中生成jsp对应的java文件,将jsp页面转化为java页面,再编译成class文件,返回给客户端。

二、jsp基础语法和指令

(1)jsp相关的依赖:

jsp原理及常见使用_第16张图片

   <dependencies>

       <dependency>
           <groupId>javax.servletgroupId>
           <artifactId>servlet-apiartifactId>
           <version>2.5version>
       dependency>

       <dependency>
           <groupId>javax.servlet.jspgroupId>
           <artifactId>jsp-apiartifactId>
           <version>2.0version>
       dependency>

       <dependency>
           <groupId>javax.servlet.jsp.jstlgroupId>
           <artifactId>jstl-apiartifactId>
           <version>1.2version>
       dependency>

       <dependency>
           <groupId>taglibsgroupId>
           <artifactId>standardartifactId>
           <version>1.1.2version>
       dependency>
   dependencies>

(2)jsp表达式

  • 1.jsp表达式:
    • <%=变量或表达式%>
    • 作用:输出变量或表达式的值。
  • 2.jsp脚本片段:
    • <% %>
    • 作用:嵌入java代码。
  • 3.在java代码中嵌入html元素
  • 4.一些全局变量或者方法外部的其他方法:
    • <%! %>
  • 5.jsp和html的注释。
    jsp原理及常见使用_第17张图片
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>$Title$</title>
</head>
<body>
<hr>
<%--1.JSP表达式
作用:用来将程序的输出,输出到客户端
<%= 变量或表达式%>
--%>
<%= new java.util.Date()%>
<%--2.jsp脚本片段--%>
<%
    int sum = 0;
    for (int i = 0; i < 100; i++) {
        sum += i;
    }
  out.print("

Sum="+sum+"

"
); %> <%--上一个代码片段中定义的变量,下面的代码片段仍然可以使用。--%> <% int x=10; out.println(x); %> <p>这是一个jsp文档</p> <% out.println(x); %> <hr> <%--3.在代码嵌入html元素--%> <% for (int i=0;i<5;i++){ %> <h1>在代码嵌入html元素<%=i%></h1> <% }%> <hr> <%--4.还可以写一些全局变量或者方法外部的其他方法。(JSP声明)--%> <%! static { System.out.println("导入Servlet"); } private int globalVar = 0; public void kuang(){ System.out.println("进入了方法kuang"); } %> <!--5. HTML的注释--> <%--JSP的注释--%> </body> </html>

jsp原理及常见使用_第18张图片
查看网页源代码后发现,html的注释依旧可以被查看,但jsp的注释没有了。
这样就可以把一些重要的信息放入jsp的注释中。安全性就高了。

(3)jsp语法

1.定制错误页面

1.<%@ page errorPage=“error/500.jsp” %>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--定制错误页面--%>
<%--<%@ page errorPage="error/500.jsp" %>--%>
<%--导包--%>
<%@ page import="java.util.Date" %>
<html>
<head>
    <title>jsp2</title>
</head>
<body>
<%
int x=1/0;
%>
<%=new Date()%>
</body>
</html>

jsp原理及常见使用_第19张图片
2.通过配置文件web.xml
jsp原理及常见使用_第20张图片
在这里插入图片描述

2.提取公共页面:

@include: 会将两个页面 合二为一 
jsp:include: 拼接页面,本质还是三个。

比如点击头部的标签,下面的页面发送变化,但上面的头部信息都没有发生改变。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--@include: 会将两个页面 合二为一  --%>
<%@ include file="common/header.jsp" %>
<h1>我是网页主体</h1>
<%@ include file="common/footer.jsp"%>
<hr>
<%--jsp标签
jsp:include: 拼接页面,本质还是三个。
--%>
<jsp:include page="common/header.jsp"/>
<h1>我是网页主体</h1>
<jsp:include page="common/footer.jsp"/>

</body>
</html>

公共的页面一般会取一个文件夹,如common。
jsp原理及常见使用_第21张图片
这两个页面不是完整的,但是可以嵌入到别的页面。

jsp原理及常见使用_第22张图片
jsp原理及常见使用_第23张图片

使用jsp:include更加的灵活。

三、jsp内置对象和作用域

(1)九大内置对象

jsp原理及常见使用_第24张图片
除了这四个,其他都不经常用。

    pageContext.setAttribute("name1", "张三1号");
    request.setAttribute("name2", "张三2号");
    session.setAttribute("name3", "张三3号");
    application.setAttribute("name4", "张三4号");

jsp原理及常见使用_第25张图片
pageContext的几个对象就对应下面几个对象,这些对象之间可以相互转换。

(2)四个内置对象的作用域

作用域从小到大:page->request->session->application

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--内置对象--%>
<%
    pageContext.setAttribute("name1", "张三1号");
    request.setAttribute("name2", "张三2号");
    session.setAttribute("name3", "张三3号");
    application.setAttribute("name4", "张三4号");
%>
<%--
脚本片段中的代码,会被原封不动的生成到jsp.java中
要求:这里面的代码,必须保证java语法的正确性。
--%>
<%--从pageContext中取出,通过寻找的方式来
从底层到高层(作用域):
--%>
<%
    String name1 = (String) pageContext.findAttribute("name1");
    String name2 = (String) pageContext.findAttribute("name2");
    String name3 = (String) pageContext.findAttribute("name3");
    String name4 = (String) pageContext.findAttribute("name4");
    String name5 = (String) pageContext.findAttribute("name5");//不存在
    String name6 = (String) pageContext.getAttribute("name6");//不存在
%>
<%--使用el表达式输出  ${}--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
<h3>${name6}</h3>
</body>
</html>

jsp原理及常见使用_第26张图片
发现5和6没有取出来。

使用el表达式和jsp表达式取值的区别。

jsp原理及常见使用_第27张图片

jsp原理及常见使用_第28张图片
这种是网站中不希望看到的,所以一般取值都用el表达式。
5和6没有拿到,因为5和6本来就不存在。
在另一个页面中去取:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>02</title>
</head>
<body>
<%
    String name1 = (String) pageContext.findAttribute("name1");
    String name2 = (String) pageContext.findAttribute("name2");
    String name3 = (String) pageContext.findAttribute("name3");
    String name4 = (String) pageContext.findAttribute("name4");
    String name5 = (String) pageContext.findAttribute("name5");//不存在
    String name6 = (String) pageContext.getAttribute("name6");//不存在
%>
<%--使用el表达式输出  ${}--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
<h3>${name6}</h3>
<h3><%=name5%></h3>
</body>
</html>

jsp原理及常见使用_第29张图片
发现1和2没有取到。

(3)四个作用域的应用

jsp原理及常见使用_第30张图片每个用户在各自的session中存的东西在这三个请求中随便拿。
如果3个用户都要取东西,由于session是为一个用户服务的,放在session里面肯定不行。
统计在线人数也需要在最外层application去拿。
jsp原理及常见使用_第31张图片

四、jsp、jstl标签、el表达式

(1)jsp标签

使用jsp跳转到一个新的页面
使用jsp标签进行转发

<jsp:forward page="jsptag2.jsp"></jsp:forward>

转发的同时还可以设置参数:

<jsp:forward page="jsptag2.jsp">
    <jsp:param name="name" value="zhangsan"/>
    <jsp:param name="age" value="13"/>
</jsp:forward>

获取参数:

<%--取出参数--%>
姓名:<%=request.getParameter("name")%>
年龄:<%=request.getParameter("age")%>

jsp原理及常见使用_第32张图片
相当于是这种设置参数的方式:
在这里插入图片描述

(2)el表达式

EL表达式:${}

  • 获取数据
  • 执行运算
  • 获取web开发的常用对象

(3)JSTL表达式

JSTL标签库的使用就是为了弥补HTML标签的不足;它有很多自定义标签,功能和java代码一样。
jstl标签能做到的事情java也可以做出来,jstl标签只是为了让代码变得更整齐。

1. jstl标签的引入

jsp原理及常见使用_第33张图片
如果要用jstl,需要导入一个对应的语法。
jsp原理及常见使用_第34张图片

核心标签库:<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %> ,c就是core
格式化标签库:<%@ taglib prefix=“fmt”
uri=“http://java.sun.com/jsp/jstl/fmt” %>
SQL标签库:<%@ taglib prefix=“sql”
uri=“http://java.sun.com/jsp/jstl/sql” %>
XML标签库: <%@ taglib prefix=“x”
uri=“http://java.sun.com/jsp/jstl/xml” %>,x就是xml

一般只有核心用,其他的几乎不用。
jsp原理及常见使用_第35张图片

2.jstl标签的使用步骤

  • 引入jstl和standard的jar文件
  • 引入jstl对应标签库的语法
  • 使用其中的方法

3. jstl常用标签的使用

3.1 if标签
  • if判断语句:
  • 输出语句:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入jstl标签库,并在idea及tomcat中导入对应的jar包,才能使用jstl标签--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h4>if测试</h4>
<hr>
<form action="coreif.jsp" method="get">
    <%--    使用el表达式获取表单中提交的数据
    ${param.参数名}
    --%>
    <input type="text" name="username" value="${param.username}">
    <input type="submit" value="登录">
</form>
<%--如果提交的用户是管理员,则登录成功--%>
<%--使用jsp标签:--%>
<%--<%--%>
<%--    if (request.getParameter("username").equals("admin")){--%>
<%--        out.print("登录成功");--%>
<%--    }--%>
<%--%>--%>
<%--使用jstl标签:--%>
<c:if test="${param.username.equals('admin')}" var="isAdmin">
    <c:out value="登录成功"/>
</c:if>
<c:out value="${isAdmin}"/>
</body>
</html>

jsp原理及常见使用_第36张图片

3.2 choose,when
  • 定义一个变量:
  • 类似switch的语句:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--定义一个变量score,值为85--%>
<c:set var="score" value="85"/>

<c:choose>
    <c:when test="${score>=90}">
        你的成绩为优秀
    </c:when>
    <c:when test="${score>=80}">
        你的成绩为良好
    </c:when>
    <c:when test="${score>=60}">
        你的成绩为一般
    </c:when>
    <c:when test="${score<60}">
        你还需要努力
    </c:when>
</c:choose>
</body>
</html>

判断的时候,先写的就优先级高。

3.3 for-each

使用for-each遍历

<%
    ArrayList<String> people =new ArrayList<>();
    people.add(0,"张三");
    people.add(1,"李四");
    people.add(2,"王五");
    people.add(3,"赵六");
    people.add(4,"苏酥");
    request.setAttribute("list",people);
//    var:每一次遍历出的对象
// 	  items:要遍历的对象
%>

<%--
//类似于for(People p:list){}
--%>
<c:forEach var="p" items="${list}">
    <c:out value="${p}"/>
</c:forEach>

<%--
//类似于for(int i=0;i<=n;i++){}
--%>
<c:forEach var="p" items="${list}" begin="0" end="2" step="2">
    <c:out value="${p}"/>
</c:forEach>

(4)jstl解析错误

jsp原理及常见使用_第37张图片

不然会运行失败:
jsp原理及常见使用_第38张图片
在tomcat中如果没有jstl相关的包,就需要手动导入,因为运行是依赖于tomcat服务器的。所以把jstl和standard的包也弄进tomcat中。

jsp原理及常见使用_第39张图片
这样就可以正常运行jstl标签了。

五、补充

1. WEB-INF文件夹

WEB-INF里面也不建议去放东西。从客户端无法直接访问WEB-INF文件夹下面的所有东西。
因为WEB-INF文件夹下面的东西对用户不可见。一般一些机密或者重要的文件才放到该文件夹下面。
jsp原理及常见使用_第40张图片

2.main文件夹

jsp原理及常见使用_第41张图片
正常的main中就这两个文件夹。不要再建其他文件夹了。
Resource中的文件是给java去读的。
整个web里面的资源都放在web文件夹里面。

3.双亲委派机制

jsp原理及常见使用_第42张图片
启动类加载器就是根加载器。
如果在根的加载包中没有找到,就会去ext文件夹下去找。
这个过程就叫双亲委派
即一直向上委托父加载器,直至根加载器。
jsp原理及常见使用_第43张图片
jsp原理及常见使用_第44张图片

你可能感兴趣的:(javaWeb,java,web)