JSP 概述
JSP是Servlet编写的一种技术,将Java代码和HTML语句混合在同一文件中编写。对动态产生的内容采用Java代码编写,静态的内容采用静态HTML的方式编写。
- JSP的运行原理:JSP本质上是一个Servlet。每一个JSP页面第一次被访问是,JSP引擎将它翻译成一个Servlet源程序,接着把这个Servlet源程序编译成Servlet的class类文件。然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这些由JSP页面翻译成的Servlet程序。
- JSP可以放在WEB应用程序中除WEB-INF及其子目录外的其他任何目录中,JSP页面访问路径与普通HTML页面访问路径形式完全一样。
JSP 页面:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>A jsp page</title>
</head>
<body>
<%
// java代码
%>
</body>
</html>
JSP 中9个隐含对象
JSP页面中有9个隐含对象,这些对象没有声明就可以直接使用
对象 | 含义 |
---|---|
request | HttpServletRequest的一个对象 |
response | HttpServletResponse的一个对象 |
pageContext | 页面的上下文,是PageContext的一个对象,可以从该对象中获取其他的8个隐含对象 |
session | 代表浏览器和服务器的一次会话,是HttpSession的一个对象 |
application | 代表当前WEB应用,是ServletContext对象 |
config | 当前JSP页面对应的Servlet对象的ServletConfig对象(几乎不用) |
out | JspWriter对象,调用out.println() 可以直接把字符串打印到浏览器上 |
page | 指向当前JSP对应的Servlet对象的引用,但作为Object类型,只能调用Object类的方法(几乎不用) |
exception | 在声明了isErrorPage="trus" 时,才能使用 |
JSP 语法
JSP模板元素:JSP页面中静态HTML内容
JSP表达式:将Java变量或表达式写在
<%=
和%>
中,可以将结果输出到HTMl页面中JSP脚本片段:嵌套在
<%
和%>
之中的一条或多条Java程序代码。多个脚本片断中的代码可以相互访问<% Integer age = 16; if(age >= 18){ %>成人<% }else{ %>未成人<% } %>
JSP 声明: JSP 声明将 Java 代码封装在
<%
和%>
之中,它里面的代码将被插入进 Servlet的 _jspService 方法的外面。使用JSP声明可以在JSP页面中定义函数,但通常不这样使用。JSP注释的格式:
<%-- JSP 注释 --%> <!-- HTML 注释 -->
区别: JSP 注释可以阻止 Java 代码的执行.
JSP 域对象的属性操作
pageContext
、request
、session
、application
是域对象,都具有下面四种方法
<%
void setAttribute(String name, Object o); // 设置属性
Object getAttribute(String name); // 获取属性
Enumeration getAttributeName(); // 获取所有属性名字
void removeAttribute(String name); // 删除属性
%>
域对象的作用域:
域对象 | 作用域 |
---|---|
pageContext | 当前JSP页面 |
request | 同一个请求 |
session | 当前会话 |
application | 当前WEB应用 |
JSP 请求转发和重定向
<%
// 请求转发
request.getRequestDispatcher(url).forward(request, response);
// 请求重定向
request.sendRedirect(url);
%>
区别:
请求转发 | 请求重定向 |
---|---|
请求数量(本质区别) | 一次请求 |
地址栏表现 | 初次发起请求的地址 |
最终Servlet中的request | 和中转的那个 request 是同一个对象 |
目标 | 给当前 WEB 应用的的资源 |
根目录 | / 代表的是当前 WEB 应用的根目录 |
JSP 指令
JSP指令是为JSP引擎设计的,并不产生任何输出,只是告诉引擎如何处理JSP页面中的其余部分
<%@ 指令 属性="值" %>
page
page指令用于定义JSP页面的各种属性, 无论page指令出现在JSP页面中的什么地方, 它作用的都是整个JSP页面, 为了保持程序的可读性和遵循良好的编程习惯, page指令最好是放在整个JSP页面的起始位置。
属性 值 含义 import Java Class Name 指定当前JSP页面对应的Servlet需要导入的类
*JSP默认导入的包 :javax.servlet.*
session true or false
指定当前页面的 session
隐藏变量是否可用.errorPage page path 指定若当前页面出现错误时的实际响应页面。出现错误时转发到errorPage isErrorPage true or false
标定当前页面是不是错误页面,如果为true,则可以使用 exception
隐藏对象contentType text/html; charset=UTF-8
指定当前JSP页面的响应类型,实际上调用的是 respose.setContentType()
方法.文档类型可以在tomcat的config目录下的web.xml文件包含所有文档类型<mime-mapping>
pageEncoding UTF-8
指定当前JSP页面的字符编码,通常与contentType中一致 isElIngoer true or false
指定是否使用EL表达式,默认为 false
放在
WEB-INF
目录下的页面不能直接访问,但通过请求转发可以访问;在web.xml文件中配置错误页面:
<error-page> <error-code>404</error-code> <location>/WEB-INF/error.jsp</location> </error-page> <error-page> <exception-type>404</exception-type> <location>/WEB-INF/error.jsp</location> </error-page>
include
用于通知JSP引擎在翻译当前JSP页面时,将其他文件中的内容合并进当前JSP页面转换成的Servlet源文件中,这种在源文件级别进行引入的方式称为静态引入,当前JSP页面与静态引入的页面紧密结合为一个servlet
<%@ include file="relativeUrl" %>
file属性值如果以 / 开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。
如果a页面包含b页面,在a页面中定义的变量,b页面可以访问
JSP 标签
<jsp:include>
<jsp:include>
是动态引入。会将包含的页面单独翻译为一个java文件。如果a页面包含b页面,在a页面中定义的变量,b页面不可以访问<jsp:inlcude page="fileUrl"></jsp:inlcude>
<jsp:forward>
<jsp:forward> page="fileUrl"> <jsp:param name="param-name" value="param-value"> </jsp:forward>
相当于,但
<jsp:forward>
可以传入参数<% request.getRequestDispatcher("fileUrl").forward(request,response); %>
<jsp:param>
<jsp:param>
可以为传<jsp:forward>
或<jsp:include>
入一个参数<jsp:param name="param-name" value="param-value">
JSP 中文乱码处理
保证
contentType
中charset
与pageEncoding
的编码一致,且都支持中文,通常选择UTF-8
。浏览器的编码设置一致<% @page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
获取中文参数值,默认参数在传输过程中使用的编码为
ISO-8859-1
<% // 对于POST请求,在获取请求信息前 request.setCharacterEncoding("UTF-8"); // 对于GET请求 String val = request.getParameter("name"); String nameVal = new String(val.getBytes("iso-8859-1"),"UTF-8"); // 对于GET请求,还可以修改tomcat的server.xml文件,为Connector添加useBodyEncodingForURI="true"属性即可 %>