JSP详解

简介: JSP详解

@[toc]

一、引言


1.1 现有问题

在之前学习Servlet时,服务端通过Servlet响应客户端页面,有什么不足之处?

  • 开发方式麻烦:继承父类、覆盖方法、配置Web.xml或注解
  • 代码修改麻烦:重新编译、部署、重启服务
  • 显示方式麻烦:获取流、使用println("");逐行打印
  • 协同开发麻烦:UI负责美化页面,程序员负责编写代码。UI不懂Java,程序员又不能将所有前端页面的内容通过流输出

二、JSP(Java Server Pages)

Java JSP

C# ASP、ASPX

PHP PHP


2.1 概念

简化的Servlet设计,在HTML标签中嵌套Java代码,用以高效开发Web应用的动态网页

2.2 作用

替换显示页面部分的Servlet(使用*.jsp文件替换XxxJSP.java)

三、JSP开发【重点


3.1 创建JSP

在web目录下新建*.jsp文件(与WEB-INF平级)

3.1.1 JSP编写Java代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>This is my first page</title>
</head>
<body>
    <%=new java.util.Date() %>
</body>
</html>
3.1.2 访问JSP

在浏览器输入http://ip:port/项目路径/资源名称

3.2 JSP与Servlet

  • 关系

    • JSP文件在容器中会转换成Servlet执行。
    • JSP是对Servlet的一种高级封装。本质还是Servlet。
  • 区别

    • 与 Servlet 相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句。
JSP与Servlet区别

3.3 JSP实现原理

Tomcat会将xxx.jsp转换成Java代码,进而编译成.class文件运行,最终将运行结果通过response响应给客户端。

JSP实现原理
在这里插入图片描述
3.3.1 JSP.java源文件存放目录

使用IDEA开发工具,Tomcat编译后的JSP文件(Xxx_jsp.class 和 Xxx_jsp.java)的存放地点:

  • C:\用户\账户名\.IntelliJIdea2019.1\system\tomcat\项目名称\work\Catalina\localhost\应用上下文\org\apache\jsp

四、JSP与HTML集成开发


4.1 脚本

脚本可以编写Java语句、变量、方法或表达式。

4.1.1 普通脚本

语法:<% Java代码 %>

<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>  
<%  
    //jsp中,使用小脚本嵌入java代码!  
    out.println("hi");//打印内容在客户端页面
    System.out.println("hi");//打印内容在控制台
%>
</body>
</html>
4.1.2 声明脚本

语法:<%! 定义变量、函数 %>

<%! int i = 0; %> 
<%! int a, b, c; %> 
<%! Object object = new Object(); %> 
<%!
  //定义方法
  public void m1(){
      System.out.println("你好");
}
%>
4.1.3 输出脚本

语法:<%=Java表达式 %>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp基本使用</title>
</head>
<body>
<p>
   今天的日期是: <%= new java.util.Date() %>
</p>
</body> 
</html>

4.2 JSP注释

JSP注释主要有两个作用:为脚本代码作注释以及HTML内容注释。

4.2.1 语法规则
语法 描述
<%-- 注释 --%> JSP注释,注释内容不会被发送至浏览器甚至不会被编译
< !--注释-- > HTML注释,通过浏览器查看网页源代码时可以看见注释内容
4.2.2 注释
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp基础教程</title>
</head>
<body>
<%-- JSP注释在网页中不会被显示--%> 
<!-- HTML注释在网页源代码中会显示 -->
<p>
   今天的日期是: <%= new java.util.Date() %>
</p>
</body> 
</html>

4.3 JSP指令

JSP指令用来设置与整个JSP页面相关的属性。

指令 描述
<%@ page ... %> 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include ... %> 包含其他文件
<%@ taglib ... %> 引入标签库的定义,可以是自定义标签
4.3.1 page指令
  • 语法:<%@ page attribute1="value1" attribute2="value2" %>

  • Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。

属性 描述
contentType 指定当前JSP页面的MIME类型和字符编码格式
errorPage 指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage 指定当前页面是否可以作为另一个JSP页面的错误处理页面
import 导入要使用的Java类
language 定义JSP页面所用的脚本语言,默认是Java
session 指定JSP页面是否使用session。默认为true立即创建,false为使用时创建
pageEncoding 指定JSP页面的解码格式
4.3.2 include指令
  • 语法:<%@ include file = "被包含的JSP路径"%>

  • 通过include指令来包含其他文件。

  • 被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是当前JSP文件的一部分,会被同时编译执行(静态包含)。
<%@ include file="header.jsp"%>
...
...
<%@ include file="footer.jsp" %>
4.3.3 taglib指令
  • 语法:<%@ taglib uri="外部标签库路径" prefix="前缀" %>

  • 引入JSP的标准标签库

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

4.4 动作标签

  • 语法:
  • 动作标签指的是JSP页面在运行期间的命令
4.4.1 include
  • 语法:
  • 动作元素会将外部文件输出结果包含在JSP中(动态包含)。
属性 描述
page 包含在页面中的相对URL地址。
<jsp:include page="index.jsp"/>
4.4.2 useBean
  • 语法:

  • jsp:useBean 动作用来加载一个将在JSP页面中使用的JavaBean。

<jsp:useBean id="user" class="com.qf.entity.User"/>
4.4.3 setProperty

可以在jsp:useBean元素之后使用jsp:setProperty进行属性的赋值

属性 描述
name name属性是必需的。它表示要设置属性的是哪个Bean。
property property属性是必需的。它表示要设置哪个属性。
value value 属性是可选的。该属性用来指定Bean属性的值。
<jsp:useBean id="user" class="com.qf.entity.User" />

<jsp:setProperty name="user" property="name" value="gavin" />
4.4.4 getProperty

jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出。

属性 描述
name 要检索的Bean属性名称。Bean必须已定义。
property 表示要提取Bean属性的值
<jsp:useBean id="user" class="com.qf.entity.User" />

<jsp:setProperty name="user" property="name" value="gavin" />

<jsp:getProperty name="user" property="name" />
4.4.5 forward
  • 语法:

  • jsp:forward动作把请求转到另外的页面。

属性 描述
page page属性包含的是一个相对URL。
<jsp:forward page="index.jsp" />
4.4.6 param
  • 语法:

  • 在转发动作内部使用,做参数传递

<jsp:forward page="index.jsp">
         <!-- http请求参数传递-->
         <jsp:param name="sex" value="nan" />
</jsp:forward>

4.5 内置对象

由JSP自动创建的对象,可以直接使用

对象名 类型 说明
request javax.servlet.http.HttpServletRequest
response javax.servlet.http.HttpServletResponse
session javax.servlet.http.HttpSession 由session=“true”开关
application javax.servlet.ServletContext
config javax.servlet.ServletConfig
exception java.lang.Throwable 由isErrorPage=“false”开关
out javax.servlet.jsp.JspWriter javax.servlet.jsp.JspWriter
pageContext javax.servlet.jsp.PageContext
page java.lang.Object当前对象this 当前servlet实例
4.5.1 四大域对象

JSP有四大作用域对象,存储数据和获取数据的方式一样,不同的是取值的范围有差别

  • pageContext (javax.servlet.jsp.PageContext) 当前JSP页面范围
  • request (javax.servlet.http.HttpServletRequest) 一次请求有效
  • session (javax.servlet.http.HttpSession) 一次会话有效(关闭浏览器失效)
  • application (javax.servlet.ServletContext) 整个Web应用有效(服务器重启或关闭失效)
4.5.2 pageContext 对象
  • pageContext对象是javax.servlet.jsp.PageContext 类的实例,拥有作用域,用来代表整个JSP页面。
  • 当前页面的作用域对象,一旦跳转则失效
  • 通过setAttribute("name",value);存储值
  • 通过getAttribute("name");获取值
  • 用于获取其他8个内置对象或者操作其他对象的作用域
<%
    pageContext.setAttribute("name",value);//当前页面作用域有效
%>
4.5.3 pageContext获取其他内置对象
<%
    pageContext.getRequest();//返回request内置对象 
    pageContext.getResponse();//返回response内置对象 
    pageContext.getServletConfig();//返回config内置对象
    pageContext.getException();//返回exception内置对象 
    pageContext.getPage();//返回page内置对象
    pageContext.getOut();//返回out内置对象
    pageContext.getServletContext();//返回application内置对象
    pageContext.getSession();//返回session内置对象 
%>
4.5.4 pageContext操作其他内置对象的作用域

pageContext对象可以操作其他作用域存储和获取。

<%
    //操作其他作用域存储
    pageContext.setAttribute("name",value);//当前页面有效
    pageContext.setAttribute("name",value,PageContext.REQUEST_SCOPE);//request作用域
    pageContext.setAttribute("name",value,PageContext.SESSION_SCOPE);//session作用域
    pageContext.setAttribute("name",value,PageContext.APPLICATION_SCOPE);//application作用域

%>

<%
    //操作其他作用域获取
    pageContext.getAttribute("name");//当前页面作用域
    pageContext.getAttribute("name",PageContext.REQUEST_SCOPE);//request作用域
    pageContext.getAttribute("name",PageContext.SESSION_SCOPE);//session作用域
    pageContext.getAttribute("name",PageContext.APPLICATION_SCOPE);//application作用域
    pageContext.findAttribute("name");//从pageContext,request ,session ,application依次查找
%>

4.6 整合

将EmpProject项目所有显示页面JSP的Servlet替换为JSP页面,使用脚本进行显示

五、EL表达式(Expression Language)


5.1 概念

EL使JSP写起来更简单、简洁。主要用于获取作用域中的数据

5.2 作用

用于替换作用域对象.getAttribute("name");

5.3 EL的应用(获取基本类型、字符串)

  • ${scope.name} 获取具体某个作用域中的数据
  • ${name} 获取作用域中的数据,逐级查找(pageContext、request、session、application)
5.3.1 EL应用案例
<%
    //存储在request作用域
    request.setAttribute("name","tom");
    request.setAttribute("age",18);
%>
${requestScope.name} <%--获取request作用域中name对应的值,找到就返回,没找到返回""  --%>
${name}<%--从最小作用域逐级查找name对应的值,找到就返回,没找到返回"" --%>
5.3.2 EL和JSP脚本的区别
  • <%=request.getAttribute() %> 没有找到返回null

  • ${requestScope.name} 没找到返回""

5.4 EL的应用(获取引用类型)

使用EL获取作用域中的对象调用属性时,只能访问对象的get方法,必须遵守命名规范定义

<%
    Emp e = new Emp();
    e.setName("gavin");
    e.setAge(19);
    request.setAttribute("e",e);
%>
${requestScope.e.name}<%-- 调用getName()方法 --%>

5.5 EL的应用(获取数组、集合的元素)

EL可以获取Array、List、Map中的元素,Set由于没下标,无法直接访问元素,后续可遍历

<%
    int[] array = new int[]{1,2,3,4,5};
    request.setAttribute("array",array);

    List<Emp> emps = new ArrayList<>();
    emps.add(new Emp(1,"gavin",2000,19));
    emps.add(new Emp(2,"marry",3000,29));
    emps.add(new Emp(3,"jack",4000,39));
    request.setAttribute("emps",emps);

    Map<String,String> maps = new HashMap<>();
    maps.put("CN","中国");
    maps.put("FK","法国");
    maps.put("US","美国");
    request.setAttribute("maps",maps);
%>
${requestScope.array[0]}

${requestScope.emps[0]} 
相关文章
|
6月前
|
JavaScript Java
jsp使用
jsp使用
|
11月前
|
存储 Java Apache
Jsp相关介绍
Jsp相关介绍
78 0
|
11月前
|
Java 数据库
Jsp应用
Jsp应用
53 0
|
存储 缓存 Java
jsp2
jsp2
44 0
【JSP】jsp的组成
在上一篇博客【jsp】为什么出现JSP?,讲了jsp出现的原因,接下来这篇博客,将向大家讲述jsp中都有哪些内容。
|
Java
jsp处理
jsp处理
110 0
|
开发框架 Java 数据库连接
为什么使用JSP?
为什么使用JSP?
311 0
|
安全 Java 应用服务中间件
jsp
jsp
186 0
jsp
|
存储 前端开发 Java
JSP(四)
JSP(四)
159 0
JSP(四)
|
XML SQL Java
JSP(三)
JSP(三)
148 0
JSP(三)