使用jsp的原因:
Servlet的缺点:
Servlet技术:
• 缺点:不适合设置html响应体,需要大量的response.getWriter().print("<html>")
• 优点:动态资源,可以编程。l html技术:
• 缺点:html是静态页面,不能包含动态信息
• 优点:不用为输出html标签而发愁
jsp(java server pages):
优点:在原有html的基础上添加java脚本,构成jsp页面。
JSP简介:
JSP(Java Server Pages)与Java Servlet一样,是在服务器端执行的
•不同的是先由服务器编译部署成Servlet执行
JSP的组成
•jsp = html + java脚本 + jsp标签(指令)
•jsp中无需创建即可使用的对象一共有9个,被称之为9大内置对象。例如:request对象、out对象
JSP的脚本元素
•<%...%>:java代码片段(常用)
•<%=...%>:java表达式,用于输出(常用)
•<%!...%>:声明,用来创建类的成员变量和成员方法(基本不用,但容易被考到)
JSP 脚本元素:
<%! %>:这里面的代码相当于java中的全局变量或方法声明和赋值
<% %>:在里面的代码相当于java中的println输出内容
<% %>:在里面的代码相当于java的局部变量和java程序代码。
Declaration(声明):
l声明的格式: <%! 声明1;[声明2];……%>
l声明的作用范围是整个JSP页面,同时它只在一个JSP页面有效
l声明的类型包括:变量,方法,类
Jsp的注释:
存在下面的两种注释方法:
JSP注释:<%-- … --%>,转化阶段消失,只能被开发人员看到
JAVA注释://、/**/、/***/,编译阶段消失
HTML注释:<!-- … -->, 不会消失,在页面中也能看到
注意:在Jsp中的注释我们推荐使用Jsp的注释方法,因为很多情况下,如果我们的Jsp代码中含有Jsp的标签,那么使用html注释该标签将会不起作用。
Expression(表达式):
l语法格式
•<%= 变量或表达式 %>
l表达式的计算结果转换成字符串
•使用隐含对象out进行输出
l范例
•<%=“abc” %> 等价于 out.print(“abc”);
lJSP脚本表达式中的变量或表达式后面不能有分号(;)
Scriptlets(代码块):
l语法格式
•<% java code %>
l在“<%”和”%>”之间插入java程序片,一个JSP页面可以有许多程序片,这些代码块将被JSP服务器按照顺序执行
在一个代码块中声明的变量是JSP页面的局部变量,只在当前页面有效
JSP的运行原理:
ljsp其实是一种特殊的Servlet
l > 当jsp页面第一次被访问时,服务器会把jsp编译成java文件(这个java其实是一个servlet类)
l > 然后再把java编译成.class
l > 然后创建该类对象
l > 最后调用它的service()方法
l > 第二次请求同一jsp时,直接调用service()方法。
JSP程序的翻译过程:
JSP与Servlet的分工:
一个例子
jiaServlet.java:
package cn.itcast.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 处理求和的操作
* @author Administrator
*
*/
public class JiaServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 1.获取请求参数
* 2.求和
* 3.使用转发或者重定向到成功页面
*/
// 获取请求参数
String num1 = request.getParameter("num1");
String num2 = request.getParameter("num2");
int num11 = Integer.parseInt(num1);
int num22 = Integer.parseInt(num2);
int result = num11 + num22;
// 找到成功的页面
// 使用重定向或者转发
request.setAttribute("result", result);
// 只能使用转发了(/jsp/he.jsp)
request.getRequestDispatcher("/jsp/he.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
he.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Integer result = (Integer)request.getAttribute("result");
%>
<h3>显示成功的结果:<%= result %> </h3>
</body>
</html>
jia.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/day11/jia" method="post">
整数1:<input type="text" name="num1" /><br/>
整数2:<input type="text" name="num2" /><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
JSP
•作为请求发起页面,例如显示表单、超链接。
•作为请求结束页面,例如显示数据。
lServlet
•作为请求中处理数据的环节。
jsp三大指令:
page
page指令标记:
page属性包含在“<%@ page ”和“%>”之间。
<%@page language=”java” info=”xxx”…%>**
这些属性可以单独使用,也可以几个或多个同时使用
page指令用来定义JSP文件的全局属性
在JSP页面中,只有import可以出现多次,其它属性都只能出现一次
page指令标记:
pageEncoding和contentType:
pageEncoding:它指定当前jsp页面的编码,只要不说谎,就不会有乱码!在服务器要把jsp编译成.java时需要使用pageEncoding!
contentType:它表示添加一个响应头:Content-Type!等同与response.setContentType(“text/html;charset=utf-8”);
如果两个属性只提供一个,那么另一个的默认值为设置那一个。
如果两个属性都没有设置,那么默认为iso
import:导包!可以出现多次
errorPage和isErrorPage
errorPage:当前页面如果抛出异常,那么要转发到哪一个页面,由errorPage来指定
isErrorPage:它指定当前页面是否为处理错误的页面!当该属性为true时,这个页面会设置状态码为500!而且这个页面可以使用9大内置对象中的exception!
<error-page>有两种使用方式:
<error-code>和<location>子元素;
<exception-type>和<location>子元素;
其中<error-code>是指定响应码;<location>指定转发的页面;<exception-type>是指定抛出的异常类型。
在web.xml中配置
<error-page>
<error-code>404</error-code>
<location>/error/errorPage.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.RuntimeException</exception-type>
<location>/index.jsp</location>
</error-page>
autoFlush和buffer
autoFlush:指定jsp的输出流缓冲区满时,是否自动刷新!默认为true,如果为false,那么在缓冲区满时抛出异常!
buffer:指定缓冲区大小,默认为8kb,通常不需要修改!
isELIgnored:是否忽略el表达式,默认值为false,不忽略,即支持!
(以下了解即可):
language:指定当前jsp编译后的语言类型,默认值为java。
info:信息!
isThreadSafe:当前的jsp是否支持并发访问!
session:当前页面是否支持session,如果为false,那么当前页面就没有session这个内置对象!
extends:让jsp生成的servlet去继承该属性指定的类!
include –> 静态包含:
与RequestDispatcher的include()方法的功能相似!他们共同生成一个java(就是一个servlet)文件,然后再生成一个class!
RequestDispatcher的include()是一个方法,包含和被包含的是两个servlet,即两个.class!他们只是把响应的内容在运行时合并了!
linclude指令的语法格式如下
•<%@ include file=“filename” %>
linclude指令的作用是在JSP页面中静态包含一个文件,同时由JSP解析包含的文件内容
作用:把页面分解了,使用包含的方式组合在一起,这样一个页面中不变的部分,就是一个独立jsp,而我们只需要处理变化的页面。
l静态包含的含义
•file不能为一变量
•<% String url="index.html" ; %>
•<%@ include file = "<%= url %>" %>
•不可以在file 所指定的文件后接任何参数
•<%@ include file = "jw.jsp?nm=browser" %>
静态包含举例:
l包含的是目标文件的源码;包含过来,一起翻译
lmain.jsp
<%
String s = “abc”;
%>
<%include file=“part.jsp” %>
part.jsp
<%=s %> 没有定义变量s
尽管part.jsp本身会有错误
但是运行main.jsp就可以正确引入part.jsp
taglib –> 导入标签库:
两个属性:
prefix:指定标签库在本页面中的前缀!由我们自己来起名称!
uri: 指定标签库的位置!
<%@taglib prefix=”s” uri=”/struts-tags”%> 前缀的用法<s:text>
九大内置对象:
在jsp中无需声明即可直接使用的9个对象
out(JspWriter):等同与response.getWriter(),用来向客户端发送文本数据;
config(ServletConfig):对应“真身”中的ServletConfig;
page(当前JSP的真身类型):当前JSP页面的“this”,即当前对象,引用为Object类型;
pageContext(PageContext):页面上下文对象,它是最后一个没讲的域对象;
exception(Throwable):只有在错误页面中可以使用这个对象;
request(HttpServletRequest):即HttpServletRequest类的对象;
response(HttpServletResponse):即HttpServletResponse类的对象;
application(ServletContext):即ServletContext类的对象;
session(HttpSession):即HttpSession类的对象,不是每个JSP页面中都可以使用,如果在某个JSP页面中设置<%@page session=”false”%>,说明这个页面不能使用session。
pageContext(一个顶9个!)
Servlet中有三大域,而JSP中有四大域!
ServletContext:整个应用程序
session:整个会话(一个会话中只有一个用户)
request:一个请求链!
pageContext:一个jsp页面!这个域是在当前jsp页面和当前jsp页面中使用的标签之间共享数据!
域对象
代理其他域:pageContext.setAttribute(“xxx”, “XXX”, PageContext.SESSION_SCOPE);
全域查找:pageContext.findAttribute(“xxx”);从小到大,依赖查找!
获取其他8个内置对象:
内置对象的类型:
request HttpServletRequest
response HttpServletResponse
session HttpSession
application ServletContext
config ServletConfig
page this (HttpServlet)
pageContext PageContext
exception Throwable (所有异常父类)
out JspWriter
exception对象:
exception对象是java.lang.Trowable类的实例
(使用前 isErrorPage=“true”)
exception对象用来处理JSP文件在执行时所有发生的错误和异常
exception对象可以和page指令一起使用,通过指定某一个页面为错误处理页面,对错误进行处理
•<%@ page isErrorPage=”true “%>的页面内使用
page对象 ---- Servlet对象:
“page” 对象代表了正在运行的由JSP文件产生的类对象 【一般不建议使用】
page对象是指向当前JSP程序本身的对象this
page对象其实是java.lang.Object类的实例对象
out对象:
向客户端输出数据
管理服务器输出缓冲区
内部使用PrintWriter对象来输出文本级数据
通过page指令的buffer属性来调整缓冲区的大小,默认的缓冲区是8kb
out隐式对象的工作原理图 :
pageContext对象:
pageContext也是域对象,代表当前的页面范围,在当前的页面范围内获取数据。
向JSP的四个作用域范围内存数据。
•Servlet中有三个域,而JSP有四个域。
•JSP中多了pageContext的域范围,代表当前页面范围。
获取其他8个内置对象。
•编写框架、通用性较高的代码。
pageContext对象可以直译为“页面上下文”对象,代表的是当前页面运行的一些属性
它是javax.servlet.jsp.PageContext类的实例对象,可以使用PageContext类的方法。pageContext对象提供了对JSP页面所有的对象及命名空间的访问
提供了page范围的存取方法
•Object getAttribute(String name)
•void removeAttribute(String name)
•void setAttribute(String name, Object value)
findAttribute方法 (*重点,查找各个域中的属性)
通过pageContext获得其他对象 :
getException方法返回exception隐式对象
getPage方法返回page隐式对象
getRequest方法返回request隐式对象
getResponse方法返回response隐式对象
getServletConfig方法返回config隐式对象
getServletContext方法返回application隐式对象
getSession方法返回session隐式对象
getOut方法返回out隐式对象
JSP的四种数据范围:
对象 scope
pageContext page范围
request 请求范围
session 会话范围
application 应用范围
JSP动作标签:
JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。
这些JSP的动作标签,与HTML的标签有本质上的区别,动作标签是由Tomcat(服务器)来解释执行的,都是在服务器端执行的。HTML标签是由浏览器执行的。
JSP常用标签:
<jsp:useBean>
•使用一个ID和一个给定作用范围和同一ID的JavaBean相关联
<jsp:setProperty>
•设置JavaBean的属性值
<jsp:getProperty>
•取得JavaBean的属性值
<jsp:include>
•文件包含(服务器端路径,没有项目名称)
动态包含原理:
<jsp:forward>
•在JSP的页面中完成转发(服务器端路径,没有项目名称)
<jsp:param>
•需要写在<jsp:forward>的中间
<jsp:include>
例如:<jsp:include page="xxx"/>,用来包含指定的页面。假如有两个jsp. 分别为a.jsp和b.jsp,他们分别编码成Servlet,然后在执行Servlet时才会执行包含过程。这也是include指令与include标签的区别。
注意:<jsp:include page="<%=myfile%>">,这是可以的!因为include指令是在执行时才完成的包含,在执行时已经可以确定myfile这个变量的值。
该标签内部使用的是RequestDispatcher#include()方法完成的包含
<jsp:forward>
例如:<jsp:forward page="xxx"/>,用来转发到指定页面
例如在a.jsp中存在如下内容:<jsp:fowrad page="b.jsp"/>
a.jsp中的内容不会显示在浏览器上,而只是显示b.jsp的内容。而且在<jsp:forwad>标签下面的内容不会被执行。
<jsp:param>
该标签是和的子标签,用来向其他页面传递参数。
<jsp:include>与include指令的比较 :
<jsp:include>标签是动态引入, <jsp:include>标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。
而include指令是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。
不管是<jsp:include>标签,还是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,否则输出给客户端的内容将会是一个格式混乱的HTML文档。
两种include用法的区别: