jsp(java server pages)的作用
- servlet:
- 缺点:不适合设置html响应体,需要设置大量的response.getWriter().print(html标签)
- 优点:动态资源,可以编程。
- html
- 缺点:html是静态页面,不能包含动态信息
- 优点:不用为输出html标签而发愁
- jsp(java server pages)
- 优点:在原有的html的基础上添加java脚本,构成jsp页面
jsp和Servlet的分工
- jsp
- 作为请求发起页面,例如显示表单,超链接
- 作为请求结束页面,例如显示数据
- Servlet
- 作为请求中梳理数据的环节
- 作为请求中梳理数据的环节
jsp的组成
- jsp = html + java脚本 + jsp标签(指令)
- jsp中无需创建即可使用的对象一共有9个,被称之为9大内置对象。例如:request对象,out对象
- 3种Java脚本
- <%…%>:Java代码片段,用于定义Java语句
- <%=…%>:Java表达式,用于输出,用于输出一条表达式或者变量的结果
- <%!…%>:声明,用来创建类的成员变量或者成员方法,类中可以做什么,他就写什么。
jsp九大内置对象
- 输入输出对象:
- out(jspWriter) 用于向浏览器客户端输出数据,等同于response.getWriter()
- response(HTTPServletResponse) 封装了 服务器的相应信息
- request(HTTPServletRequest) 封装了客户端的请求信息
- 通信控制对象
- pageContext(页面上下文对象) 提供了对jsp页面所有对象以及命名空间的访问
- session(HttpSession) 用来保存会话信息,可以实现在相同用户的不同请求之间共享数据
- application(ServletContext) 应用对象,可以在不同的 用户之间共享数据
- Servlet对象
- page(当前jsp页面编译后的Java原型)对象 指向了当前jsp本身,指向了当前对象
- config(ServletConfig)对象 封装了应用程序的配置信息,
- 错误处理对象
- exception对象 封装了jsp程序执行过程中发生的异常或者 错误信息,只有在错误页面才可以使用这个信息
- exception对象 封装了jsp程序执行过程中发生的异常或者 错误信息,只有在错误页面才可以使用这个信息
jsp原理
- jsp其实就是一种特殊的Servlet
- 当jsp页面第一次被访问时,服务器会吧jsp页面编译成Java文件,(HttpJspBase是HttpServlet的一个子类)
- 在编译成class文件
- 创建该类的对象
- 最后调用它的service方法(jsp编译后 额内容除了声明的成员,都是放在这个方法内)
- 第二次请求同一个jsp页面是,直接调用它的service方法
- ==请看tomcat路径下work–>Catalina–>…xxx_jsp.java==
- 打开编译后的Java 文件,这个类间接的实现了servlet接口
- tomcat的work目录下可以找到jsp对应的.java源代码
- jsp编程的Java文件的规则
- 如果是Java代码就留下
- 如果不是直接输出(html结构使用out.Write输出,但是我们定义的输出使用out.print输出)
jsp注释
- <%– 注释 –%>这种方式注释的内容,经过编译后注释内容就不会存在了
- 这种注释(html注释),会一直存在,并且发送到客户端,只是客户端不显示而已。
- <% Java 代码的注释%> java 代码的注释,编译后也是不会显示在客户端的
jsp三大指令
一个jsp页面可以有0到多个指令,同时这些指令的位置没有要求说必须放在文档的开头
- 格式:
- <%@指令名 att1=”xxx” att2=”xxx”%>
==page指令的属性==
- pageEncoding和contentType
- pageEncoding:他指定当前jsp的页面的编码, 在服务器时把jsp编译成Java文件时,就要使用pageEncoding
- contentType:它表示添加一个响应头,content-Type等同于response.setContentType(“text/html;charset=utf-8”)
- 如果两个值只提供一个,那么另一个的默认值就是设置的那一个
- 如果两个属性都没有设置值,那么默认为iso
- import:导包!可以出现多次
errorPage和isErrorPage
- 这种方式跳转到错误页面,地址栏不会发横变化,那么也就是说是是转发到错误页面的 ,如果不给错误页面的page指令 设置一个属性isErrorPage为true,那么虽然跳转了,但是响应码是200
- errorPage:当前页面如果发生异常,那么就使用这个舒心指定转发到哪个页面 ,==响应码是200==
- isErrorPage;它指定当前页面是否为处理错误的页面!当该属性为true时,这个页面的==状态码设置为500==,而且 可以使用内置对象exception,==注意只有指定了这个页面是错误页面才可以使用exception内置对象==
- 也可以通过设置配置文件来定义如果出现异常要转发到哪个页面,例如;
<error-page> <error-code>404</error-code> <location>/error/errorPage.jsp</location> </error-page> <error-page> <error-code>505</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:信息
- isTreadSafe:当前的jsp是否支持并发访问
- Session:当前页面是否支持Session,如果为false,那么当前页面就没有Session这个内置对象
- pageEncoding和contentType
==include指令 静态 包含==
- 格式:<%@include file=”“%>
- include的作用是包含指定的页面,在jsp被编译成Java文件之前会吧两个jsp文件合并,然后再编译成一个Java,再编译成class文件 文件(也就是生成了一个Servlet)
- ==注意==:但是request.getRequestDispatcher(“”).include(request,response)这中包含是在运行的时候包含(动态包含),是 两个Servlet,两个Java文件,两个class文件
- <%@include file=”“%>file 属性内不可以写变量,因为include包含是在编译成Java文件之前,完成的,但是变量是在class文件行时才能明确的
- 演示请求包含代码和结果
- 便宜后的文件(服务器目录–work-catalina…)
==taglib指令 导入标签库==
- <%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core” %>
- taglib指令是用来导入标签 库的,
- prefix 指定标签前缀名,这个名字可以自己定义
- uri 指定第三方标签库的uri(唯一标识)
- 引用之前,需要导入第三方标签库的jar包
PageContext
- 一个顶9个
- Servlet中有三大域,而jsp中有四大域,他就是最后一个域对象。
- ServletContext;整个应用程序
- Session:整个会话(一个会话中一个用户)
- request:一个请求链
- PageContext;==一个jsp页面!这个域是在当前jsp页面和当前jsp页面中使用的标签之间共享数据==
- 域对象,pageContext 本身也是域对象,也可以存取删属性
- 代理其他域对象,通过这个对象,可以直接 给其他三个域对象设置属性,也可以从其他 三个域对象获取属性
- setAttribute(String key,Object vlue,int scope)
- getAttribute(String key,int scope)
- removeAttribute(String key,int scope)
- 其中方法中的scope是PageContext类(Java ee文档)中的四个字段==PAGE_SCOPE , REQUEST_SCOPE , SESSION_SCOPE , APPLICATION_SCOPE==
- 实例:通过代理设置属性,被代理的域对象获取属性
- 全域查找:使用pageContext内置对象的findAttribute()方法,可以按照域对象从小到大的顺序查找属性
- 获取其他8个内置对象
- 域对象,pageContext 本身也是域对象,也可以存取删属性
jsp动作标签
- 这些jsp动作标签,与HTML提供的标签有本质的区别
- 动作标签是由服务器来解释执行,它与Java代码一样,都是在服务器端执行的
- html由浏览器来执行
- :转发!它与request.getRequestDispatcher().forward(request,response)方法一样
- :转发!它与request.getRequestDispatcher().include(request,response)方法一样
- flush 属性,如果设置为true ,当包含的资源很大的时候,服务器会先响应给客户端一部分,然后再等待后续的内容,但是如果设置为false 的时候,服务器 会在资源加载完之后才响应给客户端,如果是大型的页面,同时带宽又不足,可以使用true
- :它用来作为forward和 include的 子标签,用来给转发和包含的页面传递参数
与JavaBean相关的三个动作标签
- –> 创建或查询bean
- 在session域中查找名为user1的bean,如果不存在,创建之
- 当创建之后,再次使用这个标签,那么就是 查询的效果了
-
- 设置名为user1的这个javabean的username属性值为admin
-
- 获取名为user1的javabean的名为username属性值
修改配置文件context.xml
- 实现修改项目中的文件,不用重新启动服务器
- 配置文件的位置:服务器目录–>conf–>context.xml
- 格式: