JSP语法

JSP语法

编译器指令

  • page:用来设置转译成servlet文件时的参数
    • contentType:表示览器解析响应信息的时候使用的编码和解析格式
    • language:表示JSP要转译成的文件类型
    • import:导入需要的jar包
    • pageEncoding:设置页面的编码格式 可以与contentType只选择一个使用,两个同时使用必须保持一致
    • session:用来控制Servlet中是否有session对象
    • errorPage:当页面发生逻辑错误的时候跳转的页面
    • extends:需要转译的servlet类要继承的父类(包名+类名)
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/3/10
  Time: 19:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" pageEncoding="utf-8" %>
<%@ page session="true" %>
<%@ page errorPage="error.jsp" %>
<html>
<head>
    <title>page</title>
</head>
<body>
    <h1>this is a page</h1>
</body>
</html>

代码块

  • 局部代码块
    • 可以将java代码跟页面展示的标签写到一个jsp页面中,在java代码转译成的servlet文件中,java代码跟输出是保存在service方法中的
    • 缺点:
      • 代码可读性差
      • 开发比较麻烦
      • 所以一般不使用局部代码块
  • 全局代码块
    • 定义公共的方法的时候需要使用全局代码块使用<%!%> 生成的代码在servlet类中
    • 调用的时候,需要使用局部局部代码块
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/3/10
  Time: 19:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>page</title>
</head>
<body>
<h1>this is a page</h1>
<%--  下面是使用局部代码块实现逻辑判断,并按照条件将内容反馈给客户端  --%>
<%
    int i = new Random().nextInt(10);
    if(i>5){
%>
<b>i大于5,则在页面能看到这句话</b>
<%}%>

<%--  使用全局代码块定义一个test方法  --%>
<%!
    public void test(){
        System.out.println("这是一段全局代码块");
    }
%>
<%--全局代码块需要使用局部代码块调用--%>
<%test();%>
</body>
</html>

脚本语法

  • 脚本调用方法:
    • 使用<%=直接调用变量和方法(方法必须有返回值)%>
    • 注意:不能在变量或者方法名后面加;(分号)
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/3/10
  Time: 19:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>page</title>
</head>
<body>
<h1>this is a page</h1>
<%--脚本调用方法 使用全局代码块定义一个属性与一个方法 --%>
<%! String str = "这是一个String"; %>
<%! public String demo(){
    return "这是一个简单的方法";
}%>
<%--使用脚本调用属性与方法--%>
<%=str%>
<%=demo()%>
</body>
</html>

页面导入

  • 静态导入:
    • <%@ include file="staticImport.jsp"%>
    • file中填写的是jsp文件的相对路径使用静态导入页面的时候,不会将静态导入的页面生成一个新的servlet文件,而是将两个文件合并
    • 优点:运行效率高
    • 缺点:两个页面会组合到一起,不利于维护,两个页面中不能存在相同名称的变量
  • 动态导入:
    • <jsp:include page="dynamicImport.jsp"></jsp:include>
    • 两个页面不会进行合并,分别生成自己的servlet文件,但是页面在最终展示的时候合并到一起
    • 优点:没有耦合,可以存在同名变量
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/3/10
  Time: 19:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>page</title>
</head>
<body>
<h1>this is a page</h1>
<%--静态导入--%>
<%@ include file="staticImport.jsp"%>

<%--动态导入--%>
<jsp:include page="dynamicImport.jsp"></jsp:include>
</body>
</html>

请求转发

  • 在jsp中也可以实现servlet的请求转发功能
  • <jsp:forward page="forward.jsp"></jsp:forward>
  • page中填写的是jsp文件的相对路径
  • 注意:在标签中间,不可以添加任何字符,除了传递参数
  • 传递参数:
    • <jsp:param name="sichuan" value="chengdu"></jsp:param>
  • 转发后的页面获取属性:
    • <%=request.getParameter("sichuan")%>
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/3/10
  Time: 19:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>page</title>
</head>
<body>
<h1>this is a page</h1>
    
<%--请求转发--%>
<jsp:forward page="forward.jsp">
    <jsp:param name="sichuan" value="chengdu"></jsp:param>
</jsp:forward>
    
<%-- 获取转发前页面传递过来的参数 --%>
<%=request.getParameter("sichuan")%>
</body>
</html>

JSP九大内置对象

  • JSP页面在转译称为对象的servlet文件的时候,会自动声明一些对象,在JSP页面中直接使用
  • 查看JSP生成的servlet的java文件可发现在_jspService方法中定义了九个对象
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;
}
  • 注意:
    • 内置对象是在jsp页面中使用的
    • 可以在局部代码块中使用,也可以在脚本段语句中使用,但是不能再全局代码块中使用
  • 九大对象: pageContext、request、session、application这四个对象使用较多
    • pageContext:
      • 表示页面上下文对象,封存成了其他的内置对象,封存了当前页面的运行信息
      • 每一个页面都有一个对象的pageContext对象
      • 伴随着当前页面的结束而结束
    • request:
      • 封装当前请求的数据,由tomcat创建,一次请求对应一个request对象
    • session:
      • 用来封装同一个用户不同请求的共享数据
      • 一次会话对应一个session对象
    • application:
      • 相当于servletContext对象,一个web项目只有一个对象
      • 存储着所有用户的共享数据,从服务器启动到服务器结束
    • response:
      • 响应对象
      • 用来响应请求数据,将处理结果返回给浏览器,可以进行重定向
    • out:
      • 响应对象
      • jsp内部使用,带有缓冲区的响应对象,效率高于response
    • page:
      • 代表当前JSP对象,跟JAVA中的this指针类似
    • exception:
      • 异常对象,存储当前运行的异常信息,必须在page指令中添加 isErrorPage="true"
    • config:
      • 相当于ServletConfig对象,用来获取web.xml中配置的数据,完成servlet的初始化操作
  • 四大对象的作用域:
    • pageContext:表示当前页面,解决当前页面内的数据共享,获取其他内置对象
    • request:一次请求,一次请求的servlet的数据共享,通过请求转发的方式,将数据流转到下一个servlet
    • session:一次回话,一个用户发送的不同请求之间的数据共享,可以将数据从一个请求流转到其他请求
    • application:项目内,不同用户的数据共享问题,将数据从一个用户流转到其他用户
  • 路径问题:
    • 在超链接中,想要获取项目中的资源,可以使用相对路径,也可以使用绝对路径
    • 相对路径:相对于当前页面的路径
      • 问题:1、资源的位子不可以随便更改
      • 问题:2、需要使用../的方式进行文件夹的跳出,如果目录结构比较深,可能操作起来比较麻烦
    • 绝对路径:
      • 在请求路径的前面加 / 表示当前服务器的根路径,使用的时候要添加/虚拟项目名称/资源目录
    • 使用jsp中自带的全局路径声明:
      • 使用request的方法拼接当前目录的绝对路径,然后在页面的head标签中使用base标签定义项目目录路径
<%
String path = request.getContextPath();
System.out.println(path);
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
System.out.println(basePath);
%>

<head>
    <base href="<%=basePath%>">
    <title>page</title>
</head>
<body>
    <a href="forward.jsp"></a>
</body>
posted @ 2021-03-11 21:30  殃奕  阅读(68)  评论(0编辑  收藏  举报