javaWeb学习笔记(三)
1、JSP概述
JSP起源
1.在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变。
2.如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序代码产生,整个Servlet程序的代码将非常臃肿,编写和维护都将非常困难。
3.对大量静态内容的美工设计和相关HTML语句的编写,并不是程序员所要做的工作,程序员对此也不一定在行。网页美工设计和制作人员不懂Java编程,更是无法来完成这样的工作。
4.为了弥补 Servlet 的缺陷,SUN公司在Servlet的基础上推出了JSP(Java Server Pages)技术作为解决方案。
5.JSP是简化Servlet编写的一种技术,它将Java代码和HTML语句混合在同一个文件中编写,只对网页中的要动态产生的内容采用Java代码来编写,而对固定不变的静态内容采用普通静态HTML页面的方式编写。
建立对JSP的直观认识
1.JSP页面是由HTML语句和嵌套在其中的Java代码组成的一个普通文本文件,JSP 页面的文件扩展名必须为.jsp。
2.在JSP页面中编写的Java代码需要嵌套在<%和%>中,嵌套在<%和%>之间的Java代码被称之为脚本片段(Scriptlets),没有嵌套在<%和%>之间的内容被称之为JSP的模版元素。
3.JSP中的Java代码可以使用out.println语句将其他Java程序代码产生的结果字符串输出给客户端,也可以使用System.out.println语句将它们打印到命令行窗口。
4.JSP文件就像普通的HTML文件一样,它们可以放置在WEB应用程序中的除了WEB-INF及其子目录外的其他任何目录中,JSP页面的访问路径与普通HTML页面的访问路径形式也完全一样。
5.在JSP页面中也可以使用一种称之为JSP表达式的元素,只需将要输出的变量或表达式直接封装在<%= 和 %>之中,就可以向客户端输出这个变量或表达式的运算结果。在JSP表达式中嵌套的变量或表达式后面不能有分号。
JSP与Servlet的应用比较
1.JSP是一种以产生网页显示内容为中心的WEB开发技术,它可以直接使用模版元素来产生网页文档的内容。
2.JSP页面的源文件要比Servlet源文件简单,并且JSP页面的开发过程要比Servlet的开发过程简单得多。
3.JSP引擎可以对JSP页面的修改进行检测,并自动重新翻译和编译修改过的JSP文件。
4.JSP技术是建立在Servlet技术基础之上的,所有的JSP页面最终都要被转换成Servlet来运行。
5.在大型WEB应用程序的开发中,Servlet与JSP经常要混合使用,各司其职,Servlet通常用作控制组件,并处理一些复杂的后台业务,JSP则作为显示组件。
6.一次响应过程可以划分成几个功能模块来协同完成,首先由Servlet完成流程控制和业务处理,并将结果数据存储在request或session域中,然后将请求转发(forward)到JSP页面,再由JSP页面从request或session域中取出结果数据并完成响应内容的输出。通过这种方式实现业务逻辑与显示内容的分离,从而将应用程序开发者和网页作者的工作分离。
2.JSP影式对象
一共有九个JSP的影式对象:
request, response, pageContext, session, application, config, out, page, exception。
具体的看下面视频中的笔记,更加详细。
3.JSP语法
JSP基本语法
-
JSP模版元素 (JSP页面中的静态HTML内容)
-
JSP表达式 (JSP表达式(expression)提供了将一个java变量或表达式的计算结果输出到客户端的简化方式,它将要输出的变量或表达式直接封装在<%= 和 %>之中。)
-
JSP脚本片断 (SP脚本片断(scriptlet)是指嵌套在<% 和 %>之中的一条或多条Java程序代码。 )
在JSP脚本片断中,可以定义变量、执行基本的程序运算、调用其他Java类、访问数据库、访问文件系统等普通Java程序所能实现的功能。
在JSP脚本片断可以直接使用JSP提供的隐式对象来完成WEB应用程序特有的功能。
JSP脚本片断中的Java代码将被原封不动地搬移进由JSP页面所翻译成的Servlet的_jspService方法中,所以,JSP脚本片断之中只能是符合Java语法要求的程序代码,除此之外的任何文本、HTML标记、其他JSP元素都必须在脚本片断之外编写。
JSP脚本片断中的Java代码必须严格遵循Java语法,例如,每条命令执行语句后面必须用分号(;)结束。
在一个JSP页面中可以有多个脚本片断(每个脚本片断代码嵌套在各自独立的一对<% 和 %>之间),在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。
举例:
<% int x = 3; %>这是一个HTML段落
<% out.println(x); %>多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。
举例:比如上面的JSP代码单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句,例如,涉及条件和循环处理时,多个脚本片断及其他元素组合的结果必须能形成完整的条件和循环控制语句。
-
EL表达式
-
JSP注释
-
特殊字符序列的转义处理
-
如何查找JSP页面中的错误
4.域对象的属性操作
关于属性相关的方法:
- void setAttribute(String name, Object o): 创建一个属性
- Object getAttribute(String name): 获取指定的属性
- Enumeration getAttributeNames(): 获取所有的属性的名字组成的 Enumeration 对象
- removeAttribute(String name): 移除指定的属性
共有四个域对象:
- pageContest(属性的作用范围仅限于当前JSP页面。每次创建一个页面都有一个)
- request (属性的作用范围仅限于同一个请求。比如刷新页面,点击按钮。)
- session (属性的作用范围限于一次回话: 浏览器打开直到关闭称之为一次回话。在此期间回话不失效)
- application (属性的作用范围限于当前 WEB 应用。是范围最大的属性作用范围,只要在一处设置属性,在其他各处的 JSP 或 Servlet 中都可以获取到。)
//.testAttr1.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
pageContext.setAttribute("pageContextAttr", "pageContextValue");
request.setAttribute("requestAttr", "requestValue");
session.setAttribute("sessionAttr", "sessionValue");
application.setAttribute("applicationAttr", "applicationValue");
%>
<h2>Attr 1 Page</h2>
<br><br>
pageContextAttr: <%= pageContext.getAttribute("pageContextAttr") %>
<br><br>
requestAttr: <%= request.getAttribute("requestAttr") %>
<br><br>
sessionAttr: <%= session.getAttribute("sessionAttr") %>
<br><br>
applicationAttr: <%= application.getAttribute("applicationAttr") %>
<br><br>
<a href="attr_2.jsp">to Attr_2 Page</a>
</body>
</html>
5.请求的转发和重定向
1.RequestDispatcher接口
2.用forward方法实现请求转发
3.请求转发的运行流程
4.用sendRedirect方法实现请求重定向
5.请求重定向的运行流程
6.请求重定向与请求转发的比较
请求重定向与请求转发的比较
1.RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
2.如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
3.调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
4.HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
5.RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。
6.JSP指令
6.1.Page指令
6.2include指令
include指令用于通知JSP引擎在翻译当前JSP页面时将其他文件中的内容合并进当前JSP页面转换成的Servlet源文件中,这种在源文件级别进行引入的方式称之为静态引入,当前JSP页面与静态引入的页面紧密结合为一个Servlet。
语法:
<%@ include file=“relativeURL”%>
其中的file属性用于指定被引入文件的相对路径。
细节:
被引入的文件必须遵循JSP语法,其中的内容可以包含静态HTML、JSP脚本元素、JSP指令和JSP行为元素等普通JSP页面所具有的一切内容。
被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。
在将JSP文件翻译成Servlet源文件时,JSP引擎将合并被引入的文件与当前JSP页面中的指令元素(设置pageEncoding属性的page指令除外),所以,除了import和pageEncoding属性之外,page指令的其他属性不能在这两个页面中有不同的设置值。
7.JSP标签
JSP标签有三种:
-
jsp:include标签
jsp:include标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中, 这种在JSP页面执行时的引入方式称之为动态引入。 -
jsp:forward标签
jsp:forward标签用于把请求转发给另外一个资源。 -
jsp:param标签
当使用jsp:include和jsp:forward标签引入或将请求转发给的资源是一个能动态执行的程序时,例如Servlet和JSP页面,那么,还可以使用jsp:param标签向这个程序传递参数信息。
下面的图片,第一种是静态引入,第二种是动态引入。
8.JSP中文乱码
视频中的笔记