jsp简介
- JSP(Java Server Pages)是JavaWeb服务器端的动态资源,它与html页面的作用是相同的,显示数据和获取数据。
- jsp: 作为请求发起页面,例如显示表单、超链接。
: 作为请求结束页面,例如显示数据。- Servlet:
作为请求中处理数据的环节。- jsp的组成
- jsp = html + java脚本 + jsp标签(指令)
- jsp中可直接使用的对象一共有9个,被称之为9大内置对象
- 3种java脚本:
<%…%>:写java代码片段,(类似方法)
<%=…%>:用于输出,用于输出一条表达式(或变量)的结果。
<%!…%>:声明,用来创建类的成员变量和成员方法(类似与类)- jsp注释:<%– … –%>
当服务器把jsp编译成java文件时已经忽略了注释部分!
jsp原理(看源码)
- jsp其实是一种特殊的Servlet
- 当jsp页面第一次被访问时,服务器会把jsp编译成java文件
- 然后再把java编译成.class
- 然后创建该类对象
- 最后调用它的service()方法
- 第二次请求同一jsp时,直接调用service()方法。
jsp三大指令
page
<%@page language=”java” info=”xxx”…%>**
- 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>是指定抛出的异常类型。
<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()方法的功能相似!
- <%@include%> 它是在jsp编译成java文件时完成的!他们共同生成一个java(就是一个servlet)文件,然后再生成一个class!
- RequestDispatcher的include()是一个方法,包含和被包含的是两个servlet,即两个.class!他们只是把响应的内容在运行时合并了!
- 作用:把页面分解了,使用包含的方式组合在一起,这样一个页面中不变的部分,就是一个独立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个内置对象:
JSP动作标签
动作标签是由tomcat(服务器)来解释执行!而html标签由浏览器来执行!
<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 page="/b.jsp">
<jsp:param value="zhangSan" name="username"/>
</jsp:include>
在b.jsp中可以使用request.getParameter(“username”)来获取参数值。
javaBean
- 必须有public的无参的构造器
- 如果成员变量提供了getter/setter方法,那么称之为javabean属性。
JavaBean主要是用来通过反射操作的类!
因为需要通过Class的newInstance()方法来创建类的实例,所以要求类必须提供public的无参构造器
JSP中与JavaBean相关的标签
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
<jsp:useBean id="user1" class="cn.domain.User" />
查看page域中是否存在user1这个域属性,如果存在,那么直接获取。
如果不存在,那么创建之!
等同与:
User user1 = pageContext.getAttribute(“user1”);
if(user1 == null) {
user1 = new User();//创建user1对象
pageContext.setAttribute(“user1”, user1);//保存到page域
}
- 可以通过scope属性来指定操作
设置属性值:
<jsp:setProperty property="username" name="user1" value="admin"/>
- name:指定名为user1的JavaBean
- property:指定要设置的属性名称
- value:指定要设置的属性值
等同与
User user1 = (User)pageContext.getAttribute(“user1”);
user1.setUsername(“admin”);
**<jsp:getProperty>**
获取属性值
<jsp:getProperty property="username" name="user1"/>
输出user1这个javaBean的username属性值
等同与
User user1 = (User)pageContext.getAttribute(“user1”);
out.print(user1.getUsername());