JavaWeb 后端 <五> 之 JSP 学习笔记

简介:

一、JSP简介

1、也是SUN公司推出的开发动态web资源的技术,属于JavaEE技术之一。由于原理上是Servlet, 所以JSP/Servlet在一起。

二、HTML、Servlet和JSP

1、HTML:静态页面,不能包含java代码,只能有HTML有关的标记

2、Servlet:写java代码,做页面的输出,不是很方便(开发效率很低)

3、JSP:HTML+java

三、输出当前的时间

复制代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>第一个JSP,输出当前的时间</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
    现在是:
    <%
        Date now = new Date();
        //out.write(now.toLocaleString());
    %>
    <%=now%>
  </body>
</html>
复制代码

 

四、JSP的原理及生命周期

1、JSP就是Servlet,学习好JSP的关键(语法),时刻想到他对应的Servlet。

 

2、时常翻阅JSP对应的Servlet源码

Work 中查找

五、JSP的语法

5.1 模板元素

指JSP中的那些HTML。开发时先编写模板元素,因为他们决定页面的外观。

5.2 Java程序片段

语法:<%java程序%>

出现在JSP对应Servlet的service方法中。

<%声明的变量:局部%>

 

5.3 Java表达式

语法:<%=表达式%>

 

  = 

小练习:作业

 Java程序片段和表达式练习

复制代码
<%@ page language="java" import="java.util.*,com.itheima.domain.Student" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Java程序片段和表达式练习</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
    <%
    List<Student> stus = new ArrayList<Student>();
    stus.add(new Student("牛骞","未知",19));
    stus.add(new Student("薛振宇","女性",59));
    stus.add(new Student("刘飞","男性",29));
    %>
    <!-- 表格的形式,打印出来 -->
    <table border="1" width="438">
        <tr>
            <th>姓名</th>
            <th>性别</th>
            <th>年龄</th>
        </tr>
        <%
        for(Student s:stus){
        %>
            <tr>
                <td><%=s.getName()%></td>
                <td><%=s.getGender() %></td>
                <td><%=s.getAge()%></td>
            </tr>
        <%
        }
        %>
    </table>
  </body>
</html>
复制代码

 

5.4 JSP声明

语法:<%!

 

%>

作用:定义JSP对应Serlvet的成员(变量和方法、静态方法)

 

复制代码
<%@page import="java.lang.reflect.Method"%>
<%@ page language="java" import="java.util.*" session="true" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>JSP声明</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
    <%!
    int i=100;//不建议
    
    public void m1(){
        //out.write("hello");//不可以,因为out是service中的局部变量
    }
    static{
        System.out.println("oyeah");
    }
     %>
     
     <!-- 
     hello
      -->
      <%--shit --%>
      
      <%=session.getId() %>
  </body>
</html>
复制代码

 

 

注意:开发中很少用。面试和考试经常考。

5.5 JSP注释

语法:<%--这是JSP注释--%>

 

作用:注释掉的代码,JSP引擎不会翻译到Servlet源码中。要注意和HTML注释的区别。

html注释:<!--这是html注释-->

5.6 JSP指令:

简介:

指令是为JSP引擎设计的。而只是告诉引擎如何处理JSP页面中的其余部分(非指令部分);

基本语法格式:<%@指令 属性1=”值1” ....%>.

一般把指令放在JSP页面的顶部(不是必须的)

指令的属性可以写在一个指令的中,也可以分开写:比如:

<%@指令 属性1=”值1” 属性2=”值2”%>.

等价于:

<%@指令 属性1=”值1” %>.

<%@指令 属性2=”值2”%>.

 

page:

属性:

language:告知引擎,脚本用的是java。默认java,支持java。不写也行。

extends:告知引擎,JSP对应的Servlet的父类是哪个。不需要写,也不要改。

*import:告知引擎,导入哪些包。

注意:引擎自动导入:java.lang.*;javax.servlet.*;javax.servlet.http.*;javax.servlet.jsp.*;

 

导入的形式:

<%@page import=”java.util.Date,java.util.UUID”%>或者:

<%@page import=”java.util.Date”%>

<%@page import=”java.util.UUID”%>  用Eclipse:Alt+/ 自动导入

*session:告知引擎是否产生HttpSession对象,即是否在代码中调用request.getSession()。默认值true。

buffer:JspWriter用于输出JSP的内容到页面上。告知引擎,设定他的缓存大小。默认8Kb。

*errorPage:告知引擎,当前页面出现了异常,应该转发到哪个页面上(路径写法:/代表着当前应用)

 

配置全局错误页面:web.xml

 

*isErrorPage:告知引擎,是否抓住异常。如果该属性为true,页面中就可以使用exception隐含对象,打印异常的详细信息。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isErrorPage="false"%>

 

<%=exception.getMessage()%>

 

*contentType:告知引擎,响应正文的MIME类型。

contentType=”text/html;charset=UTF-8” 相当于response.setContentType(“<%=exception.getMessage() %>”);

 

*pageEncoding:告知引擎,翻译JSP时(要从磁盘上读JSP文件)所用的码表。

pageEncoding 要和存在磁盘上的编码一致

在编译器中(myeclipse eclipse)不用担心,pageEncoding修改后 会自动转换为pageEncoding的编码

 

 

pageEncoding=”UTF-8”:相当于,告知了引擎用UTF-8读jsp,还response.setContentType(“text/html;charset=UTF-8”);

 

*isELIgnored:告知引擎,是否忽略EL表达式。默认值是false,不忽略。 ${1+1}

 

总结:属性众多。一般都用的默认值。用起来很简单,最简单的形式:

<%@ page  pageEncoding="UTF-8"%>

include:

包含

属性:file,以”/”开头,就代表着当前应用。

 

1
<%@include file="/07include.jsp"%>

 

taglib:

引入外部的标签。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

 

uri:外部的标签的uri地址,好比名称空间

prefix:前缀。

 

六、JSP中的转发和包含

1、转发:

<jsp:forward page="/10forward.jsp"></jsp:forward>

JSP的内置标签。

2、参数:不能单独使用

向目标传递请求参数

 

3、包含:(面试题)

静态包含:<%@include%>

 <%@include file="included.jsp"%>
  <%=data%>

 

动态包含:其余的

<jsp:include page=””/>

 

 <%--
  RequestDispatcher rd = request.getRequestDispatcher("included.jsp");
  rd.include(request, response);
   --%>
  <jsp:include page="included.jsp"></jsp:include>

动态包含是把结果加在一起 不能使用包含的变量 静态可以使用包含的变量 加在一起了  动态的无法使用 data

 

总结:用标签可以少些java脚本。

七、JSP的九个隐含对象:(面试题)

JSP对应的Servlet的service方法中的局部变量

JSP隐含对象名称

类型

备注

request

javax.servlet.http.HttpServletRequest

 

response

javax.servlet.http.HttpServletResponse

 

session

javax.servlet.http.HttpSession

page指令有开关

application

javax.servlet.ServletContext

 

config

javax.servlet.ServletConfig

 

page

javax.servlet.http.HttpServlet

当前jsp对应Servlet的实例引用

exception

java.lang.Throwable

page指令有开关

out

javax.servlet.jsp.JspWriter

字符输出流。相当于PrintWriter

pageContext

javax.servlet.jsp.PageContext

很重要

 

八、JSP中的异常处理

1、运行时异常

 

以上情况找JSP对应的Servlet源码。

2、出现的错误(语法不对)

 

九、PageContext抽象类(很重要)

1、本身是一个域(范围)对象,还能操作其他3个域对象中的属性

l  页面范围(Page):

void setAttribute(String name,Object value);

void removeAttribute(String name);

Object getAttribute(String name);

l  操作其他域对象中的属性:

void setAttribute(String name,Object value,int scope);

void removeAttribute(String name,int scope);

Object getAttribute(String name,int scope);

 

int scope:常量,PageContext   PAGE_SCOPE(页面) REQUEST_SCOPE(请求)SESSION_SCOPE(会话)APPLICATION_SCOPE(应用)

l  在四个范围中依次查找指定名称对象的方法:

PAGE(页面) REQUEST(请求)SESSION(会话)APPLICATION(应用)

 

在使用

请求转发 和重定向 和 一次session(一次会话 ) 和 一次 应用 关闭

4中情况 下的 的数据是否 流失 。

在例子中会 解释 4中 对象的 保存 时间 。

当请求转发 的 时候 ,page(页面 )的信息消失了

当 重定向的时候, page(页面) Request(请求)的信息消失了

当重新打开一个会话的时候,page(页面) Request(请求) 和 session(会话)的信息就消失了

当应用 关闭的时候 ,所有的信息都消失了。

 

案例:

01.jsp

 

 请求转发 :

  <jsp:forward page="2.jsp"></jsp:forward>

重定向:

<% response.sendRedirect("2.jsp"); %>

 

02.jsp

 

 

 

 

 

Object findAttribute(String name);

 

2、获取其他八个JSP隐含对象(自定义标签时用)

PageContext.getRequest();

getServletContext();

getServletConfig();

getException();

get...

3、提供转发和包含的简易方法

 

 

pageContext.include(String url);

十、四大域对象

 

实际开发中:存放数据的。

 

PageContext:页面范围。最小。开发中很少用。演示代码。

ServletRequest:请求范围。不同的资源,只有用转发。    如:学生信息,一次请求有用 下次 就没有 用了

HttpSession:会话范围。多次请求共享数据,但不同的客户端不能共享。

ServletContext:应用范围。最大。尽量少用。用时要做同步处理。

十一、JSP开发的最佳实践(怎么 用好?)

Servlet:擅长写Java代码逻辑,不擅长输出html的内容。

开发中作为:控制器。

JSP:不擅长写Java代码逻辑,擅长显示结果。

开发中作为:视图(显示结果)

 

 

 

十二、JavaBean的概念

1、JavaBean又称之为POJO(Plain Old Java Object)、VO(Value Object)、DO(Data Object)

2、JavaBean的书写规范

  a、必须是public的

  b、提供默认的构造方法

  c、字段都是私有的: private String username;

  d、提供公有的getter或setter方法:属性。

    getUsername():读属性,属性名:username.

    setUsername(String username):写属性,属性名:username。

     注意:private boolean married;   getMarried()===isMarried()

  e、一般需要实现java.io.Serializable接口。

 

结论:JavaBean在JavaEE开发中,主要担当封装数据用的。

十三、JSP中使用JavaBean

1、导入JavaBean:用page指令的import

2、声明JavaBean:

 

3、获取属性:

 

如果属性是null,那么界面就显示null。

4、设置属性:

注意:类型的转换问题

 

可以使用请求参数设置JavaBean的属性。

 

5、JavaBean的存活范围:

声明JavaBean时,指定scope属性。默认值page,当前页面范围。

可选值:page|request|session|application

 

总结:JSP+JavaBean,开发模型,Model1(模型1)

 

注意: 问题   JspWriter和PrintWriter 输出的区别

<%

  out.write("a");//jspwriter

  out.flush();

  response.getWriter().write("b");

%>

 

默认 缓存 是 8kb  可在page里 给 buffer 设属性值 修改 缓存的大小

 

当 buffer=0kb 的时候 out.write 将直接输出到Response 不会存在 JspWriter的缓存 里面。

 

或者 在代码中添加  out.flush(); 和也是输出ab

 

当缓存满的时候会刷到Response里面去

  out.write("aaaaac");//jspwriter

  out.flush();

  response.getWriter().write("b");

如果 aaaaa刚好占满缓存空间,输出的结果 为 aaaaa b c

aaaaa占满缓存空间,会刷到 Response里 接着 c 会存在 缓存中, b写到Response中,jsp结束时,jspwriter会将 c刷到Response中 输出的结果就是 aaaaabc

 

所以输出流 就用 out.writer输出流。

目录
相关文章
|
1月前
|
Java 容器
【学习笔记】Jsp与Servlet技术
【学习笔记】Jsp与Servlet技术
62 0
|
2月前
|
存储 前端开发 Java
JavaWeb基础6——Request,Response,JSP&MVC
Request继承体系、获取请求头行体的方法、IDEA使用模板创建Servlet、请求参数中文乱码解决、请求转发、Respones重定向、Response响应字节字符数据、JSP、EL 表达式、JSTL标签、MVC模式和三层架构
JavaWeb基础6——Request,Response,JSP&MVC
|
3月前
|
JavaScript 前端开发 程序员
后端程序员的前端必备-jQuery核心学习笔记
后端程序员的前端必备-jQuery核心学习笔记
57 13
|
5月前
|
消息中间件 Java Spring
JavaWeb后端开发Spring框架之消息 消息队列案例--订单短信通知
JavaWeb后端开发Spring框架之消息 消息队列案例--订单短信通知
49 0
|
5月前
|
数据可视化 Java 持续交付
JavaWeb后端开发之Maven 2024介绍安装测试详解
JavaWeb后端开发之Maven 2024介绍安装测试详解
73 0
|
5月前
|
SQL druid Java
javaweb案例实训之基于jsp和servlet的用户管理开发[增删改查及登录注销]
javaweb案例实训之基于jsp和servlet的用户管理开发[增删改查及登录注销]
34 0
|
5月前
|
SQL 数据可视化 数据库
基于jsp+servlet的javaweb实现最基本的用户注册登陆注销功能
基于jsp+servlet的javaweb实现最基本的用户注册登陆注销功能
23 0
|
6月前
|
前端开发 JavaScript Java
Jsp在Javaweb中扮演什么角色?
Jsp在Javaweb中扮演什么角色?
54 1
|
6月前
|
SQL 缓存 Oracle
JavaWeb之JSP(下)
这篇文档是关于Java Web中JSP(Java Server Pages)技术的主要内容包括:JSP的常用命令使用,EL表达式的概念,和使用,JSTL表达式的概念和使用方式的总结.
|
6月前
|
开发框架 前端开发 Java
JavaWeb之JSP(上)
这篇文档是关于Java Web中JSP(Java Server Pages)技术的介绍。作者首先说明了内容来源于个人在CSDN的原创文章,并遵循CC 4.0 BY-SA版权协议。文档主要内容包括:JSP的基本概念,它是一种动态网页技术,用于将页面逻辑与设计分离,便于开发快速、跨平台的Web应用。接着,讨论了JSP出现的原因,即为了改进servlet展示信息的不便。文档还详细介绍了如何在JSP中嵌入Java代码,包括声明、表达式和程序代码标签的使用,以及page指令的示例。