7. JSP
JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。
Sun公司于1998年发布JSP第一版,目前最新版本是随Java EE 7一起发布的JSP 2.3版。
JSP技术的特点:
JSP是一种服务器端脚本语言,其出现降低了Servlet编写页面的难度。JSP本质上就是Servlet,实际上JSP是首先被翻译成Servlet后才编译运行的,因此JSP能够实现Servlet所能够实现的所有功能。
相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
7.1 第一个jsp
<%--
Created by IntelliJ IDEA.
User: root
Date: 2020/12/11
Time: 9:45
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>欢迎访问jsp</h1>
<%
// http://127.0.0.1:8080/web/first.jsp
//Java代码
System.out.println("第一个JSP");
%>
</body>
</html>
通过 http://127.0.0.1:8080/web/first.jsp 请求后,在idea的tomcat目录中会发现如下文件
7.2 JSP运行原理
JSP同Servlet一样,都运行在Servlet容器中。当用户第一次访问JSP页面时,JSP页面的处理过程:
7.3 JSP页面基本结构
JSP页面就是带有JSP元素的常规Web页面,它由模板文本和JSP元素组成。 在一个JSP页面中,所有非JSP元素的内容称为模板文本(template text)。模板文本可以是任何文本,如:HTML、XML,甚至可以是纯文本。 JSP并不依赖于HTML,它可以采用任何一种标记语言。模板文本通常被直接传递给浏览器。在处理一个JSP页面请求时,模板文本和JSP元素所生成的内容会合并,合并后的结果将作为响应内容发送给浏览器。 JSP有三种类型的元素: 脚本元素(scripting element)、指令元素(directive element)和动作元素(action element)。
7.3.1 脚本元素
脚本
<% %>
表达式
<%= %>
声明
<%! %>
注释
- html:
<!-- -->
随着html发送给客户端 - java脚本的注释 // /* */ 随着翻译保留到Java文件
- jsp的注释 <%-- 注释的内容--%> 只在jsp中使用,java和浏览器都看不见。
<%--
Created by IntelliJ IDEA.
User: root
Date: 2020/12/11
Time: 9:45
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>欢迎访问jsp</h1>
<!-- html -->
<%-- jsp的注释 : 不会出现源文件 <% %> --%>
<%
// http://127.0.0.1:8080/web/first.jsp
//Java代码
/***
* doc注释
*/
System.out.println("第一个JSP");
%>
<%
//脚本
String show = request.getParameter("show");
if (show != null && !"".equals(show)) {
%>
<h1>显示标题</h1>
<%
}
%>
表达式: <%=1+2%>
<%--声明变量--%>
<%! int numa = 900;
%>
<%--声明方法--%>
<%!
void sayHello(){
System.out.println("hellowold ");
}
%>
<%
sayHello();
%>
</body>
</html>
7.3.2 指令元素
Page
- jsp文件编码问题:
- pageEncoding: 告诉tomcat服务器使用什么编码翻译jsp文件(jsp->java文件)
- contentType: tomcat服务器发送给浏览器的数据编码(tomcat服务器->浏览器)
- 异常错误相关的:
- errorPage: 指定当前jsp页面的错误处理页面。
- isErorrPage: 指定当前页面是否为错误处理页面。false,不是错误处理页面,则不能使用exception内置对象;true,是错误处理页面,可以使用exception内置对象。
针对servlet后端的代码异常,可以指定异常类型,跳转的页面,web.xml中而配置
xml<error-page> <exception-type>java.lang.ArithmeticException</exception-type> <location>/error/error.jsp</location> </error-page>
针对http code代码配置异常页面,比如404
xml<error-page> <error-code>404</error-code> <location>/error/404.jsp</location> </error-page>
- jsp文件编码问题:
include指令
静态包含
include指令的作用是在页面翻译期间引入另一个文件,被包含的文件可以是JSP、HTML或文本文件。
语法:<%@include file="文件"%>
include指令会先将当前JSP和被包含的文件融合到一起形成一个Servlet再进行编译执行;因此包含文件时,必须保证新合并生成的文件符合JSP语法规则。例如,当前文件和被包含文件的不能同时定义同名的变量,否则当前文件将不能编译通过,会提示Duplicate local variable错误。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div>共同的头部信息</div>
在需要的位置
<%@include file="header.jsp"%>
header.jsp 没有产生 翻译的 Java文件
taglib :
- jstl导包
xml<dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
在jsp中引入tablib
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
使用taglib
html<body> <% List list = new ArrayList(); list.add(1); list.add(1); list.add(1); list.add(1); list.add(1); list.add(1); list.add(1); request.setAttribute("list",list); %> <table cellspacing="0" cellpadding="0" border="1" width="80%" align="center"> <tr> <td>序号</td> <td>姓名</td> <td>年龄</td> </tr> <c:forEach items="${list}" var="num" varStatus="stat"> <tr> <td>${stat.index}</td> <td>姓名${stat.index}</td> <td>年龄${stat.index}</td> </tr> </c:forEach> </table> </body>
7.3.3 动作元素
虽然JSP页面仅用作数据显示模块,希望不嵌套任何java业务逻辑代码,但在实际开发中不引入一点业务逻辑是不可能的,但引入业务逻辑会导致页面代码可维护性、可读性降低,因此Sun公司允许用户开发自定义标签封装页面的java代码,以便jsp页面不出现一行java代码, 在jsp页面中也内置了一些标签(动作元素),开发人员使用这些标签可以完成页面的一些常用业务逻辑。 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在JSP页面中提供业务逻辑功能。 JSP规范定义了一系列标准动作,常用有下列几种:
<jsp:include>
标签
动态包含
<jsp:include page="header.jsp"/>
<jsp:forward>
标签
<jsp:param>
标签
代码
<%--include 动作--%>
<%--
<jsp:include page="header.jsp">
<jsp:param name="name" value="action Param"/>
</jsp:include>
--%>
<%--forward动作--%>
<jsp:forward page="user/user_list.jsp">
<jsp:param name="title" value="UserList"/>
</jsp:forward>
useBean、setProperty 、getProperty
7.3.4 javaBean规范
什么是JavaBean
JavaBean 是一种JAVA语言写成的可重用组件,是一个遵循特定写法的Java类,它通常具有如下特点:
- 这个Java类必须具有一个无参的构造函数
- 属性必须私有化。
- 私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。
JavaBean可分为两种:
- 一种是有用户界面(UI,User Interface)的JavaBean,例如一些GUI组件(按钮、文本框、报表组件等);
- 另一种是没有用户界面、主要负责封装数据、业务处理的JavaBean。JSP通常访问的是后一种JavaBean。
JSP与JavaBean搭配使用,具有以下优势:
JSP页面中的HTML代码与Java代码分离,便于页面设计人员和Java编程人员的分工与维护;
使JSP更加侧重于生成动态网页,业务处理由JavaBean来完成,使系统更趋于组件化、模块化。
JavaBean的这些优势,使系统具有了更好的健壮性和灵活性,使得JSP+JavaBean和JSP+Servlet+JavaBean的组合设计模式成为目前开发Java Web应用的主流模式(MVC等Web开发模式后续讲解)
