JSP(JavaServer Pages)
2016-10-05 本文已影响0人
qpanpan
- 简化Servlet编写的一门技术
- .jsp文件会被转换成.java文件,然后编译生成.class文件。
- 实际处理请求时会加载.class文件,然后创建对象去处理
- 通过URL直接访问。http://..../xx.jsp
语法
- <% %>。可嵌入java代码
<%
int a = 5;
out.println(a);
%>
- <%= %>。可嵌入表达式
<%=1+3+5*6 %>
MyEclipse新建.jsp文件
- 新建Java Web项目
Package Explorer -> 右键选择 Web Project -> Project Name处输入项目名称 -> Finish - 新建.jsp文件
WebRoot -> 右键选择 New -> Other -> 选择 JSP(Basic templates)
会看到生成的文件中包括如下的内容(默认编码“ISO-8859-1”,不能输入中文)
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title></title>
</head>
<body>
</body>
</html>
- 修改MyEclipse配置
- 修改jsp编辑器
.jsp文件 -> 右键 Open With -> MyEclipse JSP Editor(无预览效果) - 修改jsp默认编码
window -> Preferences -> MyEclipse -> Files and Editors -> JSP -> 修改Encoding 值为UTF-8
原理分析
浏览器请求的资源,是由服务器处理后返回的。所以服务器使用的文件和开发环境中的文件是两个文件。如下图所示的方式打开服务器端文件路径:\work\Catalina\localhost\项目名\org\apache\jsp
jsp.png打开.java文件,可以看到如下图所示内容(很明显,它是继承自HttpJspBase类的子类。它是Tomcat的一个类)
通过查看源码可以看到如下定义(其实它也是一个Servlet)
public abstract class HttpJspBase extends HttpServlet
在 _jspService 方法中可以看到request, response, out的定义,HTML标签的处理,java代码的处理
_jspService.png归纳
访问 http://..../xx.jsp 时,Tomcat服务器会根据xx.jsp来生成一个xx_jsp.java的文件,所有的html标签,java代码等都在_jspService方法中进行翻译拼接。然后服务器会加载该java文件,生成Servlet对象来处理请求、响应结果。
page指令
指令 | 含义 |
---|---|
@ page | |
language="java" | 生成java文件 |
contentType="text/html; charset=utf-8" | response.setContentType("text/html;charset=utf-8")。<br />返回给浏览器指示编码 |
pageEncoding="UTF-8" | 该.jsp文件的编码 |
import="java.io.FileOutputStream" | 引入第三方包 |
extends="" | 指定jsp继承的Servlet类 |
session="true\false" | 是否创建session |
autoFlush="true\false" | 指定out对象的缓冲区是否自动刷新 |
buffer="8kb" | 指定out对象的缓冲区大小 |
errorPage="xx.jsp" | 此jsp执行出错时跳转的错误页面 |
**isErrorPage="true\false" ** | 此jsp是否是错误页面 |
自定义错误页面
// error.jsp
<% @ page isErrorPage="true" %>
<%
//TODO 使用log4j来记录错误日志
exception.printStackTrace();
%>
// index.jsp
<% @ page errorPage="error.jsp" %>
全局配置:
// web.xml
<web-app>
// 可以写多个 error-page 标签,但一般使用一个来处理所有5xx异常
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsp</location>
</error-page>
//根据HTTP状态码处理错误(一般针对404)
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
</web-app>
简例
public class XXServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throw ServletException, IOException
{
// ...
// 在服务器内部传递数据到jsp
req.setAttribute("persons", list);
req.getRequestDispatcher("/xx.jsp").forward(req, resp);
// ...
// 302重定向
resp.sendRedirect("url");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throw ServletException, IOException
{
//...
}
}
<body>
<%=request.getAttributes("msg") %>
<%
List<Person> persons = (List<Persons>)request.getAttribute("persons");
for (Person person : persons)
{
%>
// <tr><td><%=person.getId() %><td></tr>
<%
}
%>
</body>
下一节 JSTL
简化jsp编写,大项目编码更友好