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>

三个脚本

  1. 声明脚本
    声明类属性
    <%! 
        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;
        }
    %>
    
  2. 表达式脚本
    • 所有的表达式脚本都会被翻译到_jspService()方法中
    • 表达式脚本都会被翻译成为out.print()输出到页面上
    • 由于表达式脚本翻译的内容都在_jspService()方法中,所以_jspService()方法中的对象都可以直接使用
    • 表达式脚本中的表到时不能以分号结束。
    <%=12 %>    输出整型
    <%=12.12  %>  输出浮点型
    <%="我是字符串" %>   输出字符串
    <%=map %>   输出对象
    
  3. 代码脚本
    <% 
        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注释

  1. html注释
    <!-- 注释 -->    HTML注释,通过浏览器查看网页源代码时可以看见注释内容
    
  2. java注释
    // 单行java注释
    /*多行注释*/  
    
  3. 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是无状态协议,这意味着每次客户端检索网页时,都要单独打开一个服务器连接,因此服务器不会记录下先前客户端请求的任何信息。

有三种方法来维持客户端与服务器的会话:

  1. Cookies
    • 网络服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求。
    • 这可能不是一种有效的方式,因为很多时候浏览器并不一定支持cookie,所以不建议使用这种方法来维持会话。
  2. 隐藏表单域
    • 一个网络服务器可以发送一个隐藏的HTML表单域和一个唯一的session ID,
    <input type="hidden" name="sessionid" value="12345">
    
    • 这个条目意味着,当表单被提交时,指定的名称和值将会自动包含在GET或POST数据中。每当浏览器发送一个请求,session_id的值就可以用来保存不同浏览器的轨迹。
    • 这种方式可能是一种有效的方式,但点击标签中的超链接时不会产生表单提交事件,因此隐藏表单域也不支持通用会话跟踪。
  3. 重写URL
    • 可以在每个URL后面添加一些额外的数据来区分会话,服务器能够根据这些数据来关联session标识符。
    • 举例来说,http://w3cschool.cc/file.htm;sessionid=12345, session标识符为sessionid=12345,服务器可以用这个数据来识别客户端。
    • 相比而言,重写URL是更好的方式来,就算浏览器不支持cookies也能工作,但缺点是您必须为每个URL动态指定session ID,就算这是个简单的HTML页面。
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐