一、基础知识
1、JSP简介
JSP(全称Java Server Pages)是与PHP、ASP等语言类似的运行在服务端的语言,在一个JSP页面中可以包括指令标识、HTML代码、JavaScript代码、嵌入的Java、JSP动作标识等。
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="./jquery/jquery-3.4.1.js"></script>
<script type="text/javascript"> //javascript代码
$(function(){
$("input").click(function(){
alert("按钮事件");
});
})
</script>
</head>
<body>
<input type="button" value="按钮"/> <!--html代码 -->
<%
out.println("hello world");//嵌入的Java代码
%>
</body>
2、JSP的作用
网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。JSP可以访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。
3、开发环境的安装
参考之前的博客:https://blog.csdn.net/kenjianqi1647/article/details/105000777
4、JSP原理
JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例,Web应用中的每个JSP页面都会由Servlet容器生成对应的Servlet。
网络服务器上有JSP容器,JSP 容器与 Web 服务器协同合作,为JSP的正常运行提供必要的运行环境和其他服务,并且能够正确识别专属于 JSP 网页的特殊元素。
JSP页面是在JSP容器中运行的,Servlet容器也是JSP容器,Tomcat是一个Servlet/JSP容器。
Web服务器使用JSP创建网页的步骤如下:
- 浏览器发送一个HTTP请求给Web服务器,服务器识别出是JSP请求,将该请求传递给JSP引擎。
- JSP引擎从磁盘中载入JSP文件,转化为Servlet,并编译成Servlet类
- Servlet引擎载入并执行Servlet类,产生HTML网页
- Web服务器将网页传给客户端
二、JSP语法
1、指令标识(JSP指令)
指令标识用于设定JSP页面范围内的相关属性,被服务器解释并执行,并不会产生任何内容输出到网页中。
指令指示JSP转换器应该如何将某个JSP页面转换成Servlet的命令。
语法格式:
<%@ 指令名 属性="属性值" %>
- 指令名:用于指定指令的名称,JSP中包括page,include,taglib三条指令。
(1)page指令应用:
page可以对当前JSP页面的某些方面对JSP转换器提出指示。如告诉JSP隐式转换器导入哪些Java类型,隐式对象out的缓冲器大学等。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
上例:告诉页面使用Java脚本语言,指定该页面隐式对象response的内容类型为text/html,该页面的字符编码方式为UTF-8。
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.Date"%>
上例:import指定要导入的Java类型,供本页面的Java代码使用。
(2)include指令应用
通过该指令可以在一个JSP页面中包含另一个JSP页面,使用include指令可以提高代码的重用性。
<%@ include file="path">
为了使整个页面的层次结构不发生冲突,应将被包含的页面中将html、body等标记删除。
注意:path前面以“/”开头,表示是一条绝对路径。不以“/”开头,表示是相对于当前JSP页面的相对路径。
2、脚本标识
脚本标识用于生成页面中的动态内容。包括三部分:JSP表达式、声明标识和脚本程序。
(1)脚本程序
脚本程序就是在JSP页面中嵌入的java代码。可以包含任意java语句、变量、方法或表达式。
语法格式:
<% Java代码 %>
(2)声明标识(JSP声明)
声明标识用于在JSP页面中定义全局的变量或方法。通过定义可以被整个JSP页面访问。
语法格式:
<%! 声明变量或方法的代码 %>
应用举例:
<%!
int number=0;//声明全局变量
int count(){ //声明全局方法
number++;
return number;
%>
(3)JSP表达式
JSP表达式用于向页面输出信息。表达式的运算结果会被填入隐式对象out的print方法中。
语法格式:
<%= 表达式 %>
3、JSP注释
JSP注释主要为代码做注释或将某段代码注释掉。
JSP特有的注释方式为隐藏注释,使用浏览器查看HTML源码时,用户也看不到注释,安全性比较高。
语法格式:
<%-- 注释内容 --%>
4、动作标识(JSP行为)
动作标识利用XML语法格式的标记来控制Servlet引擎的行为。利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。动作标识与指令标识不同,动作标识在请求阶段起作用。
常用的动作标识如下:
(1)包含文件标识<jsp:include>
<jsp:include>动作标识用于向当前页面中包含其他的文件。可以是另外一个JSP页面,一个Servlet或一个静态的HTML页面。
注意它与include指令标识的区别如下:
- include指令标识是在编译级别完成的包含(JSP文件被转换成Servlet的时候),即把当前JSP和被包含的JSP合并成一个JSP,然后再编译成一个Servlet。
- include动作标识是在运行级别完成的包含(插入文件的时候是在页面被请求的时候),即当前JSP和被包含的JSP都会各自生成Servlet,然后在执行当前JSP的Servlet时完成包含另一个JSP的Servlet。
语法格式如下:
<jsp:include page="url" flush="false|true">
- page:为指定被包含文件的相对路径。
- flush:设置是否刷新缓冲区。
(2)请求转发标识<jsp:forward>
请求转发标识可以将请求转发到其他的Web资源,例如另一个JSP页面、HTML页面,Servlet等,请求转发后,当前页面不再被执行,而去执行目标页面。
语法格式如下:
<jsp:forward page="url"/>
page:为请求转发的目标页面。
(3)传递参数标识<jsp:param>
该标识用于为其他标识传递参数。
<jsp:param name="参数名" value="参数值"/>
name:用于指定参数的名称。
value:用于设置对应的参数值。
(4)<jsp:useBean>
该动作将创建一个与某个Java对象相关的脚本变量。
(5)<setProperty>和<c>
setProperty动作是在Java对象中保存了一个属性,getProPerty则是获取一个Java对象的属性。
针对(4)(5)动作设计如下应用案例:实现获取Java类的对象,设置并获取Java对象的属性
Employ.java文件内容如下:
package com.herry.bean;
public class Employee {
private String id;
private String firstName;
public String getId()
{
return id;
}
public void setId(String id)
{
this.id=id;
}
public String getfirstName()
{
return firstName;
}
public void setfirstName(String firstName)
{
this.firstName=firstName;
}
}
index.jsp编辑如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试我的JSP动作</title>
</head>
<body>
<jsp:useBean id="employee" class="com.herry.bean.Employee"></jsp:useBean>
<jsp:setProperty name="employee" property="firstName" value="herry"/>
员工姓名:<jsp:getProperty name="employee" property="firstName"/>
</body>
</html>
项目部署到Tomcat下,浏览器输入http://localhost:8080/project/index.jsp
运行结果如下:
三、JSP内置对象(JSP隐含对象)
Servelt容器将几个对象传给它所运行的Servlet。如在Servlet的service方法中获得HttpServletRequest和HttpServletResponse对象。在JSP中,可以通过使用隐式对象来获得这些对象。
JSP的内置对象用来实现JSP应用,在JSP中一共定义了9个JSP内置对象。
1.request对象
通过request对象提供的相应方法可处理客户端浏览器提交的HTTP请求中的各项参数。
应用举例:
WebContent下新建NewFile.jsp和deal.jsp文件
NewFile.jsp下:
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="./jquery/jquery-3.4.1.js"></script>
<script type="text/javascript"> //javascript代码
</script>
</head>
<body>
<a href="deal.jsp?id=1&user=">处理页</a> <!-- id为传递参数 -->
</body>
deal.jsp下:
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="utf-8"%>
<%
String id=request.getParameter("id"); //获取id参数的值
String user=request.getParameter("user");//获取user参数的值
String pwd=request.getParameter("pwd");//获取pwd参数值
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>处理页</title>
</head>
<body>
id参数的值为:<%=id %><br>
user参数的值为:<%=user %><br>
pwd参数的值为:<%=pwd %>
</body>
</html>
测试结果:
2.response对象
response对象用于响应客户请求,向客户端输出信息。
3.session对象
session对象用来跟踪在各个客户端请求间的会话。通过session可以在应用程序的web页面间进行跳转时,保存用户的状态,使整个会话一直存在下去,直到浏览器关闭。
4.application对象
application对象用于保存所有应用程序中的公有数据。
5.out对象
out对象用于在Web浏览器内输出信息,并管理应用服务器上的输出缓存区。
四、JavaBean
1、JavaBean简介
JavaBean可以将JSP中HTML代码和Java代码相分离,将Java代码单独封装成一个处理某种业务逻辑的类,然后在JSP页面中调用此类,降低了HTML代码和Java代码之间的耦合度,简化了JSP页面,提高了Java代码的重用性。
2、JavaBean规则
- 要有无参的构造函数
- 成员属性私有化
- 封装的属性如果需要被外所操作,必须写为public类型setter、getter方法
3、应用举例
编写一个邮件地址验证程序
(1)Java Resources目录下添加Email类
Email.java文件内容如下:
package com.lyq.bean;
import java.io.Serializable;
/**
* 邮件对象JavaBean
*/
public class Email implements Serializable {
// serialVersionUID 值
private static final long serialVersionUID = 1L;
// Email地址
private String mailAdd;
// 是否是一个标准的Email地址
private boolean eamil;
/**
* 默认无参的构造方法
*/
public Email() {
}
/**
* 构造方法
* @param mailAdd Email地址
*/
public Email(String mailAdd) {
this.mailAdd = mailAdd;
}
/**
* 是否是一个标准的Email地址
* @return 布尔值
*/
public boolean isEamil() {
// 正则表达式,定义邮箱格式
String regex = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
// matches()方法可判断字符串是否与正则表达式匹配
if (mailAdd.matches(regex)) {
// eamil为真
eamil = true;
}
// 返回eamil
return eamil;
}
public String getMailAdd() {
return mailAdd;
}
public void setMailAdd(String mailAdd) {
this.mailAdd = mailAdd;
}
}
(2)WebContent目录下添加index.jsp文件
index.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="result.jsp" method="post">
<table align="center" width="300" border="1" height="150">
<tr>
<td colspan="2" align="center">
<b>邮箱认证系统</b>
</td>
</tr>
<tr>
<td align="right">邮箱地址:</td>
<td><input type="text" name="mailAdd"/></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" />
</td>
</tr>
</table>
</form>
</body>
</html>
(3)WebContent目录下添加result.jsp文件
result.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="com.lyq.bean.Email"%><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<div align="center">
<%
// 获取邮箱地址
String mailAdd = request.getParameter("mailAdd");
// 实例化Email,并对mailAdd赋值
Email email = new Email(mailAdd);
// 判断是否是标准的邮箱地址
if(email.isEamil()){
out.print(mailAdd + " <br>是一个标准的邮箱地址!<br>");
}else{
out.print(mailAdd + " <br>不是一个标准的邮箱地址!<br>");
}
%>
<a href="index.jsp">返回</a>
</div>
</body>
</html>
测试结果如下:
参考文献: