<仅供个人复习使用>
1.JSP概述
JSP是Java Server Page缩写,Sun公司推出的一种动态网页技术。同伙将动态代码嵌入到静态HTML(XML)中,从而产生动态输出。
JSP和Java Servlet一样,在服务器端执行,返回给客户的是HTML文本。
JSP采用的是Java语言,文件名后缀为:.jsp
2.JSP编程基础
1)JSP注释
- 发送到客户端的JSP注释方式,里面可以包含Java表达
式,格式为:
<!-- 注释内容<%=Java表达式 %> -->
- 不发送到客户端的JSP注释方式,格式为:
<%-- 注释内容<%=Java表达式 %> --%>
2)JSP表达式
作用:将expression的运算结果输出到客户端。
JSP表达式的基本语法:<%=expression %>
3)JSP Scriptlet(脚本块)
多行Java代码,要使用JavaScriptlet实现,格式:
<%
Java code(插入到JSP文件中的Java代码)
%>
举例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String path = request.getContextPath();
out.println(path);
String base = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
out.print(base+"css/a.css");
%>
</body>
</html>
输出:
/FirstWebProject http://localhost:8800/FirstWebProject/css/a.css
4) JSP声明
在JSP中方法和全局变量的声明应放在JSP声明部分。基本语法:
<%!
声明部分(Java变量和方法的代码)
%>
举例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%!
int getSum(int data[]){
int sum = 0;
if(data.length > 0){
for(int i=0;i<data.length;i++){
if(data[i]%5==0)
sum = sum + data[i];
}
}
return sum;
}
%>
<%
int data[]= {1,23,4,5,6};
int sum = getSum(data);
out.print("该数组元素的和为:" + sum);
%>
</body>
</html>
输出结果为:
该数组元素的和为:5
3.JSP指令
JSP指令是为JSP引擎而设计的。不会产生任何输出,而只是告诉引擎如何处理JSP页面。
这些指令包含在<%@%>标记中。
指令有三个:page、include和taglib。
3.1 page指令
page指令允许程序员导入需要的类、指明JSP输出的内容类型、控制session等。
- import属性:导入需要的类,格式:
<%@ page import=“package.classname” %>
<%@ page import=“package1.classname” %>
<%@ page import=“package1.classname,package2.classname”>
- contentType和pageEncoding属性:
contentType用来指明JSP输出内容的MIME类型及字符编码方式,指出浏览器通过何种方式处理信息,即服务器发送给客户端浏览器时所见到的网页内容的编码。
pageEncoding用来指明JSP文件即自身存储时的编码方式。
- session属性:控制页面是否需要使用session,属性值:
true---表示页面需要使用session属性,默认值。
false---表示页面不需要使用session属性。
- errorPage和isErrorPage属性:
errorPage: 用来指明在这个JSP页面中出现未被捕获的异常
时,跳转到哪个页面来处理。跳转页面需要使用isErrorPage
属性指明可以用于其他页面的错误处理。
具体事例:错误处理页面:errorHandle.jsp
- buffer和autoFlush属性:
buffer用来指定在使用out内置对象向客户端输出内容时使用的缓冲区大小,默认值8K。
autoFlush: 是否自动清空输出缓冲区。属性值:
true--当缓冲区满时,自动清空输出缓冲区,默认值。
false--在缓冲区溢出时会抛出一个异常。
例如:
<%@ page buffer=“64kb” %>
- info属性:
info用来指定对JSP页面的一些说明信息。例如:
<%@page info=“info的说明信息” %>
- 其他不常使用的属性:
isThreadSafe:是否支持线程
isELIgnored:是否执行或忽略EL表达式。true-忽略。
language:使用的脚本语言,目前该属性的值只能是Java.
extends:一般不用,定义此JSP页面产生的Servlet是继承
哪个父类,默认是HttpJspBase。
3.2 include指令
include指令用于将多个JSP页面组合起来,成为一个完整的JSP页面
格式:<%@ include file="filename" %>
<%@taglib uri=“http://java.sun.com/jsp/” prefix=“c” %>
4.JSP动作
JSP动作是指JSP中利用XML语法格式的标记来控制Servlet容器的行为。例如:动态插入文件、调用JavaBean组件、将用户请求重定向到另外的页面等。
JSP动作包括:
<jsp:include>:
<jsp:useBean>:
<jsp:setProperty>:
<jsp:getProperty>:
<jsp:forward>:
<jsp:plugin>: 用于在生成的HTML页面中包含Applet和
JavaBean对象
4.1 include动作(标签)
include动作用来指定需要包含进来的资源。
语法格式:
<jsp:include page=“filename” />
<jsp:include page=“filename”></jsp:include>
可以向被包含的文件中传递参数,通过如下方式:
<jsp:include page=“includeFile”>
<jsp:param name=“paramName” value=“paramValue” />
</jsp:include>
使用HttpServletRequest中的方法:
getParameter(“paramName”)获得。
应用:
*******main.jsp*********************
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:include page="date.jsp"></jsp:include>
</body>
</html>
**************date.jsp*************
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
今天是<%=new java.util.Date() %>
</body>
</html>
4.2 forward动作
forward动作用来实现程序的转向。语法格式:
<jsp:forward page=“forward.jsp” />
包括子元素:
<jsp:forward page=“orward.jsp”>
<jsp:param name=“paramname” value=“paramValue”
</jsp:forward>
注意:使用forward动作的页面最好不要带任何输出,即:HTML代码、<%=expression%>out.println()等语句
5.JSP 内置对象
5.1 out对象:不能在JSP声明中使用。
此对象等同于 Servlet中的PrintWriter对象。常用方法:
(1) print()/println(): 向客户端输出各种信息。
(2) clear(): 清除缓冲区的内容,若flush则抛出异常。
(3) clearBuffer(): 清除缓冲区当前内容。
(4) flush(): 刷新流,即将流中内容送到客户端,并将流清空。
(5) close(): 关闭输出流,清除所有内容。
5.2 request对象 △
request对象表示请求信息。对应Servlet中的HttpServletRequest
常用方法:
getParameter(String paraName): 获取指定参数名对应的值。
Object getAttribute(String name): 获得指定参数对应属性值。
void setAttribute(Stirng name): 设置指定参数的值。
void setCharacterEncoding(String env): 设置request的字符
编码
5.3 response对象 △
response对象表示响应信息, 对应Servlet中的
HttpServletResponse
Object getAttribute(String name): 获得指定参数对应属性值。
void setAttribute(Stirng name): 设置指定参数的值。
void setCharacterEncoding(String env): 设置response的字
符编码
应用:
<%@ page language="java" import="java.util.Date" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Date date = new Date();
out.print(date);
response.setHeader("refresh", "2");
%>
</body>
</html>
输出:
Sat Apr 16 17:16:00 GMT+08:00 2022
5.4 session对象
session对象用于保存与客户端有关的状态信息,实现同一客户在不同页面之间的数据共享。
session对象常用方法:
Object getAttribute(String name): 获得指定参数对应属性值。
void setAttribute(Stirng name,Object value): 设置指定参数
的值。
应用:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String sessionID = session.getId();
session.setAttribute("username", "zhangsan");
String data = (String)session.getAttribute("username");
%>
session00页面中Web服务器分配的sessionID是<%=sessionID %><br>
session00设置属性值username是<%=data %>
</body>
</html>
输出:
session00页面中Web服务器分配的sessionID是A723D6C100AC07ECC49B9AD6F3DB2EB9
session00设置属性值username是zhangsan
5.5 application对象
application对象表示整个应用的上下文,是实现javax.servlet.ServletContext类对象。
application常用方法:
Object getAttribute(String name): 获得指定参数对应属性值。
void setAttribute(Stirng name,String value): 设置指定参数的值。
应用:
网站访问人数统计实例:【在网站首页实现】
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Object count = application.getAttribute("count");
if(count == null){
Integer n = new Integer(1);
application.setAttribute("count", n);
} else {
int counttemp = Integer.parseInt(count.toString());
if(session.isNew()){
counttemp=counttemp+1;
application.setAttribute("count", counttemp);
}
}
%>
网站访问人数:<%=application.getAttribute("count") %>
</body>
</html>
ps:
同一浏览器发出---同一session
换不同浏览器 --- session会加1
5.6 exception对象
exception表示页面异常,可以获得异常信息。
注意:使用exception对象时,页面中的page指令中的属性:isErrorPage=true;
可以在web.xml中配置整个应用的出错处理页面。web.xml的内容:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String data[]={"12","23","34"};
String value = data[3];
%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8" isErrorPage="true" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
程序出现了异常:
<%
out.print(exception.getMessage());
out.print(exception.toString());
%>
</body>
</html>
输出:
5.7 pageContext对象
pageContext对象可以管理其他8个内置对象,可以通过它获得与JSP内置对象。
6 JSP与Servlet
6.1 关系
JSP第一次执行时,Web服务器会自动将它转换成一个Servlet文件,然后Web服务器进行编译。
6.2 交互
JSP跳转Servlet, 使用jsp:forward实现, 代码如下(doGet)
<body>
<jsp:forward page="/servlet1">
<jsp:param value="test123456" name="test" />
</jsp:forward>
</body>
Servlet跳转JSP, 使用HttpServletRequest类中的getRequestDispatcher(String url)获得RequestDispatcher对象—利用此 对象的forward()方法实现。
7.在JSP中使用JDBC访问数据库
JSP与JDBC综合应用:
- 在Tomcat构建数据库连接池
- 构建数据库访问类
- 利用数据库操作类实现具体的实例
举例:
不调用DBUtil封装类:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div style="text-align:center;">
<form action="jdbcdemo.jsp" method="post">
请输入学生姓名:<input type="text" name="sname"/><input type="submit" value="查询" />
</form><br>
<table width="600px" border="1" style="border-collapse:collapse;margin:auto;">
<tr>
<td>学号</td>
<td>姓名</td>
<td>年龄</td>
<td>地址</td>
</tr>
<%
String sql = "";
String driverName="com.mysql.cj.jdbc.Driver";
String url="jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf-8";
String username="root";
String password="123456";
Class.forName(driverName);
Connection conn = DriverManager.getConnection(url,username,password);
Statement st = conn.createStatement();
request.setCharacterEncoding("utf-8");
String sname = request.getParameter("sname");
if("".equals(sname)){
sql = "select * from student";
}else{
sql = "select * from student where sname='"+sname+"'";
}
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
%>
<tr>
<td><%=rs.getString("sno") %></td>
<td><%=rs.getString("sname") %></td>
<td><%=rs.getString("age") %></td>
<td><%=rs.getString("address") %></td>
</tr>
<%} %>
</table>
</div>
</body>
</html>
调用DBUtil封装类
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@page import="com.tjut.dao.DBUtilT"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div style="text-align:center;">
<form action="jdbcdemo.jsp" method="post">
请输入学生姓名:<input type="text" name="sname"/><input type="submit" value="查询" />
</form><br>
<table width="600px" border="1" style="border-collapse:collapse;margin:auto;">
<tr>
<td>学号</td>
<td>姓名</td>
<td>年龄</td>
<td>地址</td>
</tr>
<%
String sql = "";
request.setCharacterEncoding("utf-8");
String sname = request.getParameter("sname");
if("".equals(sname)){
sql = "select * from student";
}else{
sql = "select * from student where sname=?";
}
Object[] args={sname};
ArrayList<HashMap<String,String>> list = DBUtilT.executeQuery(sql, args);
for(int i=0;i<list.size();i++){
%>
<tr>
<td><%=list.get(i).get("sno") %></td>
<td><%=list.get(i).get("sname") %></td>
<td><%=list.get(i).get("age") %></td>
<td><%=list.get(i).get("address") %></td>
</tr>
<%}%>
</table>
</div>
</body>
</html>