Jsp 个人笔记
JSPJSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。JSP通过网页表单获取用户输入数据、访问数据
JSP
JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。
jsp的本质是什么
当我们第一次访问jsp页面的时候。Tomcat服务器会帮我么把jsp页面翻译成为一个java源文件。并且对它进行编译称为.class字节码程序。我们打开java源文件不难发现里面的内容是:
jsp语法
脚本程序可以包含任意量的Java语句、变量、方法或表达式,只要它们在脚本语言中是有效的。
脚本程序的语法格式:
<% 代码片段 %>
<html>
<head><title>Hello World</title></head>
<body>
<%
out.println("Hello World! ");
%>
</body>
</html>
三个脚本
- 声明脚本
声明类属性 <%! private Integer id; private static Map<String, Object> map; %> 声明static静态代码块 <%! static{ map = new HashMap<String, Object>(); map.put("key1", "value1"); map.put("key2", "value2"); } %> 声明类方法 <%! public int abc(){ return 12; } %>
- 表达式脚本
- 所有的表达式脚本都会被翻译到_jspService()方法中
- 表达式脚本都会被翻译成为out.print()输出到页面上
- 由于表达式脚本翻译的内容都在_jspService()方法中,所以_jspService()方法中的对象都可以直接使用
- 表达式脚本中的表到时不能以分号结束。
<%=12 %> 输出整型 <%=12.12 %> 输出浮点型 <%="我是字符串" %> 输出字符串 <%=map %> 输出对象
- 代码脚本
<% java 语句 %>
- 代码脚本翻译之后都在_jspService()方法中
- 代码脚本由于翻译到_jspService()方法中,所以在_jspService()中的现有对象都可以直接使用
- 还可以由多个代码脚本组合完成一个完成的java语句。
for(int i=0; i<10; i++){ System.out.println(i); } %>
<% int i=13; if(i == 12){ %> <h1>hello world</h1> <% }else{ %> <h1>135463</h1> <% } %>
中文编码问题
如果我们要在页面正常显示中文,我们需要在 JSP 文件头部添加以下代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
JSP注释
- html注释
<!-- 注释 --> HTML注释,通过浏览器查看网页源代码时可以看见注释内容
- java注释
// 单行java注释 /*多行注释*/
- jsp注释
<%-- 注释 --%> JSP注释,注释内容不会被发送至浏览器甚至不会被编译
JSP 指令
JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。
<%@ directive attribute="value" %>
指令 | 描述 |
---|---|
<%@ page … %> | 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include … %> | 包含其他文件 |
<%@ taglib … %> | 引入标签库的定义 |
Page指令
Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。
<%@ page attribute="value" %>
等价的XML格式:
<jsp:directive.page attribute="value" />
属性
属性 | 描述 |
---|---|
language | 定义JSP页面所用的脚本语言,默认是Java |
contentType | 指定当前JSP页面的MIME类型和字符编码 |
pageEncoding | 表示当前jsp页面文件本身的字符集 |
import | 跟java源代码中一样,用于导包,导类。 |
autoFlush | 控制out对象的 缓存区 |
buffer | 指定out对象使用缓冲区的大小,,默认是8kb |
isErrorPage | 指定当前页面是否可以作为另一个JSP页面的错误处理页面,默认是false |
ErrorPage | 设置当jsp页面运行时出错,自动跳转去的错误页面路径 |
session | 指定JSP页面是否使用session,默认是true |
extends | 指定servlet从哪一个类继承 |
JSP八个动作指令
与JSP指令元素不同的是,JSP动作元素在请求处理阶段起作用。JSP动作元素是用XML语法写成的。
利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。
动作元素只有一种语法,它符合XML标准:
<jsp:action_name attribute="value" />
语法 | 描述 |
---|---|
jsp:include | 在页面被请求的时候引入一个文件。 |
jsp:useBean | 寻找或者实例化一个JavaBean。 |
jsp:setProperty | 设置JavaBean的属性。 |
jsp:getProperty | 输出某个JavaBean的属性。 |
jsp:forward | 把请求转到一个新的页面。 |
jsp:plugin | 根据浏览器类型为Java插件生成OBJECT或EMBED标记。 |
jsp:element | 定义动态XML元素 |
jsp:attribute | 设置动态定义的XML元素属性。 |
jsp:body | 设置动态定义的XML元素内容。 |
jsp:text | 在JSP页面和文档中使用写入文本的模板 |
jsp九大内置对象
对象 | 描述 |
---|---|
request | HttpServletRequest类的实例 |
response | HttpServletResponse类的实例 |
out | PrintWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
page | 类似于Java类中的this关键字 |
Exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
request对象
request对象是javax.servlet.http.HttpServletRequest 类的实例。每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象来代表这个请求。
request对象提供了一系列方法来获取HTTP头信息,cookies,HTTP方法等等。
JSP 客户端请求
当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信息头的一部分来传送的。
https://www.runoob.com/jsp/jsp-client-request.html
JSP 服务器响应
Response响应对象主要将JSP容器处理后的结果传回到客户端。可以通过response变量设置HTTP的状态和向客户端发送数据,如Cookie、HTTP文件头信息等。
https://www.runoob.com/jsp/jsp-server-response.html
JSP HTTP 状态码
https://www.runoob.com/jsp/jsp-http-status-codes.html
常见状态码
状态码 | 消息 | 描述 |
---|---|---|
200 | OK | 请求被确认 |
300 | Multiple Choices | 一个超链接表,用户可以选择一个超链接并访问,最大支持5个超链接 |
400 | Bad Request | 服务器无法识别请求 |
402 | Payment Required | 目前还不能使用此状态码 |
403 | Forbidden | 禁止访问所请求的页面 |
404 | Not Found | 服务器无法找到所请求的页面 |
500 | Internal Server Error | 请求不完整,服务器遇见了出乎意料的状况 |
502 | Bad Gateway | 请求不完整,服务器从上游服务器接受了一个无效的响应 |
503 | Service Unavailable | 请求不完整,服务器暂时重启或关闭 |
504 | Gateway Timeout | 网关超时 |
505 | HTTP Version Not Supported | 服务器不支持所指定的HTTP版本 |
设置HTTP状态码的方法
下表列出了HttpServletResponse 类中用来设置状态码的方法:
方法 | 描述 |
---|---|
public void setStatus(int statusCode) | 此方法可以设置任意的状态码。如果您的响应包含一个特殊的状态码和一个文档,请确保在用PrintWriter返回任何内容前调用setStatus方法 |
public void sendRedirect(String url) | 此方法产生302响应,同时产生一个 Location 头告诉URL 一个新的文档 |
public void sendError(int code, String message) | 此方法将一个状态码(通常为 404)和一个短消息,自动插入HTML文档中并发回给客户端 |
JSP 表单处理
GET 方法
GET方法将请求的编码信息添加在网址后面,网址与编码信息通过"?"号分隔。
http://www.runoob.com/hello?key1=value1&key2=value2
GET方法是浏览器默认传递参数的方法,一些敏感信息,如密码等建议不使用GET方法。
用get时,传输数据的大小有限制 (注意不是参数的个数有限制),最大为1024字节。
POST 方法
一些敏感信息,如密码等我们可以通过POST方法传递,POST提交数据是隐式的。
POST提交数据是不可见的,GET是通过在url里面传递的
JSP使用getParameter()来获得传递的参数,getInputStream()方法用来处理客户端的二进制数据流的请求。
JSP 读取表单数据
- getParameter(): 使用 request.getParameter() 方法来获取表单参数的值。
- getParameterValues(): 获得如checkbox类(名字相同,但值有多个)的数据。 接收数组变量 ,如checkbox类型
- getParameterNames():该方法可以取得所有变量的名称,该方法返回一个 Enumeration。
- getInputStream():调用此方法来读取来自客户端的二进制数据流。
JSP 过滤器
JSP 和 Servlet 中的过滤器都是 Java 类。
过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。
可以将一个或多个过滤器附加到一个 Servlet 或一组 Servlet。过滤器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 页面。
过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:
- 在客户端的请求访问后端资源之前,拦截这些请求。
- 在服务器的响应发送回客户端之前,处理这些响应。
根据规范建议的各种类型的过滤器:
- 身份验证过滤器(Authentication Filters)。
- 数据压缩过滤器(Data compression Filters)。
- 加密过滤器(Encryption Filters)。
- 触发资源访问事件过滤器。
- 图像转换过滤器(Image Conversion Filters)。
- 日志记录和审核过滤器(Logging and Auditing Filters)。
- MIME-TYPE 链过滤器(MIME-TYPE Chain Filters)。
- 标记化过滤器(Tokenizing Filters)。
- XSL/T 过滤器(XSL/T Filters),转换 XML 内容。
JSP Cookie 处理
Cookie 是存储在客户机的文本文件,它们保存了大量轨迹信息。在 Servlet 技术基础上,JSP 显然能够提供对 HTTP cookie 的支持。
通常有三个步骤来识别回头客:
- 服务器脚本发送一系列 cookie 至浏览器。比如名字,年龄,ID 号码等等。
- 浏览器在本地机中存储这些信息,以备不时之需。
- 当下一次浏览器发送任何请求至服务器时,它会同时将这些 cookie 信息发送给服务器,然后服务器使用这些信息来识别用户或者干些其它事情。
Cookie 剖析
Cookie 通常在 HTTP 信息头中设置(虽然 JavaScript 能够直接在浏览器中设置 cookie)。在 JSP 中,设置一个 cookie 需要发送如下的信息头给服务器:
HTTP/1.1 200 OK
Date: Fri, 04 Feb 2015 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
//一个键值对,一个GMT(格林尼治标准)时间,一个路径,一个域名
Set-Cookie: name=runoob; expires=Friday, 04-Feb-17 22:03:38 GMT;
path=/; domain=runoob.com
Connection: close
Content-Type: text/html
使用 JSP 设置 cookie
(1)创建一个 cookie 对象: 调用 cookie 的构造函数,使用一个 cookie 名称和值做参数,它们都是字符串。
Cookie cookie = new Cookie("key","value");
请务必牢记,名称和值中都不能包含空格或者如下的字符:
[ ] ( ) = , " / ? @ : ;
(2) 设置有效期:调用 setMaxAge() 函数表明 cookie 在多长时间(以秒为单位)内有效。下面的操作将有效期设为了 24 小时。
cookie.setMaxAge(60*60*24);
(3) 将 cookie 发送至 HTTP 响应头中:调用 response.addCookie() 函数来向 HTTP 响应头中添加 cookie。
response.addCookie(cookie);
JSP Session
HTTP是无状态协议,这意味着每次客户端检索网页时,都要单独打开一个服务器连接,因此服务器不会记录下先前客户端请求的任何信息。
有三种方法来维持客户端与服务器的会话:
- Cookies
- 网络服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求。
- 这可能不是一种有效的方式,因为很多时候浏览器并不一定支持cookie,所以不建议使用这种方法来维持会话。
- 隐藏表单域
- 一个网络服务器可以发送一个隐藏的HTML表单域和一个唯一的session ID,
<input type="hidden" name="sessionid" value="12345">
- 这个条目意味着,当表单被提交时,指定的名称和值将会自动包含在GET或POST数据中。每当浏览器发送一个请求,session_id的值就可以用来保存不同浏览器的轨迹。
- 这种方式可能是一种有效的方式,但点击标签中的超链接时不会产生表单提交事件,因此隐藏表单域也不支持通用会话跟踪。
- 重写URL
- 可以在每个URL后面添加一些额外的数据来区分会话,服务器能够根据这些数据来关联session标识符。
- 举例来说,http://w3cschool.cc/file.htm;sessionid=12345, session标识符为sessionid=12345,服务器可以用这个数据来识别客户端。
- 相比而言,重写URL是更好的方式来,就算浏览器不支持cookies也能工作,但缺点是您必须为每个URL动态指定session ID,就算这是个简单的HTML页面。
更多推荐
所有评论(0)