jsp:是简化servlet编写的一种技术,它将java代码和html语句混合在同一个文件中编写,只对页面中的要动态产生的内容采用java代码来编写,而对固定不变的静态内容采用静态html页面的方式编写。
(1)jsp可以放置在web应用程序中的除了web—inf 及子目录外的其他任何目录中,JSP页面的访问路径与普通HTML页面的访问路径形式也完全一样。
(2)运行原理:jsp运行到服务器上时会产生一个.jsp.java的java类,该类直接继承了HttpJspBase类,而HttpJspBase又继承了HttpServlet类,由此可见,实际上jsp就是一个servlet。
(3) jsp页面中的隐含对象:request,response,pageContext,session,
application,config,out,page
(还有一个叫exception)
jsp八个隐含对象
①request:HttpServletRequest对象
运行结果:
②response:HttpServletResponse对象 (在jsp页面中几乎不会调用)
③pageContext:页面的上下文,是PageContext的一个对象
可以从该对象回去到其他8个隐含对象
④session:代表浏览器和服务器的一次对话,是httpSession的对象。(重要)
⑤application:代表当前WEB应用,是ServletContext对象 即可以获取servlet的信息
System.out.println("here"+application.getInitParameter("school"));
运行结果:
⑥config:当前jsp对应的servlet 的 servletConfig的对象
⑦out:jspWriter的对象 out.println() 将字符直接打印到浏览器上
⑧page:指向当前jsp对应的servlet对象的引用,但为object类型,只能调用Object类的方法
⑨excepttion:处理错误信息
只有在jsp声明了isErrorPage=“True”时才能使用
小结:对属性的作用域的范围从小到大 pageContext,request,session,application
out,config,response page exception
jsp语法:
①jsp模板元素:JSP页面中的静态HTML内容
②jsp表达式:<%= xxxx> 将xxxx打印在html页面上
③jsp脚本片段:指嵌套在<% %> 中间的一条或多条代码
多个脚本片段可以进行相互访问
④jsp声明:JSP声明将Java代码封装在<%! 和 %>之中,它里面的代码将被插入到Servlet的_jspService方法的外面(在jsp页面中定义方法。)
<%! void test(){
} %>
⑤注释:
<%--JSP注释--%>
<!-- HTML注释 -->
和属性相关的方法
(1)方法
①getAttribute(String name):获取指定属性
②getAttributeNames():获取所有属性的名字组成的Enumeration对象
③removeAttribute(String name):移除指定的属性
④setAttribute(String name,Oject o):设置属性
(2)pageContext,request,session,application 对象都有这些方法,这四个对象也称之为域对象
实例:
<%
pageContext.setAttribute("pageContextAttribute", "pageContextAttribute");
request.setAttribute("requestAttribute", "requestAttribute");
session.setAttribute("sessionAttribute", "sessionAttribute");
application.setAttribute("applicationAttribute", "applicationAttribute");
%>
<h3>在当前页面中获取</h3>
pageContextAttribute:<%=pageContext.getAttribute("pageContextAttribute") %>
<br>
requestAttribute:<%=request.getAttribute("requestAttribute") %>
<br>
sessionAttribute:<%=session.getAttribute("sessionAttribute") %>
<br>
applicationAttribute:<%=application.getAttribute("applicationAttribute") %>
<br>
运行结果:
我们发先这四个属性在当前页面中都能够访问的到
接下来我们加入一个超链接 转到另外一个jsp页面,看能否获取到在第一个jsp页面中设置的属性:
运行结果:
我们发现在新的jsp页面中获取pageContext和request对象的属性为空 由此得出一下结论:
①pageContext:属性的作用范围仅限于当前Jsp页面
②request:属性的作用范围仅限于当前请求
③session:属性的作用范围限于一次会话:浏览器打开直到关闭称之为一次对话(期间会话不失效)
④application:属性的作用范围限于当前web应用。是范围最大的属性作用范围
请求的重定向和转发
(1)请求的转发:
①调用HttpServletRequest的 getRequestDispatcher() 方法获取getRequestDispatcher()对象
②调用RequestDispatcher()的forward(request,response)进行请求的转发
String path="testServlet";
RequestDispatcher requestDispatcher=request.getRequestDispatcher("/"+path);
//2.调用RequestDispatcher()的forward(request,response)进行请求的转发
requestDispatcher.forward(request, response);
实例:我们在jsp页面跳转到fowardServlet在控制台上打印一串字符,然后进行转发testServlet也打印一串字符 如下:
通过控制台的打印信息我们可以看出:当在jsp页面点击超链接时,会调用ForwardServlet方法中的doget()方法,并通过请求的转发调用TestServlet的doget()方法,值得注意的是 此时的url地址仍然是在forwardServlet中。
(2)请求的重定向:直接调用HttpServletResponse的sendRedirect()方法就行,传入需要重定向的地址
运行结果如下
此处我们可以发现 重定向后的url地址不是在RediectServlet上了而是指向了Test2Servlet,即我们重定向的地址。
二者比较:
①地址栏发生了变化:说明转发过程中客户端只向服务器发送了一个请求,而重定向发送了两个请求。
②请求的转发只能抓发给当前web的应用资源
请求的重定向可以重定向到任何资源(各种网页)
jsp指令
一 include指令
<% @ include file="filepath">
1)用于通知jsp引擎在翻译当前jsp页面时将其他文件中的内容合并进当前jsp页面转换成的servlet源文件中,这种在源文件级别进行引入的方式称之为静态引入。(源码级包含)
2)file 属性的设置必须使用相对路径
3)如果以“/”开头表示当前web应用程序的根目录。
二 page指令
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
① language=“java” 合法语言
② extends=“package.class"
③ import =”“ 在jsp页面中需要导入的包,特别是当有java代码时
④ session=”true|False" 当前页面是否可以使用session (默认为True)
⑤errorPage=“ralativeURL”
⑥isErrorPage=“true|False” 为True时 当前页面可以使用exception对象,该对象封装了关于处理错误的方法
这两个指令是用来配置错误页面的
如下:
运行结果会出错:
我们可以设置一个错误页面:
在errror.jsp 打印出一点东西:
此时页面出错时就会转到我们设置好的页面上去