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的更多相关文章

  1. JavaWeb学习之什么JSP、JSP是如何工作的、JSP语言(各种指令和九大内置对象)、EL表达式简单使用(5)

    1.什么JSP * servlet:java编写的处理动态web的技术 * 特点:Java代码中嵌套html代码 * jsp * 特点:HTMl代码中嵌套java代码 * %tomcat%/conf/ ...

  2. JSP小记

    0.配置servlet的模板 1.找Jar文件:\Common\plugins (myeclipse.ini文件中查看) * com.genuitec.eclipse.wizards*.jar 2.找 ...

  3. java攻城师之路--复习java web之jsp入门_El表达式_JSTL标签库

    JSP 技术掌握:JSP语法 + EL + JSTL 为什么sun推出 JSP技术 ? Servlet 生成网页比较复杂,本身不支持HTML语法,html代码需要通过response输出流输出,JSP ...

  4. 复习java web之jsp入门_El表达式_JSTL标签库

    JSP 技术掌握:JSP语法 + EL + JSTL 为什么sun推出 JSP技术 ? Servlet 生成网页比较复杂,本身不支持HTML语法,html代码需要通过response输出流输出,JSP ...

  5. JSP错误页面处理的两种方式

    JSP错误页面处理的两种方式: 方法1(真能针对单一页面生效,不推荐): 出错页面实例 <%@ page language="java" contentType=" ...

  6. day08:软件系统的体系结构&Tomcat详解&Web应用&http协议

        day08 软件系统体系结构     常见软件系统体系结构B/S.C/S 1.1 C/S C/S结构即客户端/服务器(Client/Server),例如QQ: 需要编写服务器端程序,以及客户端 ...

  7. [转][Java]Jsp入门

    <% response.getOutputStream().write("123".getBytes()); %> 新建一个 Web Project 项目,jsp 文件 ...

  8. myeclipse学习总结一(在MyEclipse中设置生成jsp页面时默认编码为utf-8编码)

    1.每次我们在MyEclispe中创建Jsp页面,生成的Jsp页面的默认编码是"ISO-8859-1".在这种情况下,当我们在页面中编写的内容存在中文的时候,就无法进行保存.如下图 ...

  9. jsp前端实现分页代码

    前端需要订一page类包装,其参数为 private Integer pageSize=10; //每页记录条数=10 private Integer totalCount; //总记录条数 priv ...

随机推荐

  1. [转]map函数补充

    map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 例如,对于li ...

  2. Array方面Js底层代码学习记录

    一..clear() →Array function clear() { this.length = 0; return this; } 返回清除item的空数组. 例子: var fruits = ...

  3. 【贪心】Codeforces 349B.Color the Fence题解

    题目链接:http://codeforces.com/problemset/problem/349/B 题目大意 小明要从9个数字(1,2,--,9)去除一些数字拼接成一个数字,是的这个数字最大. 但 ...

  4. rem ~~ 你懂了吗?

    前端 开发的适配中 rem 有着举足轻重的位置,用好了,你就是神,用不好 ,直接GG:不好懵懵懂懂,要头头是道. 言归正传: 首先我们需要了解,css 布局的单位常用的有一下几种: 1.px (pix ...

  5. java中包的定义

    对包中的java程序进行编译(cmd) 编译:javac -d . Test.java 执行:java com.java.demo.Test package com.java public class ...

  6. How to preview html file in our browser at sublime text?

    sublime preview html.md open In Browser what should we do if we want to preview html file in our bro ...

  7. 冰精冻西瓜[P3787洛谷]

    题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有根树,琪露诺想要把它们冷冻起来慢慢吃. 这些西瓜蔓具有神奇的性质,可以将经过它的 ...

  8. ●Joyoi Dotp 驱逐猪猡

    题链: http://www.joyoi.cn/problem/tyvj-2610题解: 期望dp,高斯消元 对于每一种到达i点的方案,都存在一个概率p, 令dp[i]表示到达i点的期望次数,那么容易 ...

  9. ●BZOJ 3894 文理分科

    题链: https://vijos.org/d/ljt12138/p/58c696b8d3d8a16c62a248d4 (要权限号啊...用这个交吧) 题解: 题目大意:    N*M的矩阵,每个位置 ...

  10. HDU 5726 GCD 区间GCD=k的个数

    GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...