jsp:
>Java Servlte Page
什么是jsp?
>从用户角度看待,就是一个网页,从程序员角度看待,其实就是一个java类,它继承了servlet,所以可以直接说jsp就是一个Servlet。
为什么会有jsp?
>平常我们见到的 html 网页属于静态网页, 很难在它显示一些动态改变的数据,比如查询学生列表, 搜索具体某个员工信息 , 这些数据由于都是存放在服务器的数据中 。 需要从数据库中取出来,然后显示到网页上。 html 网页时无法完成这项工作的, 这时候就需要jsp了。 jsp 其实可以看成是 java + html 的结合体 , 可以在jsp网页中编写java代码。
另外 jsp 最后会被翻译成一个 java 类, 这个 Java 类,实际上技术一个 HttpServlet 翻译成 java文件存放在 : tomcat目录/work/Catalina/localhost/项目名/org/apache/jsp 里面
怎么用JSP?
指令写法 <%@指令名称 %>
>page指令
有什么用?用于设置当前页面的一些信息。
怎么用?默认创建好jsp, 就会在最上面第一行,加入该指令了。
*language:表明jsp页面中可以写java代码
*contentType:用于表示当前页面的内容类型以及使用的编码。 这个属性其实是告诉浏览器的。
contentType="text/html;charset=UTF-8"
text/html MIMEType 这是一个文本,html网页
*pageEncoding :jsp内容编码
*extends:用于指定jsp翻译成java文件后,继承的父类是谁,一般不用改
*import:导包使用,一般不用手写
*session:值可选的有true or false,用于控制在这个jsp页面,能够直接使用session对象(true与false的区别具体可看翻译后的 java文件)
其实对应背后的是 ,jsp翻译成java后,在代码里面时候会调用 getSession() . 创建内置session对象。 默认是true。表示会创建session对象
true:在代码里面会有getSession()的调用
false:不会有该方法的调用,即没有session对象,在页面上自然也就不能使用session了
*errorPage: 表示该界面假设有错误,那么会跳转到哪个页面去。 要求的值是一个页面地址。
*isErrorPage:上面的errorPage用于指定错误的时候跑到那一个页面去,那么这个isErrorPage就是声明某一个页面到底是不是错误的页面
>include指令
有什么用?可以嵌套另外一个jsp页面的内容,<%@include file="other2.jsp" %>----> 表示,引入a.jsp的内容。
#实现细节:把另一个页面的所有内容拿过来一起输出,所有的标签元素都包含进来
>taglib指令
有什么用?用于导入标签库 ,多用于引入 JSTL标签库
<%@taglib prefix="" uri="" %>
uri:标签库路径 prefix:标签库的别名
JSP动作标签
<jsp:include page=""></jsp:include>
<jsp:param value="" name="" />
<jsp:forword page=""></jsp:forword>
*jsp:include
<jsp:include page="other2.jsp"></jsp:include>
包含指定的页面,这里是动态包含,即不把包含的页面所有元素标签全部拿过来输出,而是把jsp的运行结果拿过来
*jsp:forword
跳转页面使用, 其实是请求转发的简写方式而已。 与request.getRequestDispatcher("").forward(request, response); 等同。
<jsp:forword page=""></jsp:forword>
前往哪一个页面
如果想关心到底底层是如何走的,可以去看jsp翻译成的那个java文件,里面有具体的翻译后的代码,再配合servlet源代码,即可找到最终的答案,就是:请求转发
*jsp:param
用于指定参数的意思,在包含某个页面的时候,或者在跳转某个页面的时候,加入这个参数。 这个jsp:param 可以在其他两个动作标签里面嵌套使用 ,比如:
<jsp:forword page="other.jsp">
<jsp:param name="address" value="beijing" />
</jsp:forword>
在other.jsp中获取参数
<br>收到的参数是:<br>
取值:<%=request.getParameter("address") %>
JSP内置对象
所为内置对象,就是我们可以直接在jsp页面中使用这些对象,不用创建
-pageContext
-request
-session
-application
以上4个是作用域对象
*作用域:表示这些对象可以直接存值,他们的取值范围有限定。setAttribute 和 getAttribute
使用作用域来存储数据<br>
<%
pageContext.setAttribute("name", "page");
request.setAttribute("name", "request");
session.setAttribute("name", "session");
application.setAttribute("name", "application");
%>
取出四个作用域中的值<br>
<%=pageContext.getAttribute("name")%>
<%=request.getAttribute("name")%>
<%=session.getAttribute("name")%>
<%=application.getAttribute("name")%>
作用域范围大小:
pageContext-----request----session----application
四个作用域的区别:
*pageContext【PageContext】
作用域仅限于当前的页面,一般使用该对象来存取值以及可以获取到其他八个内置对象(但是由于其他内置对象都可以直接使用,所以该作用一般比较少用了)
*request【HttpServletRequest】
通常在 jsp 页面用来存取值 和 跳转,作用域仅限于一次请求,只要服务器对该请求做出了响应,这个域中存的值就没有了
* 跳转:
request.getRequestDispatcher("").forward(request, response);
* 存取值
使用的方法是 setAttribute 和 getAttribute .
*session【HttpSession】
默认情况下, jsp 翻译成 java 文件后, 会在里面的方法调用 request.getSession(). 那么咱们可以直接在 jsp 里面使用 session 对象。
当然这有一个开关来确定的。 即, 在顶部的 page 指令里面有一个属性叫做 : session="true" 默认即是 true, 如果是 true , 那么就会创建 session 对象。
所以可以连起来理解就是 : 如果顶部的 page 指令中的 session 属性 的值 是 false , 那么我们在 jsp 页面上,将无法使用 session 对象。因为翻译成的 java 类中,根本没有创建这个对象。 我们一般使用这个对象来存取值
作用域限于一次会话(多次请求与响应)当中
*application【ServletContext】
可以做ServletContext的事情。 但是一般在jsp页面里面,我们使用该对象,多数情况都是来进行存值和取值。
该对象的作用域是最大的,直到服务器停止。也就是说,在A.jsp页面中使用该对象存值, 在任何一个jsp页面上,都可以取值。整个工程都可以访问,服务器关闭以后就不能访问了
-out【JspWriter】
该对象其实是 JspWriter 的实例 , 页面上的内容都是靠该对象去执行输出的。 写法如下:
<%
out.write("输出的内容");
%>
想想, response 也是可以获取到 PrintWrite 来输出的。 那么两者有什么区别呢?
大家可以自己私底下做实验, 便会得知 out 的内容其实 先写到 response 的缓冲区来的, 然后先输出 response 自身的内容,尔后再输出 out 的内容
-response【HttpServletResponse】
一般使用这个对象来执行 跳转 , 当然也可以执行页面内容输出
* 跳转
写法与 java 代码一致、 response.sendRedirect("");
-exception【Throwable】
这个对象,默认 jsp 是不会创建的, 只有在 page 指令里面写上了 isErrorPage="true" 才会创建。 连起来解释的话,就是: 只有错误的页面,才会创建该对象。
使用该对象, 我们可以在错误的页面上,输出错误的信息
-page【Object】
就是这个jsp页面翻译成的java类的实例,有点像咱们 java 类中的那个 this
-config【SevletConfig】
可以在里面获取 Servlet 配置的一些参数。