概念:
简化 Servlet 编写的一种技术,将 Java 代码和 HTML 语句混合在同一个文件中编写,只对网页中的要动态产生的内容采用 Java 代码来编写,而对静态内容采用静态 HTML 的方式编写。
JSP 可以放在 WEB 应用程序中的除了 WEB-INF 及其子目录外的任何目录中,JSP 页面的访问路径与普通的 HTML 页面的访问路径形式也完全一样。
原理:
每个 JSP 页面在第一次被访问时,JSP 引擎将它翻译成一个 Servlet 源程序,接着把这个 Servlet 源程序编译成 Servlet 的 class 类文件,然后由 WEB 容器(Servlet 引擎)像调用普通 Servlet 程序一样的方式来装载和释放执行这个由 JSP 页面翻译成的 Servlet 程序。
使用:
在 webapp 里面新建一个 hello.jsp 文件:
在 body 标签内通过使用标签 <% 和 %> 来写 Java 代码,用 <% 标签作为起始标志,%> 标签作为结束标志,如图,重启 Tomcat,打开网页指向 hello.jsp 路径,控制台则打印当前时间。
注:
如果在 idea 识别不到 JSP 文件,在 settings 里面的 plugins 找到 JSP 打钩,然后重启 idea,如下操作
隐含的对象:
1、request:HttpServletRequest 的一个对象。
2、response:HttpServletRequest 的一个对象。(在 JSP 页面中一般不使用)
3、pageContext:页面的上下文,是 pageContext 的一个对象,可以从该对象中获取到其他隐含的对象,也可以从中获取到当前页面的其他信息。
4、session:代表浏览器和服务器的一次会话,是 HttpSession 的一个对象。
5、application:代表当前 WEB 应用是 ServletContext 对象。
6、config:当前 JSP 对应的 Servlet 的 ServletConfig 对象(几乎不使用)
7、out:JspWrite 对象,调用 out.println() 可以直接把字符串打印到浏览器上。
8、page:指向当前 JSP 对应的 Servlet 对象的引用,为 object 类型,只能调用 object 的类方法。(几乎不使用)
9、exceptiion:当前只有设置 isErrorPage 为 true 才能使用的异常对象
若需要访问当前 JSP 配置的初始化参数,需要通过映射的地址才可以,如下操作:
在 web.xml 文件里配置你当前的 JSP 初始化参数:
然后在 JSP 文件里直接获取:
JSP 表达式:
两种打印日期的方式是一样的。
JSP 脚本片段:
指在 <% 和 %> 之中的一条或多条 Java 程序代码,多个脚本片段中的代码可以相互访问。
跟属性相关的方法:
(1):
setAttribute(String name, object o):设置属性
Object getAttribute(String name):获取指定的属性
Enumeration getAttrbuteNames():获取所有的属性的名字组成的 Enumeration 对象
removeAttribute(String name):移除指定的属性
(2):
pageContext、request、session、application 对象都有这些方法,这四个对象也称为域对象。
pageContext:属性的作用范围仅限于当前 JSP 页面
request:属性作用范围仅限于同一个请求
session:属性的作用范围限于一次会话:浏览器打开直到关闭称之为一次会话(在此期间会话不失效)
application:属性的作用范围限于当前 WEB 应用。是范围最大的属性作用范围,只要被一次设置属性,在其他各处的 JSP 或 Servlet 中都可以获取到。
请求的转发和重定向:
区别:
1、转发只发出一次请求,而重定向则发出两次请求。
2、转发的地址栏是初次发出请求的地址,而重定向的地址栏是最终相应的地址。
3、对于转发,在最终的 Servlet 中,request 对象和中转的那个 request 是同一个对象,而重定向则不是同一个对象。
4、转发只能请求当前 WEB 应用内的资源,而重定向可以请求任何资源。
使用:
转发:
1、调用 HttpServletRequest 的 getRequestDispatcher() 方法获取 RequestDispatcher 对象,并传入要转发的地址参数。
2、HttpServletRequest 的 forward(req, resp) 进行请求的转发。
重定向:
直接调用 resp.sendRedirect(path) 方法,并传入要重定向的地址。
JSP 中的转发和重定向直接使用内置对象 request 和 response。
JSP 指令:
它是为 JSP 对象引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理 JSP 页面中的其余部分。
目前的 JSP 定义了 page、include 和 tablib 三种指令。
page 指令:
1、page 指令用于定于 JSP 页面的各种属性,无论 page 指令出现在 JSP 页面中的什么地方,它作用的都是整个 JSP 页面,通常 page 指令放在 JSP 页面的起始位置
2、page 指令常用属性:
import 属性:指定当前 JSP 页面对应的 Servlet 需要导入的类
比如:<%@ page import="java.util.Date" %>
session 属性:取值为 true 或 false,指定当前页面的 session 对象是否隐藏,如果为 true 则隐藏,session 对象不可用,反之可用。
如图,如果指定隐藏,而继续使用,系统则报错,因为找不到 session 对象。
errorPage 和 isErrorPage:
errorPage 指定当前页面出现错误时,转发到指定的页面
isErrorPage 指定当前页面是否为错误页面
两者配合使用:
在 hello.jsp 页面上指定错误页面,并运行一段错误代码。
在 error.jsp 指定当前页面为错误页面,并在页面上使用 exception 对象打印错误信息。
注:如果没有指定 isErrorPage 为 true 的话,exception 对象是无法使用的。
运行结果:
地址栏的地址没有变化,而页面上显示的是错误信息,可以得出,响应错误页面的本质是请求的转发。
对于 Tomcat 服务器来说,WEB-INF 下的文件是不能通过浏览器直接访问的,但通过请求的转发时可以的。
还可以在 web.xml 里面配置错误信息和错误跳转的页面:
把错误的页面 JSP 放在 WEB-INF 里面:
在 web.xml 里配置,error-code 指定错误的代码,location 指定响应页面的位置,或者指定异常跳转到页面:
contentType:指定当前 JSP 页面的响应类型,实际调用的是 response.setContentType(" text/html ; charset = UTF-8")。
pageEncoding:指定当前 JSP 页面的字符编码,通常情况下该值和 contentType 的 charset 一致。
isELIgnored:指定当前 JSP 页面是否可以使用 EL 表达式,通常取值为 true。
include 指令:
用于通知 JSP 引擎在翻译当前 JSP 页面时将其他文件中的内容合并到当前 JSP 页面转换成 Servlet 源文件中,这种源文件级别进行引入的方式称之为静态引入,当前 JSP 页面与静态引入的页面紧密结合为一个 Servlet
使用:
在页面 hello.jsp 里面包含 index.jsp,运行结果:
网页同时输出两个页面的内容。
注:file 属性的值必须使用相对路径
如果在 hello 页面里定义一个变量,通过 include 引入 index 页面,在 index 页面里面可以直接使用 hello 页面定义的变量。
jsp:include 标签:
语法:<jsp:include page="index.jsp"></jsp:include>
概念:动态引入,并不是像 include 指令生成一个 Servlet 源文件,而是生成两个 Servlet 源文件,然后通过一个方法的方式把目标页面包含进来。
jsp:forward 标签:
语法:<jsp:forward page="index.jsp"></jsp:forward>
概念:当前页面转发到指定页面,使用 jsp:forward 可以使用 jsp:param 子标签向 index.jsp 传入参数。同样,jsp:include 也可以使用子标签。目标函数使用 request.getParameter 来接收。
hello.jsp 转发时,传入参数。
index.jsp 接收参数。
中文乱码:
1、在 JSP 页面上输入中文,为了请求页面后不出现乱码,需要保证 contentType="text/html;charset=UTF-8",pageEncoding="UTF-8" charset 和 pageEncoding 的编码一致,且都支持中文,通常建议取值为 UTF-8,还需保证浏览器的显示的字符编码也和请求的 JSP 页面的编码一致
2、获取中文参数值:默认参数在传输过程中使用的编码为 ISO-8859-1
对于 POST 请求:只要在获取请求参数前调用 request.setCharacterEncoding("UTF-8") 即可。
对于 GET 请求:
可以通过修改 Tomcat 的 server.xml 文件的方式,如下图所示,
或者通过以下方式获取:
以上为本人的一些学习笔记,如有出错欢迎指正,陆续更新!!!