看了几天,感觉东西好多,做个JSP简单总结。
JSP隐含对象:
打开之前那篇博客写的hello_jsp.java文件后,你会在_jspService()方法的下面发现该方法有声明好几个对象,如下:
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;其实这几个就是JSP的隐含对象,即我们在JSP页面中不用声明就可以直接使用。因为我们写的代码都会在该方法下面,所以可以直接使用。
request,response,pageContext,session,application,config,out,page 加一个exception就是我们说的JSP的9个隐含变量。
request:是HttpServletRequest的一个对象;
response:HttpServletResponse对象
pageContext: 页面的上下文, 是 PageContext 的一个对象. 可以从该对象中获取到其他 8 个隐含对象. 也可以从中获取到当前
页面的其他信息.
session: 代表浏览器和服务器的一次会话, 是 HttpSession 的一个对象。浏览器从第一次打开到关闭,这算一次会话。
application: 代表当前 WEB 应用. 是 ServletContext 对象. *
config: 当前 JSP 对应的 Servlet 的 ServletConfig 对象(几乎不使用). 若需要访问当前 JSP 配置的初始化参数,
需要通过映射的地址才可以.
out: JspWriter 对象. 调用 out.println() 可以直接把字符串打印到浏览器上.
page: 指向当前 JSP 对应的 Servlet 对象的引用, 但为 Object 类型, 只能调用 Object 类的方法(几乎不使用)
exception: 在声明了 page 指令的 isErrorPage="true" 时, 才可以使用. 后面讲错误页面的时候用到;
对属性的作用域打大小:
pageContext(页面) < request(请求)<session(会话 )<application(当前WEB应用)
String name =request.getParameter("name");
System.out.println(name);
ServletRequest servletRequest= pageContext.getRequest();
System.out.println(servletRequest == request);
System.out.println(session.getId());
System.out.println(application.getInitParameter("user"));
System.out.println(config.getInitParameter("test"));
out.println(session.getId());
out.println("<br>");
out.println("<br>");
out.println(servletRequest);
out.println(this);
out.println("<br>");
out.println("<br>");
out.println(page);//this和page得到的结果一致
JSP表达式(expression)提供了将一个 java 变量或表达式的计算结果输出到客户端的简化方式,它将要输出的变量或表达式直接封装在<%= 和 %>之中。
<%
Date date = new Date();
out.print(date);
%>
<%= date %>
上面2种方法得到的结果是一致的。
JSP注释的格式:<%-- JSP 注释 --%> <!-- HTML 注释 -->。JSP注释可以阻止Java代码的执行。但HTML注释不行。
请求的转发和重定向:
//请求的转发
//1.调用HttpServletRequest 的getRequestDispatcher()
//获取对象。调用getRequestDispatcher()方法时需要传入转发的地址
String path ="testServlet";
RequestDispatcher requestDispatcher =request.getRequestDispatcher("/"+path);
//2.调用requestDispatcher的forward(request,response)进行请求的转发
requestDispatcher.forward(request, response);请求的重定向:
// 执行请求的重定向,直接调用response.sendRedirect()方法
//path为要重定向的地址
String location ="testServlet";
response.sendRedirect(location); 本质区别:
请求的转发只发出了一次请求, 而重定向则发出了两次请求.
具体:
①. 请求的转发: 地址栏是初次发出请求的地址.
请求的重定向: 地址栏不再是初次发出的请求地址. 地址栏为最后响应的那个地址
②. 请求转发: 在最终的 Servlet 中, request 对象和中转的那个 request 是同一个对象.
请求的重定向: 在最终的 Servlet 中, request 对象和中转的那个 request 不是同一个对象.
③. 请求的转发: 只能转发给当前 WEB 应用的的资源
请求的重定向: 可以重定向到任何资源.
④. 请求的转发: / 代表的是当前 WEB 应用的根目录 http://localhost:8090/web/
请求的重定向: / 代表的是当前 WEB 站点的根目录. http://localhost:8090/
JSP指令:page,include,taglib.
page指令
page指令用于定义JSP页面的各种属性, 无论page指令出现在JSP页面中的什么地方, 它作用的都是整个JSP页面, 为了保持程序的可读性和遵循良好的编程习惯, page指令最好是放在整个JSP页面的起始位置。
page 指令常用的属性:
①. import 属性: 指定当前 JSP 页面对应的 Servlet 需要导入的类.
<%@page import="java.text.DateFormat"%>
②. session 属性: 取值为 true 或 false, 指定当前页面的 session 隐藏变量是否可用, 也可以说访问当前页面时是否一定要生成 HttpSession
对象.
<%@ page session="false" %>
③. errorPage 和 isErrorPage:
> errorPage 指定若当前页面出现错误的实际响应页面时什么. 其中 / 表示的是当前 WEB 应用的根目录.
<span style="font-size:14px;"><%@ page errorPage="/error.jsp" %> </span>
> 在响应 error.jsp 时, JSP 引擎使用的请求转发的方式. > isErrorPage 指定当前页面是否为错误处理页面, 可以说明当前页面是否可以使用 exception 隐藏变量. 需要注意的是: 若指定
isErrorPage="true", 并使用 exception 的方法了, 一般不建议能够直接访问该页面.
> 如何使客户不能直接访问某一个页面呢 ? 对于 Tomcat 服务器而言, WEB-INF 下的文件是不能通过在浏览器中直接输入地址的方式
来访问的. 但通过请求的转发是可以的!
> 还可以在 web.xml 文件中配置错误页面:
<error-page>
<!-- 指定出错的代码: 404 没有指定的资源, 500 内部错误. -->
<error-code>404</error-code>
<!-- 指定响应页面的位置 -->
<location>/WEB-INF/error.jsp</location>
</error-page>
<error-page>
<!-- 指定异常的类型 -->
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/WEB-INF/error.jsp</location>
</error-page>
④. contentType: 指定当前 JSP 页面的响应类型. 实际调用的是 response.setContentType("text/html; charset=UTF-8");
通常情况下, 对于 JSP 页面而言其取值均为 text/html; charset=UTF-8. charset 指定返回的页面的字符编码是什么. 通常取值为 UTF-8
⑤. pageEncoding: 指定当前 JSP 页面的字符编码. 通常情况下该值和 contentType 中的 charset 一致.
⑥. isELIgnored: 指定当前 JSP 页面是否可以使用 EL 表达式. 通常取值为 false.
include 指令:
<%@ include file="b.jsp" %>
1). include 指令用于通知 JSP 引擎在翻译当前 JSP 页面时将其他文件中的内容合并进当前 JSP 页面转换成的 Servlet 源文件中,
这种在源文件级别进行引入的方式称之为静态引入, 当前JSP页面与静态引入的页面紧密结合为一个Servlet。
2). file属性的设置值必须使用相对路径
3). 如果以 / 开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。
jsp:incluce 标签:
1). <jsp:include page="b.jsp"></jsp:include>
2). 动态引入: 并不是像 include 指令生成一个 Servlet 源文件, 而是生成两个 Servlet 源文件, 然后通过一个方法的方式把目标页面包含进来:org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "b.jsp", out, false);
jsp:forward:
<jsp:forward page="/include/b.jsp"></jsp:forward><pre name="code" class="java"><%
request.getRequestDispatcher("/include/b.jsp").forward(request, response);
%>以上2中效果是一样的。但使用forward标签,可以通过jsp:param子标签传入参数(include标签也可以使用该子标签)
<jsp:forward page="/include/b.jsp">
<jsp:param value="abcd" name="username"/>
</jsp:forward> 然后在b.jsp通过调用request.getParameter("username")可获得value=abcd.
本文介绍了JSP的基本概念,包括隐含对象、表达式、注释、请求转发与重定向的区别,以及JSP指令如page、include和taglib的使用方法。
3014

被折叠的 条评论
为什么被折叠?



