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九大内置对象

对象描述
requestHttpServletRequest类的实例
responseHttpServletResponse类的实例
outPrintWriter类的实例,用于把结果输出至网页上
sessionHttpSession类的实例
applicationServletContext类的实例,与应用上下文有关
configServletConfig类的实例
pageContextPageContext类的实例,提供对JSP页面所有对象以及命名空间的访问
page类似于Java类中的this关键字
ExceptionException类的对象,代表发生错误的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

常见状态码

状态码消息描述
200OK请求被确认
300Multiple Choices一个超链接表,用户可以选择一个超链接并访问,最大支持5个超链接
400Bad Request服务器无法识别请求
402Payment Required目前还不能使用此状态码
403Forbidden禁止访问所请求的页面
404Not Found服务器无法找到所请求的页面
500Internal Server Error请求不完整,服务器遇见了出乎意料的状况
502Bad Gateway请求不完整,服务器从上游服务器接受了一个无效的响应
503Service Unavailable请求不完整,服务器暂时重启或关闭
504Gateway Timeout网关超时
505HTTP 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联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐