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 常用标签包括:

关于

<body>
    <jsp:forward page="/index.jsp"></jsp:forward>
    <jsp:include page="/public/foot.jsp"></jsp:include> <%-- 动态包含 --%>
</body>
<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. myeclipse学习总结一(在MyEclipse中设置生成jsp页面时默认编码为utf-8编码)

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

  5. jsp前端实现分页代码

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

  6. jsp中出现onclick函数提示Cannot return from outside a function or method

    在使用Myeclipse10部署完项目后,原先不出错的项目,会有红色的叉叉,JSP页面会提示onclick函数错误 Cannot return from outside a function or m ...

  7. jsp页面无法识别el表达式的解决方案

    今天在写一个springmvc的小demo时,碰到一个问题,在jsp页面中书写为${user.username}的表达式语言,在浏览器页面中仍然显示为${user.username},说明jsp根本不 ...

  8. 浅谈JSP中include指令与include动作标识的区别

    JSP中主要包含三大指令,分别是page,include,taglib.本篇主要提及include指令. include指令使用格式:<%@ include file="文件的绝对路径 ...

  9. 浅谈JSP注释

    HTML注释 JSP文件是由HTML尿急和嵌入的Java程序片段组成的,所以在HTML中的注释同样可以在JSP文件中使用.注释格式:<!--注释内容--> <!-- 欢迎提示信息! ...

随机推荐

  1. SQL Server 中怎么查看一个字母的ascii编码或者Unicode编码

    参考文章:微信公众号文章 在sql中怎么查看一个字符的ascii编码,so easy !! select ASCII('a') SELECT CHAR(97) charNum SELECT UNICO ...

  2. Sicily 1215: 脱离地牢(BFS)

    这道题按照题意直接BFS即可,主要要注意题意中的相遇是指两种情况:一种是同时到达同一格子,另一种是在移动时相遇,如Paris在(1,2),而Helen在(1,2),若下一步Paris到达(1,1),而 ...

  3. JAVA 设计模式 模板方法模式

    定义 模板方法模式 (Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成. 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模 ...

  4. public &lt;T&gt; void show(T t),void前面的泛型T是什么作用

    public <T>这个T是个修饰符的功能,表示是个泛型方法,就像有static修饰的方法是个静态方法一样. <T> 不是返回值,表示传入参数有泛型 public static ...

  5. 轻松了解Spring中的控制反转和依赖注入(二)

    紧接上一篇文章<轻松了解Spring中的控制反转和依赖注入>讲解了SpringIOC和DI的基本概念,这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作. 类 ...

  6. js的设计模式

    <Practical Common Lisp>的作者 Peter Seibel 曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通 ...

  7. 10.23lamp环境

    前序: 查考文章:http://www.cnblogs.com/mchina/archive/2012/11/28/2778779.html http://www.centos.bz/2011/09/ ...

  8. DP游戏开发随记9-日常,推箱子

    模型只有一个推的动作文件 日常,更新了一下推箱子的测试用例 4个dummy点,点乘判断是在那个面,然后射线检测墙壁.

  9. 解决input之间的空隙

    <!doctype html> <html> <head> <meta charset="UTF-8"> <meta name ...

  10. 设置N秒后执行某个方法或函数

    设置N秒后执行一个函数,最常用的是设置一个定时器,今天刚看到有这样一个函数,感觉还是比较简单实用的,就先记下来,免得忘记了. 5秒后执行pushSecondController这个函数 [self p ...