JSP 学习
一. JSP的执行过程
以下步骤表明了Web服务器是如何使用JSP来创建网页的:
就像其他普通的网页一样,浏览器发送一个HTTP请求给服务器。Web服务器识别出这是一个对JSP网页的请求,并且将该请求传递给JSP引擎。通过使用URL或者.jsp文件来完成。
JSP引擎从磁盘中载入JSP文件,然后将它们转化为servlet。这种转化只是简单地将所有模板文本改用println()语句,并且将所有的JSP元素转化成Java代码。 JSP引擎将servlet编译成可执行类,并且将原始请求传递给servlet引擎。 Web服务器的某组件将会调用servlet引擎,然后载入并执行servlet类。在执行过程中,servlet产生HTML格式的输出并将其内嵌于HTTP response中上交给Web服务器。Web服务器以静态HTML网页的形式将HTTP response返回到浏览器中。
最终,Web浏览器处理HTTP response中动态产生的HTML网页,就好像在处理静态网页一样。
二. JSP中的注释
JSP可以添加的注释:
- HTML注释:<!–HTML注释-- >
- JSP注释:<%–JSP注释–%>
- JSP脚本中的Java注释:<%//单行注释%>、<%/多行注释/%>
注意区别:
- JSP注释不会被转译, 在JSP文件转译的.java文件和浏览器得到的HTML源码中都不会有JSP注释的内容, 仅作用于JSP文件
- Java注释会被转译, 在.Java文件中可以看到Java注释, 但是浏览器得到的HTML源码中没有Java注释, 作用于Java文件
- HTML注释在.java文件和浏览器得到的HTML源码中都可以看到,作用于HTML
在JSP文件中添加以下注释:
<!-- html 注释 -->
<%
/* java 注释 */
// java 注释
%>
<%-- jsp 注释--%>
在JSP转译的java文件中看到:
浏览器得到的HTML源码:
三. JSP 指令
JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。
指令可以有很多个属性,它们以键值对的形式存在,并用逗号隔开。
JSP中的三种指令标签:
指令 | 描述 |
---|---|
<%@ page … %> | 定义网页依赖属性, 比如脚本语言、error页面、缓存需求等等 |
<%@ include… %> | 包含其他文件 |
<%@ taglib… %> | 引入标签库的定义 |
示例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
属性 | 说明 |
---|---|
language | 指定JSP页面使用的脚本语言 |
import | 通过该属性来引用脚本语言中使用到的类文件 |
contentType | 用来指定HTML页面的MIME类型, 以及字符编码方式 |
单独使用jsp指令导包。如:
<%@page import="java.util.Date" %>
四. JSP语法
脚本程序
脚本程序可以包含任意量的Java语句、变量、方法或表达式,只要它们在脚本语言中是有效的。
脚本程序的语法格式:
<% 代码片段 %>
示例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<%
out.println("Hello World!");
%>
</body>
</html>
JSP声明
一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用。在JSP文件中,您必须先声明这些变量和方法然后才能使用它们。
JSP声明的语法格式:
<%! 变量或方法声明 %>
转译为java文件后, <%! %>中的声明将会类成员变量或类方法
示例:
<%!
int i = 0;
public void func(){}
%>
转译后的java文件:
JSP表达式
一个JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方。
由于表达式的值会被转化成String,所以您可以在一个文本行中使用表达式而不用去管它是否是HTML标签。
表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式。相当于在转译的servlet中调用了out.write(str)
JSP表达式的语法格式:
<%= 表达式 %>
示例:
<%= "hello world"%>
五. Web程序的常见状态码
状态码 | 类别 | 原因 |
---|---|---|
1XX | Informational(信息性状态码) | 接受的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
2XX : 成功
这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。
-
200 OK
请求已成功,请求所希望的响应头或数据体将随此响应返回。
3xx : 重定向
这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的Location域中指明。
- 301 Moved Permanetly
永久性重定向。该状态码表示请求的资源已经被分配了新的URI,以后应使用资源现在所指的URI。也就是说,如果已经把资源对应的URI保存为书签了,这时应该按照Location首部字段指示的URI重新保存。 - 303 See Other
该状态码表示由于请求对应的资源存在着另外一个URI,应该使用GET方法重定向获取请求的资源。
这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源。
4xx : 客户端错误
- 403 Forbidden
表明对请求资源的访问被服务器拒绝了。服务端并没有必要给出拒绝的详细理由,但如果想作出说明的花,可以在实体的主体部分对原因描述,这样用户就能看到了。 - 404 Not Found
表明服务器上无法找到请求的资源。除此之外,也可以在服务端拒绝请求且不想说明理由时使用。
5xxx : 服务器错误
- 500 Internal Server Error
该状态码表明服务器断在执行请求时发生了错误。也可能是Web应用存在的bug或某些临时的故障。 - 503 Service Unavailable
表明服务器暂时处于超负荷或正在停机维护的状态,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入Retry-After 首部再返还给客户端。
六. 请求转发和重定向
请求转发:
-
作用: 实现一次请求多个servlet联动操作处理请求,这摊避免了代码冗余,让servlet的职责更加明确
-
使用:
req.getRequestDispatcher("要转发的地址").forward(request, response);
getRequestDispatcher()的参数中接受要转发的地址(一个相对地址)
forward()的参数是当前页面中的request和response两个对象, 直接传递给下一个页面
-
特点: 一次请求,浏览器地址栏信息不改变
重定向:
-
作用:跳转到指定的url,解决了刷新会重复提交的问题,以及当前servlet无法处理的请求
-
使用:
response.sendRedirect(uri);
sendRedirect()的参数为重定向的地址(网址的绝对路径)
-
特点: 请求分为了两次,所以有两个servlet对象, 浏览器地址栏改变
-
使用时机:
- 如果请求中有表单数据,不能重复提交,则建议使用重定向
- 如果当前的servlet无法处理,需要发送给别的servlet处理
区别:
请求转发: 属于服务器端的行为 是由服务器内部来进行跳转的 如果服务器跳转了页面的地址 浏览器不知道 所以浏览器的地址还停留在上一个页面的地址上. 拿生活中的示例举例: 一个办理人去政府机关办理业务, 前台受理了他的业务, 但是办理的业务超过了前台的业务范围, 此时需要把业务转给机关内部的人员继续办理. 就这样, 经过机关内部的层层处理,盖章, 最终处理完成, 回到了办理人的手中, 但是办理人并不清楚这其中的业务逻辑. 这里的办理人就相当于我们的客户端浏览器, 而政府机关就是我们的服务器.
重定向:属于客户端行为 是由客户端来发起跳转请求的.还是拿上面的例子举例: 办理人政府机关办理业务, 但是前台受理后发现这个业务不是本机关的受理业务, 并通知办理人前往另一个政府机关去办理相应的业务, 于是办理人需要再次发起一次请求给另一个政府机关.
比较项 | 转发 | 重定向 |
---|---|---|
URL变化 | 否 | 是 |
重新发出请求 | 不会 | 会 |
是否携带请求 | 是 | 否 |
目标URL要求 | 仅本Web应用 | 任意URL |
注意:
- 重定向是客户端行为, 请求转发是服务器行为