- 掌握内置对象
- 掌握基础语法
JSP全名为:Java Server Pages,是一个简化的Servlet设计,实现了在Java中使用html标签。JSP是一种动态网页技术。
jsp页面元素
jsp由指令、表达式、静态内容、注释、声明、小脚本组成
JSP指令
- page指令:通常位于JSP顶端,同一个页面可以有多个page指令
- include指令:将一个外部文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句
- taglib指令:使用标签库定义新的自定义标签,在JSP页面中启用定制行为
JSP文件中的模板
jsp技术是基于模板的文件,这个模板一般是html,JSP页面需要遵循模板元素,在这个基础之上进行编程。使用Java语言
注释
1.普通注释,能被客户端查看源码时看到
<!--普通html注释-->
2.隐藏注释,只有后台编写代码时能够看见
<%--隐藏注释--%>
3.脚本代码注释(在客户端也不可见)
// 单行注释
/*
* 多行注释
* */
jsp声明:
JSP声明指的就是在JSP页面中定义变量或者方法 语法: <%! Java代码 %>
声明方法时定义出返回值,方法前面,参数列表和方法体。
String s="sss";
int add(int a,int b){
return a+b;
}
JSP脚本:
JSP脚本指的就是在JSP页面中执行的java代码,因此在脚本块中严格遵循java代码的编写规范,含有分号结束等特征。
语法:<% Java代码 %>
可以利用对象调用输出,在脚本中引用方法,不能对方法再进行方法体的定义声明
<%out.println(s) ;%>
jsp表达式:
调用声明中的变量或方法,与脚本最大的区别是:表达式只是一个没有分号结尾的引用表达式,而不能含有java代码。在jsp页面中执行的表达式,会返回到JSP页面中
语法:<%=表达式%>
x+y=<%= add(10,20)%>
分别使用表达式和脚本输出一个九九乘法表:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>九九乘法表</title>
</head>
<body>
<div>
<%--
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
--%>
<%!
String printTable(){
StringBuilder sb=new StringBuilder();
sb.append("<h1>").append("基于表达式实现的九九乘法表").append("</h1>");
for(int i=1;i<10;i++){
for(int j=1;j<=i;j++){
sb.append(j)
.append("*")
.append(i)
.append("=")
.append(i*j)
.append(" ");
}
sb.append("</br>");
}
return sb.toString();
}
%>
<%--利用表达式打印输出--%>
<%=printTable()%>
</div>
<div>
<%!
void printTable2(JspWriter out) throws Exception{
for(int i=1;i<10;i++){
for(int j=1;j<=i;j++){
out.println(j+"*"+i+"="+j*i+" ");
}
out.println("</br>");
}
}
%>
<h1>九九乘法表:基于脚本输出</h1>
<%
printTable2(out);
%>
</div>
</body>
</html>
JSP生命周期
编写好jsp页面后,tomcat对jsp进行分析,将jsp转化为servlet,成为一个服务端程序,然后将servlet实时编译为一个class文件,然后以servlet的方式解析执行class文件。
JSP页面只要发生修改,那么JSP引擎都会把源文件重新编译,生成最新的字节码文件。
JSP内置对象
JSP内置对象是web容器创建的一组对象,不用关键字new就可以使用的对象。
JSP的九个内置对象分别是:application、out、page、config、response、resquest、pageContext、session、exception
JSP的四个域分别是:page域、request域、application域、session域。其中page域的作用范围是当前页,request域的作用范围是当前请求、session域的作用范围是当前会话、application域的作用范围是当前web应用。
page域对应的域对象是pageContext,类型是PageContext,request域对应的域对象是request,类型是HttpServletRequest,session域对应的域对象是session,类型是HttpSession,application域对应的域对象是application,类型是HttpServlet,四个域对象都含有一下三个方法:
-
setAttribute(String key,String value)
-
getAttribute(String key)
-
removeAttribute(String key)
-
out对象
是jsWriter类的实例,是客户端输出内容常用的对象,常用方法有:
void println()
向客户端打印字符串void clear()
清除缓冲区的内容, 如果在fl ush之后调用会抛异常。void clearBuffer()
: 清除缓存区内容, 在fl ush之后调用不会抛异常。void flush()
: 将缓冲区内容输出到客户端。int getBufferSize()
: 返回缓冲区字节大小, 如果没有缓冲区, 则为0int getRemaining()
: 返回缓冲区还剩余多少字节可用boolean i sAutoFlush()
: 返回缓冲区满时, 是自动清空还是抛出异常。void close()
: 关闭输出流。
get()与post()
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>欢迎登陆</title>
</head>
<body>
<h1>
JSP登陆演示
</h1>
<form id="loginForm" method="get" action="doLogin.jsp">
<div>
</div>
<label for="userName">用户名:</label>
<input id="userName" type="text" name="userName" value=""/>
<label for="password">用户名密码</label>
<input id="password" type="password" name="password" value="">
<input type="submit" value="登陆">
</form>
</body>
</html>
request对象
客户端的请求信息被封装在request对象中,通过这个对象才能了解到客户的需求,然后做出响应。request是
HttpServletRequest类的实例。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登陆界面</title>
</head>
<body>
<%
String userName=request.getParameter("userName");
String password=request.getParameter("password");
if(userName==null||password==null){
out.print("<h1>");
out.print("请输入用户名和密码");
out.print("</h1>");
}else{
if("admin".equals(userName)&&"admin".equals(password)){
out.print("欢迎");
out.print(userName);
}else{
out.print("登陆失败");
}
}
%>
</body>
</html>
getParameter与getParameterValues方法使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户选择技能</title>
</head>
<body>
<h2>用户选择</h2>
<form id="skill_form" method="post" action="request_handle.jsp">
<table>
<tr>
<td>用户名</td>
<td>
<input type="text" name="userName" id="userName" value="" placeholder="请输入用户名">
</td>
</tr>
<tr>
<td>技能</td>
<td>
<%--多选框checkbox
单选框:radio
--%>
<input type="checkbox" name="skill" value="java"/>java
<input type="checkbox" name="skill" value="c语言"/>c语言
<input type="checkbox" name="skill" value="c++"/>c++
<input type="checkbox" name="skill" value="php"/>php
</td>
</tr>
<tr>
<td>
<input type="submit" value="登录">
</td>
</tr>
</table>
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>处理Request Form提交数据</title>
</head>
<body>
<%
//获取请求的参数值,会产生乱码的问题,因为浏览器的默认编码是ISO-8859-1
request.setCharacterEncoding("UTF-8");
String userName = request.getParameter("userName");
String[] skills = request.getParameterValues("skill");
%>
<p> 用户名:<%out.print(userName);%></p>
<p>用户技能</p>
<ol>
<%
for (String skill : skills) {
%>
<li>
<%
out.print(skill);
%>
</li>
<%
}
%>
</ol>
</body>
</html>
request对象的其他方法:
密码 : <%=request.getAttribute("password")%><br>
请求体的MIME类型 : <%=request.getContentType()%><br>
协议类型以及版本号 : <%=request.getProtocol()%><br>
服务器主机名 : <%=request.getServerName()%><br>
服务器端口号 : <%=request.getServerPort()%><br>
请求体大小 : <%=request.getContentLength()%><br>
请求客户端的IP地址 : <%=request.getRemoteAddr()%><br>
请求的真实路径 : <%=request.getRealPath("dologin.jsp")%><br>
请求的上下文路径 : <%=request.getContextPath()%><br>
response对象
response对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其他页面的response对象对当前页面无效。
当有out对象与response对象同时输出时,response对象获得的PrintWriter输出流打印的内容总是优先于内置out对象打印的内容,若要解决这个问题,可以采用out.flush()方法清空out对象的缓冲区
转发与重定向
转发与重定向的区别:
重定向:本质上是两次请求。第一次请求发送给客户端后,请求对象不会保存,响应会带回一个url,客户端再依据这个URL再次请求,客户端地址会发生变化
转发:本质上是一次请求,转发后请求对象会保存,地址栏不会发生变化
session对象
session表示客户端和服务器的一次会话,WEB中的session指的是用户浏览某个网站,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间
session对象是一个JSP的内置对象
session对象在第一个JSP页面被装载时自动创建,完成会话期管理。
从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。
当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象
session对象常用方法
Session Id号:<%=session.getId()%><br>
从Session中获取用户名:<%=session.getAttribute("userName")%><br>
Session过期时间:<%=session.getMaxInactiveInterval()%>秒<br>
重新设置Session过期时间:<% session.setMaxInactiveInterval(5); %>
session生命周期
1.创建
当客户端第一次访问某个jsp或者Servlet的时候,服务器会为当前会话创建一个SessionId,每次客户端向服务端发
送请求时,都会将此SessionId携带过去,服务端会对此SessionId进行校验。
2.活动:
某次会话当中通过超链接打开的新页面属于同一次会话。
只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话。
除非本次会话的所有页面关闭后再重新访问某个jsp或者Servlet,才会创建新的会话。
注意!!!:原有会话还存在,这个旧的SessionId仍然存在于服务器端,只不过再也没有客户端会携带他然后
交予服务端校验
3.销毁:
Session的销毁只有三种方式:
- 调用了session.invalidate()方法
- Session过期(超时)
- 服务器重新启动
Tomcat默认session超时时间为30分钟
application对象
application对象实现了用户间数据的共享,可存放全局变量。
application开始于服务器的启动,终止于服务器的关闭。
在用户的前后连接或不同用户的连接中,可以对application对象的同一属性进行操作。
在任何地方对application对象属性的操作,都将影响其他用户对此的访问。
application对象是ServletContext类的实例。
application常用方法
设置属性信息:application.setAttribute("city","Xi'An");
获取属性信息:application.getAttribute("city")
获得所有全局属性:Enumeration<String> enumeration = application.getAttributeNames()
获得JSP引擎版本信息:application.getServerInfo()
page对象
page对象就是指向当前JSP页面本身,有点像SE中的this指针,它时java.lang.Object类的实例。常用方法与Object
类中的常用方法完全一致
因此当浏览器访问一个静态JSP资源页面时,JSP页面通过Tomcat中的JSP引擎处理后变为一个java文件,其中是java的Servlet类,java文件的文件名是JSP文件名_jsp.java
,再将这个java文件编译为class文件,然后再通过response对象的printwriter将java中的动态内容变为一个静态的网页,这个JSP页面就是一个Page对象。
pageContext对象
pageContext对象提供了对JSP页面内所有的对象及名字空间的访问。
pageContext对象可以访问到本页面所在的session,application的某一属性值。
访问当前JSP页面跳转到另一个页面:pageContext.forward("login.jsp");
当前JSP页面包含另一个JSP页面的body体:pageContext.include("include.jsp")
exception对象
exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个JSP页面要应用
此对象,就必须把isErrorPage置为true,否则无法编译。
常用方法如下:
String getMessage()
返回描述异常的信息。
String toString()
返回关于异常的简短描述信息
void printStackTrace()
显示异常及其堆栈
Throwable FillInStackTrace()
重写异常的执行堆栈
<%@ page contentType="text/html;charset=UTF-8" language="java"
errorPage="error_page.jsp" %>
<html>
<head>
<title>测试Exception</title>
</head>
<body>
<%
//若在脚本块里写代码遭成异常,会将错误信息以乱码打印到终端
//因此使用errorPage="error_page.jsp" 使异常转发到指定页面
out.print(10/0);
%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java"
isErrorPage="true" %>
<html>
<head>
<title>exception内置对象</title>
</head>
<body>
异常消息为:<%=exception.getMessage()%></br>
异常消息的字符串表示为:<%=exception.toString()%></br>
</body>
</html>
指令与动作
page:是指向当前JSP页面本身,有点像SE中的this指针
include:,是一种静态引入,(大型网站顶部导航栏以及也叫版权所有页面可以采用引入的方式)定义一个可以被包含进其他页面中的jsp页面
<%@ include file = "URL"%>
动作语法:
<jsp:include page="URL" flush="true|false"/>
flush表示被包含的页面是否要从缓冲区读取
…/代表上级目录
. 或者 ./代表当前目录
/代表根目录(webapp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h1>这是一个导航栏,是网页的尾部信息</h1>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h1>这是一个尾部信息,当前访问时间为
<%
LocalDateTime dateTime=LocalDateTime.now();
out.print(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
%>
</h1>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>这是测试include</title>
</head>
<body>
<%@include file="seggment/header.jsp"%>
<p>这是body的内容</p>
<p>这是body的内容</p>
<p>这是body的内容</p>
<p>这是body的内容</p>
<%--动作语句--%>
<%--flush="true":会自动调用缓冲区--%>
<jsp:include page="seggment/footer.jsp" flush="true">
</body>
</html>
forward动作
语法:
<jsp:forward page="URL"/>
等同于:request.getRequestDispatcher("/url").forward(request,response);
param动作
语法:<jsp:param name="参数名" value="参数值">
常常与jsp:forward一起使用,作为其子标签;
登录界面的重定向:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%@include file="seggment/header.jsp"%>
<form id="loginForm" method="get" action="test_forward.jsp">
<div>
</div>
<label for="userName">用户名:</label>
<input id="userName" type="text" name="userName" value=""/>
<label for="password">用户名密码</label>
<input id="password" type="password" name="password" value="">
<input type="submit" value="登陆">
</form>
<%@include file="seggment/footer.jsp"%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:forward page="test_user.jsp">
<jsp:param name="email" value="hao123@192.com"></jsp:param>
<jsp:param name="skill" value="java,c++"></jsp:param>
</jsp:forward>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
request.setCharacterEncoding("UTF-8");
String userName = request.getParameter("userName");
String password=request.getParameter("password");
%>
<p>用户名:<%=userName%></p>
<p>用户密码:<%=password%></p>
<p>邮箱:<%=request.getParameter("email")%>></p>
<p>技能:<%=request.getParameter("skill")%>></p>
</body>
</html>