day08 JSP
- day08 JSP
Author:相忠良
Email: ugoood@163.com
起始于:April 26, 2018
最后更新日期:May 1, 2018
声明:本笔记依据传智播客方立勋老师 Java Web 的授课视频内容记录而成,中间加入了自己的理解。本笔记目的是强化自己学习所用。若有疏漏或不当之处,请在评论区指出。谢谢。
涉及的图片,文档写完后,一次性更新。
day08 JSP
1. jsp 入门和 jsp 运行原理

案例:新建 day08 web 工程,建立 1.jsp 文件,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>jsp入门(输出时间)</title>
</head>
<body>
当前时间值是:
<%
Date date = new Date();
out.write(date.toLocaleString());
%>
</body>
</html>
浏览器输入http://localhost:8080/day08/1.jsp,查看结果。输出的网页源码为:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>jsp入门(输出时间)</title>
</head>
<body>
当前时间值是:
2018-4-27 11:44:50
</body>
</html>
看下面内容,找原因,为啥网页变成上面那样。
查看C:\apache-tomcat-8.5.9\work\Catalina\localhost\day08\org\apache\jsp\_1_jsp.java的代码片段:
public final class _1_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
...
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("\r\n");
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
out.write("<html>\r\n");
out.write(" <head>\r\n");
out.write(" <title>jsp入门(输出时间)</title>\t\r\n");
out.write(" </head>\r\n");
out.write(" \r\n");
out.write(" <body>\r\n");
out.write(" \t 当前时间值是:\r\n");
out.write(" ");
Date date = new Date();
out.write(date.toLocaleString());
out.write("\r\n");
out.write(" \r\n");
out.write(" </body>\r\n");
out.write("</html>\r\n");
···
从上面例子看出,jsp 文件被 tomcat 翻译成了 servlet 程序。
人们长时间实践结果总结出的 servlet 和 jsp 的最佳实践是:servlet 写逻辑,产生数据;jsp 做数据展示。
通过上面的代码,看到jsp常用的对象有:
- request
- response
- session
- application
- page
2. jsp 语法
简单、枯燥但有效!
- jsp 模板元素
- jsp 脚本表达式
- jsp 脚本片段
- jsp 注释
- jsp 指令
- jsp 标签
- jsp 内置对象
- 如何查找 jsp 页面中的错误
2.1 jsp 模板元素:jsp 页面中的 html 内容。它定义了网络基本骨架,即定义了页面结构和外观。
2.2 jsp 脚本表达式:<%= %>,作用是用于向浏览器输出数据。

示例如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>jsp入门(输出时间)</title>
</head>
<body>
当前时间值是:
<%
Date date = new Date();
String time = date.toLocaleString();
/* out.write(date.toLocaleString()); 2种输出方式*/
%>
<%=time %>
</body>
</html>
2.3 jsp 脚本片段:


<%int x=10; %>
aaa
<%out.print(x); %>
之所以能相互访问,是因为它们都在同一个 servlet 程序的 service 方法里。

2.4 jsp 声明

<%
// 这是不行的
public void run(){
}
%>
<%!
// 这个就可以
public void run(){
}
%>
上面的 jsp 声明,将翻译到 servlet 外面去,成为独立的方法。jsp 声明中可以写静态代码块。
2.5 jsp 注释
<%-- jsp 注释--%>
而这个<!-- html 注释 -->。若在 jsp 片段中用了 html 注释,这个注释内容会传给浏览器,即使浏览器不显示。
2.6 jsp 指令





关于 errorPage 属性,jsp 出异常时,跳转到errorPage所指示的位置。如下:
抛异常的页面 /5.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" errorPage="/errors/error.jsp"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>errorPage属性展示</title>
</head>
<body>
<%
int x = 1/0;
%>
</body>
</html>
出错致歉页面/errors/error.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'error.jsp' starting page</title>
</head>
<body>
对不起,出错了 <br>
</body>
</html>
浏览器访问http://localhost:8080/day08/5.jsp 查看结果。
我们还可通过 web.xml 对整个 web 应用的错误处理做 全局的配置! 配置如下:
web.xml 添加内容如下:
<error-page>
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/errors/error.jsp</location>
</error-page>
<error-page>
<exception-code>404</exception-code>
<location>/errors/404.jsp</location>
</error-page>
<error-page>
<exception-code>500</exception-code>
<location>/errors/500.jsp</location>
</error-page>
上面代码还给出了 404 错误码的展示页面。 出500错误时,输出“对不起,服务器内部出错”。
网站开发结束,上线部署时,这些东西一定要配上。
方立勋老师提示,此时 error.jsp 页面大小不要超过1KB,否则不会出现实验效果。
另外 errorPage 优先级高于 web.xml 中的错误处理。
isErrorPage="true|false" :默认为false。 若某 jsp 页面为错误处理页面,应设置这个属性为 true。此时,异常对象会传给该错误处理页面,随后该页面可将异常记录在 log 中。

2.7 jsp 的乱码问题解决
Tomcat 6 以上的服务器,jsp 中不会出现乱码问题。
2.8 jsp 语法 - include 指令
包含,分静态包含和动态包含2种。
静态包含,又叫编译时包含,它包含的所有jsp会编译成1个servlet
涉及3个jsp文件:6.jsp,head.jsp,foot.jsp,代码如下:
6.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>jsp包含</title>
</head>
<body>
<%@ include file="/public/head.jsp" %>
aaaaaaaaaa<br/>
<%@ include file="/public/foot.jsp" %>
</body>
</html>
/public/head.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
我是 head <br/>
/public/foot.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
我是 foot <br/>
动态包含,也称运行时包含。包含的内容被编译成3个jsp文件。
<body>
<% request.getRequestDispatcher("/public/head.jsp").include(request, response); %>
<% response.getWriter().write("aaaaaaaaaaaaa<br/>"); %>
<% request.getRequestDispatcher("/public/foot.jsp").include(request, response); %>
</body>
3. jsp 九大隐式对象简介
jsp 九大隐式对象:
- request
- response
- session
- application
- config
- page
- exception
- out
- pageContext
out 和 pageContext 是 jsp 独有的对象。
3.1 jsp 九大隐式对象 - out 对象
例子:
8.jsp:
<body>
<%
out.write("hahahahaha");
response.getWriter().write("woowowowowo");
%>
</body>
和
<body>
hahahahaha
<%
response.getWriter().write("woowowowowo");
%>
</body>
输出均为:woowowowowo hahahahaha。建议用jsp输出只用 out 对象。输出那结果的原因就是 out 带缓冲。
3.2 jsp 九大隐式对象 - pageContext 对象(jsp 中最重要的对象,代表 jsp 页面的运行环境)


pageContext(又称 page 域)域只在当前 jsp 页面有效,它是 web 开发中 4 个域(其他3个:request(请求范围可用), session(会话范围可用), ServletContext(web 应用程序范围内都可用))中,范围最小的域。
查看 Jsp API
pageContext 对象的方法:
- setAttribute(String name, Object value)
- getAttribute(String name)
- removeAttribute(String name)
pageContext 访问其他域的方法:
- setAttribute(String name, int scope)
- getAttribute(String name, int scope)
- removeAttribute(String name, int scope)
代表各个域的常量:
- PageContext.APPLICATION_SCOPE
- PageContext.SESSION_SCOPE
- PageContext.REQUEST_SCOPE
- PageContext.PAGE_SCOPE
findAttribute 方法,重点,查找各个域中的属性。
pageContext.findAttribute("data");
findAttribute() 依次查找 page -> request -> session -> application 这4个域,若找不到,返回null。
EL表达式${data}就相当于执行了pageContext.findAttribute("data");
例子:
pageContext 对象成为管理其他域的入口。12.jsp,如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>pageContext 对象访问其他域</title>
</head>
<body>
<%
request.setAttribute("data", "aaa");
/* pageContext 对象成为管理其他域的入口 */
String data = (String)PageContext.getAttribute("data", pageContext.REQUEST_SCOPE);
out.write(data);
%>
</body>
</html>
pageContext 其他常用发法:forward 和 include,如下:
<%
pageContext.forward("1.jsp");
pageContext.include("/foot.jsp");
%>
4. jsp 常用标签
Jsp 标签(Jsp Action):也叫 jsp 动作元素,它用于在 jsp 页面中提供业务逻辑功能,避免在 jsp 页面中直接编写 java 代码(造成 jsp 页面难以维护)。
jsp 常用标签包括:
<jsp:forward><jsp:include>动态包含<jsp:param>带数据给别人
关于 <jsp:forward> 和 <jsp:include> 的例子,14.jsp:
<body>
<jsp:forward page="/index.jsp"></jsp:forward>
<jsp:include page="/public/foot.jsp"></jsp:include> <%-- 动态包含 --%>
</body>
jsp:param 用来带数据给别人,例如:
<body>
<jsp:forward page="/servlet/ServletDemo1">
<jsp:param value="xxxx" name="username"/>
</jsp:forward>
</body>
cn.wk.web.servlet.ServletDemo1 获取传来的数据,代码如下:
public class ServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String username = req.getParameter("username");
System.out.println(username);
}
}
浏览器访问 14.jsp,控制台输出xxxx。
另外,value 中也可传入脚本表达式,如下:
<% int x = 10 %>
<jsp:param name="abc" value="<%=x%>"/>
5. jsp 映射
jsp 映射:就是把1个 jsp 映射到一个 web 地址上去。它和 servlet 程序映射是同样道理。需在 web.xml 文件中配置。
如下:
<servlet>
<servlet-name>xxx</servlet-name>
<jsp-file>/14.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>xxx</servlet-name>
<url-pattern>/15.html</url-pattern>
</servlet-mapping>
6. 页面美化专题-div和css基础及案例
用到再学!
day08 JSP的更多相关文章
- JavaWeb学习之什么JSP、JSP是如何工作的、JSP语言(各种指令和九大内置对象)、EL表达式简单使用(5)
1.什么JSP * servlet:java编写的处理动态web的技术 * 特点:Java代码中嵌套html代码 * jsp * 特点:HTMl代码中嵌套java代码 * %tomcat%/conf/ ...
- JSP小记
0.配置servlet的模板 1.找Jar文件:\Common\plugins (myeclipse.ini文件中查看) * com.genuitec.eclipse.wizards*.jar 2.找 ...
- java攻城师之路--复习java web之jsp入门_El表达式_JSTL标签库
JSP 技术掌握:JSP语法 + EL + JSTL 为什么sun推出 JSP技术 ? Servlet 生成网页比较复杂,本身不支持HTML语法,html代码需要通过response输出流输出,JSP ...
- 复习java web之jsp入门_El表达式_JSTL标签库
JSP 技术掌握:JSP语法 + EL + JSTL 为什么sun推出 JSP技术 ? Servlet 生成网页比较复杂,本身不支持HTML语法,html代码需要通过response输出流输出,JSP ...
- JSP错误页面处理的两种方式
JSP错误页面处理的两种方式: 方法1(真能针对单一页面生效,不推荐): 出错页面实例 <%@ page language="java" contentType=" ...
- day08:软件系统的体系结构&Tomcat详解&Web应用&http协议
day08 软件系统体系结构 常见软件系统体系结构B/S.C/S 1.1 C/S C/S结构即客户端/服务器(Client/Server),例如QQ: 需要编写服务器端程序,以及客户端 ...
- [转][Java]Jsp入门
<% response.getOutputStream().write("123".getBytes()); %> 新建一个 Web Project 项目,jsp 文件 ...
- myeclipse学习总结一(在MyEclipse中设置生成jsp页面时默认编码为utf-8编码)
1.每次我们在MyEclispe中创建Jsp页面,生成的Jsp页面的默认编码是"ISO-8859-1".在这种情况下,当我们在页面中编写的内容存在中文的时候,就无法进行保存.如下图 ...
- jsp前端实现分页代码
前端需要订一page类包装,其参数为 private Integer pageSize=10; //每页记录条数=10 private Integer totalCount; //总记录条数 priv ...
随机推荐
- vue2.0 带头冲锋(打包时,小心萝卜坑)
距离上一期,时间间距可能有点长.谁让本人处于兴奋状态,生活已经不能自理. 哈哈哈,嗯,正经一下, 在已有的经验里总结一下那些容易抓狂的坑! 起因:npm run build 打包 本地运行,你以为可以 ...
- 【省带宽、压成本专题】从产品架构来看,PCDN如何节流50%
过去几年,我们一直在视频省流量方面潜心钻研,取得不俗的成果.本次"省带宽.压成本"系列一共会推出六篇文章,从技术迭代.硬件更新等角度出发,向大家介绍节省CDN流量,降低视频播放成本 ...
- 洛谷 P3258 [JLOI2014]松鼠的新家(树链剖分)
题目描述松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想邀请小熊维尼前来 ...
- 0316-关于js 注意事项
js:脚本语言,控制网页的行为(特效,表单验证) /* 这是多行注释 *///这是单行注释 js问题及注意事项: JavaScript 对大小写是敏感的 多写注释.提示性文字要说明白 定义变量时最好加 ...
- [MongoDB教程] 1.简介
MongoDB (名称来自「humongous (巨大无比的)」), 是一个可扩展的高性能,开源,模式自由,面向文档的NoSQL,基于 分布式 文件存储,由 C++ 语言编写,设计之初旨在为 WEB ...
- Python数据类型和数据操作
python数据类型有:int,float,string,boolean类型.其中string类型是不可变变量,用string定义的变量称为不可变变量,该变量的值不能修改. 下面介绍python中的l ...
- Mysql之基本操作与数据类型
进入mysql: mysql -hlocalhost -uroot -p; mysql -uroot -p密码; 查看帮助文档: help 查看名 database(s); 创建数据库: create ...
- 用redis的订阅发布解决了扫码支付实时响应的问题
一.场景描述: PC收银台的浏览器展示了收款二维码,用户扫了支付二维码,支付完成后,浏览器需要实时响应支付结果. 二.问题描述: 扫码支付的支付结果一般通过服务端回调和主动查询来获取,显示二维码之后, ...
- 【BZOJ3991】【SDOI2015】寻宝游戏
Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然 ...
- Codeforces Round#409/VK-Cup 2017 Round2
来自FallDream的博客,未经允许,请勿转载,谢谢. 和ditoly组队打VK-Cup,起了个名字叫Vegetable Chicken(意思显然),然后昨天我做AB他切C 很不幸的是.....我写 ...