# JSP
## JSP指令
新建一个jsp文件,最上面一行就是jsp指令
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
~~~
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。
JSP指令的基本语法格式:
<%@ 指令 属性名="值" %>
举例:<%@ page contentType="text/html;charset=gb2312"%>
注意:属性名部分是大小写敏感的
在目前的JSP 2.0中,定义了page、include和taglib这三种指令,每种指令中又都定义了一些各自的属性。
如果要在一个JSP页面中设置同一条指令的多个属性,可以使用多条指令语句单独设置每个属性,也可以使用同一条指令语句设置该指令的多个属性。
第一种方式:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.Date"%>
第二种方式:
<%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>
***
### Page指令
~~~
JSP 2.0规范中定义的page指令的完整语法:
<%@ page
// jsp支持的语言类型
[ language="java" ]
// jsp翻译成Servlet可以继承哪些类
[ extends="package.class" ]
// 导包
[ import="{package.class | package.*}, ..." ]
// 当前页面是否允许使用session
[ session="true | false" ]
[ buffer="none | 8kb | sizekb" ]
[ autoFlush="true | false" ]
[ isThreadSafe="true | false" ]
[ info="text" ]
[ errorPage="relative_url" ]
[ isErrorPage="true | false" ]
// 指定当前jsp页面的响应类型
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
// 指定当前jsp页面的字符编码
[ pageEncoding="characterSet | ISO-8859-1" ]
// 指定当前jsp页面是否可以使用EL表达式,通常取值为true
[ isELIgnored="true | false" ]
%>
~~~
errorPage和isErrorPage
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" errorPage="/error.jsp" %>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
int i = 10 / 0;
%>
</body>
</html>
~~~
error.jsp
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>ErrorPage</h1>
<%= exception.getMessage() %>
</body>
</html>
~~~
一般来说,这样的错误页面不建议直接访问,那么如何处理能够达到这样的效果。
对于Tomcat服务器而言,WEB-INF下的文件是不能通过在浏览器中直接输入URL来直接访问的(即将error.jsp剪切到WEB-INF),但通过请求的转发是可以的,所以可以这么处理一下
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" errorPage="/WEB-INF/error.jsp" %>
~~~
***
在web.xml也可以配置错误页面(jsp中的errorPage删除)
~~~
<error-page>
<!-- 404:没有指定资源;500,内部错误 -->
<error-code>500</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>
~~~
***
### include指令
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>A Page</h1>
<!-- 在a.jsp中包含b.jsp,file后的资源写的是相对路径,如果有/代表是wen应用根目录 -->
<%@include file="b.jsp" %>
</body>
</html>
~~~
静态包含,也称为源码级包含,只有一个.java源文件
***
### JSP标签
①jsp:include
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>A Page</h1>
<!-- 在a.jsp中包含b.jsp -->
<%-- <%@include file="b.jsp" %> --%>
<jsp:include page="b.jsp"></jsp:include>
</body>
</html>
~~~
<jsp:include page="b.jsp"></jsp:include>与include指令不太一样,是动态包含,存在两个.java源文件
②jsp:forward
a.jsp
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:forward page="/b.jsp">
<jsp:param value="test" name="username"/>
</jsp:forward><jsp:forward page="/b.jsp"></jsp:forward>
</body>
</html>
~~~
b.jsp
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Page 222</h1>
<%= request.getParameter("username") %>
</body>
</html>
~~~
相当于request.getRequestDispatcher("/b.jsp").forward(request,response);还能够使用jsp:param传递一些参数,可以通过request.getParameter(String name)获取请求参数。
***
### 中文乱码问题
①在JSP页面上输入中文,请求页面后不出现乱码:
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
~~~
以及浏览器显示的字符编码与请求的jsp字符编码一致
②获取请求参数中存在中文(默认字符编码为ISO-8859-1)
a.jsp
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="b.jsp" method="post">
username:<input type="text" name="username">
<input type="submit" value="Submit">
</form>
</body>
</html>
~~~
b.jsp
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Page 222</h1>
<%= request.getParameter("username") %>
</body>
</html>
~~~
在a.jsp提交表单后出现乱码
![](https://box.kancloud.cn/b60e14f86da56a63b45f40c16a9c1eed_382x255.png)
解决方式
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Page 222</h1>
// 对于post请求,在获取请求参数之前,指定请求参数的字符编码为UTF-8,即可解决中文乱码
<% request.setCharacterEncoding("UTF-8"); %>
<%= request.getParameter("username") %>
</body>
</html>
~~~
- 第一章 配置和安装Tomcat
- 第二章 Servlet(一)
- 第三章 Servlet(二)
- 练习 一 . Servlet配置级获取初始化参数
- 第四章 JSP(一)
- 第五章 JSP(二)
- 第六章 MVC设计模式
- 第七章 Cookie
- 第八章 Session
- 练习 二 . 简易版购物车
- 第九章 EL表达式
- 第十章 JSTL
- 第十一章 过滤器
- 第十二章 监听器
- 第十三章 文件的上传与下载
- 复习总结
- 如何手动启动Tomcat
- 如何修改Tomcat端口号
- 如何在web.xml中配置Servlet
- Servlet生命周期
- load-on-startup参数
- Servlet映射路径
- POST和GET的区别
- JSP中9个隐式对象及功能
- 请求转发及请求重定向的区别
- JSP指令有哪些
- 简述对MVC设计模式的理解
- 简述Cookie机制
- 简述Session机制
- HttpSession的生命周期
- Cookie和Session有什么区别
- 简述创建过滤器步骤
- 过滤器经典案例--统一编码字符集
- getParameter与getAttribute的区别
- JSP页面中可以包含哪些元素
- web应用中,是如何跟踪用户的
- InteliJ创建web项目