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