JSP
-
JSP起源
- 在动态网页中,绝大部分内容是固定不变的,只用局部内容需要变化。
- Servlet写静态代码会是程序十分臃肿,编写和维护都很困难。
- HTML语言需要美工设计和编写,不属于程序员的工作。
- 为弥补Servlet的缺陷, SUN公司在Servlet的基础上推出了JSP(java server pages)技术作为解决方案。
-
JSP定义
- JSP是简化Servlet编写的一种技术,它讲java代码和HTML语句混合在同一个文件中编写,只对动态产生的内容采用Java代码来编写。
-
JSP文件位置
- JSP可以放置在WEB程序中除了WEB-INF极其子目录外的任何其他目录中,JSP页面的访问路径与普通的HTML页面访问路径的形式相同。
-
JSP的运行原理
- JSP本质上是一个Servlet,每个JSP页面第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着在将这个servlet源程序编译成Servlet的class类文件。让后再由WEB容器像调用普通的Servlet程序一样的方式来装载和解释执行这个有JSP页面翻译成的Servlet程序。
-
JSP的隐含变量:没有声明即可使用。
- respose(少用)
- request
- pageContext:页面的上下文,是PageContext的一个对象,可以从该对象获取到其他8个隐含对象,也可以获取当前页面的其他对象。
- session:浏览器和服务器的会话
- application:当前web应用,ServletContext对象
- config: ServletConfig对象。若访问当前JSP的初始化参数,需要通过映射的地址才可以。
- 映射JSP:
<servlet> <servlet-name>hellojsp</servlet-name> <jsp-file>/hello.jsp</jsp-file> <init-param> <param-name>key</param-name> <param-value>vlaue</param-value> <init-param> </servlet> <servlet-mapping> <servlet-name>hellojsp</servlet-name> <url-pattern>/hellojsp</url-pattern> </servlet-mapping>
- 映射JSP:
- out: JspWriter对象。调用out.println()可以直接把字符串打印的html页面上。
- page: 指向当前JSP对应的Servlet对象的引用,为object对象(少用),有点类似于this
- exception, 表示发生错误的JSP页面对应的异常对象
-
JSP语法
- JSP页面的静态HTML内容称为模板元素
- JSP表达式(expression)
<%Date date = new Date(); out.println(date);%> <%= date %> <!--与上面的out.println等价-->
- JSP脚本片段指嵌套在<%%>之中的一条或多条java程序代码。
- JSP声明: JSP声明封装在<%! %>之中,它里面的代码将被插入Servlet的_jspService方法的外面。(少用)
- 注释, HTML注释中的JSP脚本会执行。
<%-- JSP注释 --%> <!--HTML注释-->
-
JSP中和属性相关的方法
- Object getAttribute(String name)
- Enumeration getAttributeName()
- removeAttribute(String name): 移除指定属性
- void setAttribute(String name, Object o)设置属性
这几种方法域对象(pageContext, request, session, application)都有!
-
几种域对象的作用范围
- pageContex: 当前页面
- request: 同一个请求
- session:限于一次会话(浏览器打开到关闭)
- application: 当前web应用
-
请求的重定向与转发
- RequestDistpatcher接口的forward()方法实现请求的转发
//请求的转发 // 调用HttpServletRequest的getRequestDispatcher()方法获取RequestDistpatcher对,调用getRequestDispatcher() 需要传入转发的地址。 String path = "xxx" RequestDispatcher requestDispatcher= request.getRequestDispatcher(path); // 调用HttpServletRequest的forward(request, response)进行请求的转发。 requestDispatcher.forward(request, response)
- response.sendRedirect()方法实现请求重定向
两者进行比较:
请求转发 | 请求重定向 |
---|---|
地址栏为初次发出请求的地址 | 地址栏为最后响应的那个地址 |
在Servlet中,request和中转的request是同一个对象 | 在最终的Servlet中request对象和中转的requst对象不同 |
请求转发只能转发到当前WEB应用的资源 | 可以重定向到任何资源 |
/代表当前web应用的根目录 | 当前web站点的根目录 |
-
JSP指令page
(JSP指令是为JSP引擎而设计的,它们并不直接产生任何可见的输出,而是告诉引擎如何处理JSP页面中的其余部分。 )- page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面的什么地方,它的作用都是整个JSP页面,最好放到JSP页面的起始位置。
如:- <%@ page contentType=“text/html;charset=gb2312”%>
- <%@ page import “java.util.Date”>
- <%@ page language="java"contentType=“text/html;charset=gb2312” import=“java.util.Date” pageEncoding=“utf-8”>
完整语法:
- page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面的什么地方,它的作用都是整个JSP页面,最好放到JSP页面的起始位置。
<% page contentType = "text/html;charset=gb2312"
session = "false"
import="java.util.Date" # 要导入的包
language="java" # 无用
extends="package.class" # 当前jsp被翻译成源文件后可以继承哪些类(少用)
session="true|false" # 是否允许使用session, 是否生成HttpSession
isErrorPage="true" # 是否是错误页面。
errorPage="/error.jsp" # 指定当前页面出现错误实际响应的是什么。(请求转发的方式)
isErrorPage=”true“ #指定当前页面是否为错误处理页面,可以说明当前页面是否可以使用exception隐藏变量。
contextType="tesxt/html;charset=UTF-8" : 指定当前JSP页面的响应类型。实际调用的是response.setContentType("text/html;charset=UTF-8")
pageEncoding: 指定当前JSP页面的字符编码类型
isELIgnored=”True“: 指定当前JSP页面是否可以使用EL表达式。
错误页面也可以在web.xml中定义:
<error-page>
<!--指定错误代码-->
<error-code>404</error-code>
<location>/hello.jsp</location>
</error-page>
<error-page>
<!--指定错误类型-->
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/WEB-INF/error.jsp</location>
</error-page>
```
-
include指令
- <%@ include file=“relativeURL”%> 源码级包含(静态包含,生成一个源文件)
-
JSP标签
<jsp:include page="relativeURL"></jsp:include> #动态包含,生成两个servlet源文件,被引入的资源必须式一个能独立被WEB容器调用和执行的资源。 <jsp:forward page="path"> <jsp:param vlaue="abcd" name="username"/> </jsp:forward> # 转发, 可以使用jsp:param向子标签传参, 子标签可以通过request.getParameter(name)获取参数
-
中文乱码问题
- 保持pageEncoding 与 contentType中的charset保持一致
- 浏览器显示的字符编码也和请求的JSP页面编码一致
- 对于post请求,在获取请求信息前加上request.setCharacterEncoding(“UTF-8”)
- 对于get 请求,修改Tomcat server.xml文件。参考: http://localhost:8989/docs/config/index.html文档中的useBodyEncodingForURI属性为true即可。