前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Web阶段:第十二章:JSP动态页面

Web阶段:第十二章:JSP动态页面

作者头像
Java廖志伟
发布2022-09-28 11:02:44
7040
发布2022-09-28 11:02:44
举报
文章被收录于专栏:高级开发进阶高级开发进阶

作者:java_wxid

**1.什么是Jsp?** jsp是java server page,java的服务器页面。 2.为什么要学习jsp技术 因为jsp技术可以很好的解决在Servlet程序中回传数据是html内容,这个问题。

在Servlet程序中回传html数据,为什么是个问题?

代码语言:javascript
复制
public class PrintHtml extends HttpServlet {
    private static final long serialVersionUID = 1L;    
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // 解决响应乱码
        response.setContentType("text/html; charset=UTF-8");    		
        // 回传一个html页面的数据
        PrintWriter writer = response.getWriter();
        writer.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
        writer.write("<html>\r\n");
        writer.write("	<head>\r\n");
        writer.write("		<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
        writer.write("		<title>Insert title here</title>\r\n");
        writer.write("	</head>\r\n");
        writer.write("	<body>\r\n");
        writer.write("		这是hello的html页面\r\n");
        writer.write("	</body>\r\n");
        writer.write("</html>");
    }
}

可以看到创建一个html页面非常繁琐

3.如何创建一个jsp动态页面。

在这里插入图片描述
在这里插入图片描述

**4.如何修改jsp页面的默认编码?**

在这里插入图片描述
在这里插入图片描述

小结: html和jsp一样。都在放在webContent目录下 WebContent a.html =====>>>> http://ip:port/工程名/a.html b.jsp =====>>>> http://ip:port/工程名/b.jsp

5.jsp的本质是什么。 jsp本质上,也是一个Servlet程序。

当我们第一次访问jsp页面的时候,Tomcat服务器会把jsp翻译成为java源文件,然后保存到Tomcat服务器的work目录下。 双击Tomcat v7.0 Server at localhost [Started ,Synchronized],弹出如下窗口

在这里插入图片描述
在这里插入图片描述

jsp生成的class文件和java源文件

在这里插入图片描述
在这里插入图片描述

我们打开a_jsp.java源文件,不难发现生成的这个类继承了HttpJspBase类。

在这里插入图片描述
在这里插入图片描述

然后我们再通过查看源代码发现,HttpJspBase又继承了HttpServlet程序。所以生成的类本质上也是一个Servlet程序。

在这里插入图片描述
在这里插入图片描述

jsp翻译成为Servlet源文件,全名规则(了解大概): a.jsp 翻译之后命名的全名为:a_jsp.java b.jsp 翻译之后命名的全名为:b_jsp.java

源文件名.jsp 翻译之后是: 源文件名_jsp.java

6.jsp的三种语法 a)jsp头部的page指令

<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>

i.language属性 值只能是java。表示jsp翻译之后是java源文件。 ii.contentType属性 返回的内容类型。response.setContentType的参数值。 iii.pageEncoding属性 是当前jsp页面的字符集 iv.import属性 可以在jsp页面中导入需要的包和类。 v.autoFlush属性 设置jsp中的out输出流是否自动刷新 默认是true(一般都不会修改自动刷新为false), 当jsp中out输出流的缓冲区满了之后,就会自动刷新。 vi.buffer属性 设置jsp中的out输出流的缓冲区大小。默认是8kb

在这里插入图片描述
在这里插入图片描述

vii.errorPage属性 设置当jsp运行时出错,就自动跳转的页面。 viii.isErrorPage属性 设置当前jsp是否是错误页面,默认是false,表示不启动异常对象。设置为true,可以启用Exception异常对象 ix.session 属性 设置访问jsp的时候,是否创建Session会话对象。默认是true. x.extends 属性 extends继承属性是预留给服务器厂商使用的。(基本都不会动)

b)jsp中的三种脚本 i.声明脚本(几乎不用) 声明脚本的格式: <%! 声明代码 %>

声明脚本可以声明在类的内部定义的代码。

1.我们可以定义全局变量。 2.定义static静态代码块 3.定义方法 4.定义内部类

测试代码:

代码语言:javascript
复制
    <body>
<!-- 1.我们可以定义全局变量。 -->
        <%! 
            int i = 0;
            private static Map<String,Object> map = new HashMap<String,Object>();
        %>
<!-- 2.定义static静态代码块 -->
        <%!
            static {
                map.put("key1", "value1");
                map.put("key2", "value2");
                map.put("key3", "value3");
            }
        %>
<!-- 3.定义方法 -->
        <%!
            public void abc(){
                System.out.println("国哥真帅!");
            }
        %>
<!-- 4.定义内部类 -->
        <%!
            private static class A {
                private String name;
            }
        %>
    </body>
在这里插入图片描述
在这里插入图片描述

ii.表达式脚本 表达式脚本的格式:<%=表达式 %>

表达式脚本可以在jsp页面中输出数据。 表达式脚本都会被翻译到_jspService方法中 表达式脚本翻译之后都是out.print进行输出 表达式脚本中的表达式不能以分号结尾 由于表达式脚本翻译之后都在_jspService方法中,所以在_jspService方法中的对象都可以在表达式脚本中直接使用。

1.输出整型 2.输出浮点型 3.输出字符串 4.输出对象

在这里插入图片描述
在这里插入图片描述

iii.代码脚本 代码脚本的格式是: <% 代码脚本 %> 代码脚本可以写以方法中可以写的任何代码。 代码脚本翻译之后都在_jspService方法中

1.代码脚本----if 语句 2.代码脚本----for 循环语句 3.翻译后java文件中_jspService方法内的代码都可以写

在这里插入图片描述
在这里插入图片描述

c)jsp中的三种注释 i.html注释 <!-- html注释 --> 翻译之后是out.write输出到客户端。

ii.java注释 // 单行注释 /* 多行注释 */ Java 注释 翻译之后会原封不动翻译到源代码中

iii.jsp注释 <%-- 这是jsp注释 --%> jsp注释 在翻译的时候,会被忽略掉

7.jsp九大内置对象

在这里插入图片描述
在这里插入图片描述

8.jsp四大域对象 pageContext ====>>>> request ====>>>>> session =====>>>>> application 域对象 数据操作范围 pageContext 当前jsp页面 request 同一次请求 session 同一次会话(打开浏览器,访问服务器之后会话就打开了,只要浏览器不关。会话都在) application 一个web工程

四个域的数据操作范围从小到大分别是:pageContext====>>>request====>>>session=====>>>>application

四个域都可以用来保存数据,如何挑选使用? 四个域从小到大进行优先选择。

Context1.jsp页面

代码语言:javascript
复制
    <body>
        <h1>Context1.jsp页面</h1>
        <%
            pageContext.setAttribute("key", "pageContextData");
            request.setAttribute("key", "requestData");
            session.setAttribute("key", "sessionData");
            application.setAttribute("key", "applicaionData");
        %>	
        pageContext域:<%=pageContext.getAttribute("key") %><br/>
        request域:<%=request.getAttribute("key") %><br/>
        session域:<%=session.getAttribute("key") %><br/>
        application域:<%=application.getAttribute("key") %><br/>
        <%
// 			request.getRequestDispatcher("/Context2.jsp").forward(request, response);
        %>
    </body>

Context2.jsp页面

代码语言:javascript
复制
<body>
    <h1>Context2.jsp页面</h1>
    pageContext域:<%=pageContext.getAttribute("key") %><br/>
    request域:<%=request.getAttribute("key") %><br/>
    session域:<%=session.getAttribute("key") %><br/>
    application域:<%=application.getAttribute("key") %><br/>
</body>

9.jsp中的out输出和response.getWriter输出的区别

在这里插入图片描述
在这里插入图片描述

现在我们都知道out和response都可以往页面上输出数据。 通过观察jsp翻译之后的源码我们发现,都是使用out进行输出。所以我们以后也是统一使用out进行输出操作。 out.write 可以输出字符串 out.print 可以输出任意数据 深入浅出:统一使用out.print进行输出

10.jsp的常用标签 a)jsp静态包含

代码语言:javascript
复制
<%--
    <%@ include file="" %> 是静态包含。
        静态包含地址中打头的斜杠,
        表示http://ip:port/工程名/	映射到代码的WebContent目录
        
        
    静态包含,其实本质上,只是把被包含的jsp页面的内容。原封不动的拷贝到被包含的位置执行。
    静态包含,不会翻译被包含的jsp文件。
 --%>
<%@ include file="/include/footer.jsp" %>

b)jsp标签-动态包含

代码语言:javascript
复制
<%--
        <jsp:include page=""></jsp:include> 是动态包含
            动态包含地址中打头的斜杠,
            表示http://ip:port/工程名/	映射到代码的WebContent目录			  			
        动态包含,会把被包含的jsp页面也翻译成为servlet程序。
        动态包含,会翻译成为如下语句:
        JspRuntimeLibrary.include(request, response, "/include/footer.jsp", out, false);
        等价于把request,response,out对象传递给footer.jsp所翻译出来的Servlet去执行使用。
        动态包含,还可以传递参数
     --%>
    <jsp:include page="/include/footer.jsp">
        <jsp:param value="wzg168" name="username"/>
        <jsp:param value="123456" name="password"/>
</jsp:include>

动态包含底层原理:

在这里插入图片描述
在这里插入图片描述

c)jsp标签-转发 <jsp:forward page="/Context2.jsp"></jsp:forward> 请求转发功能, 跟request.getRequestDispatcher("/Context2.jsp").forward(request, response);代码功能完全一样 11.静态包含和动态包含的区别

在这里插入图片描述
在这里插入图片描述

随着整个javaEE技术的不断升级,那么jsp这种技术,在整个javaEE体系中的定位慢慢发生变化。 jsp的定位慢慢就变成了,只是用来输出html页面数据而已。所以一般情况下。都使用静态包含。

jsp的练习题 练习一:在jsp中输出10*10的表格

代码语言:javascript
复制
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
<style type="text/css">
    table{
        width: 500px;
        border: 1px solid red;
        border-collapse: collapse;
    }
    th , td{
        border: 1px solid red;
    }
</style>
    </head>
    <body>
        <table>
        <%	for (int i = 1; i <= 10; i++) { %>
            <tr>
            <%	for (int j = 1; j <= 10; j++) { %>
                <td><%=i + "," + j %></td>
            <%  } %>
            </tr>
        <%  } %>
        </table>
    </body>
</html>

练习二:在jsp中输出九九乘法口诀表

代码语言:javascript
复制
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
    </head>
    <body>
        <center>
            <h1>九九乘法口诀表</h1>
            <table width="600">
            <% for(int i = 1; i < 10; i++){ %>
                <tr>
                <% for(int j = 1; j <= i ; j++){ %>
                    <td><%=j + "x" + i + "=" + (j*i) %></td>
                <% } %>
                </tr>
            <% } %>
            </table>
        </center>
    </body>
</html>

练习三:jsp输出一个表格,里面有20个学生信息。 请求转发的流程示例:

在这里插入图片描述
在这里插入图片描述

Student类

代码语言:javascript
复制
public class Student {

    private Integer id;
    private String name;
    private String phone;
    private String email;

    public Student(Integer id, String name, String phone, String email) {
        super();
        this.id = id;
        this.name = name;
        this.phone = phone;
        this.email = email;
    }

    public Student() {
        super();
    }

SearchStduent程序

代码语言:javascript
复制
public class SearchStudent extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // 获取请求参数
        // 查询学生信息
        // 得到多个学生信息
        List<Student> stus = new ArrayList<Student>();
        for (int i = 1; i < 21; i++) {
            stus.add(new Student(i,"name"+i, "phone"+i,"email"+i));
        }
        // 把学生信息保存到request域中
        request.setAttribute("stus", stus);
        // 请求转发到jsp页面中输出数据
        request.getRequestDispatcher("/test/showStudent.jsp").forward(request, response);
    }

}

showStudent.jsp页面

代码语言:javascript
复制
<%@page import="java.util.ArrayList"%>
<%@page import="com.atguigu.pojo.Student"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
<style type="text/css">
    table{
        width: 500px;
        border: 1px solid red;
        border-collapse: collapse;
    }
    th , td{
        border: 1px solid red;
    }
</style>
    </head>
    <body>
        <%
            List<Student> stus = (List<Student>) request.getAttribute("stus");
        %>
        <table>
            <tr>
                <th>编号</th>
                <th>姓名</th>
                <th>电话</th>
                <th>邮箱</th>
                <th>操作</th>
            </tr>
        <% for (int i = 0; i < stus.size(); i++) { %>
            <%	Student stu = stus.get(i); %>
            <tr>
                <td><%=stu.getId() %></td>
                <td><%=stu.getName() %></td>
                <td><%=stu.getPhone() %></td>
                <td><%=stu.getEmail() %></td>
                <td>修改、删除</td>
            </tr>
        <% } %>
        </table>
    </body>
</html>

12、什么是Listener监听器? Listener监听器是JavaWeb的三大组件之一, 三大组件分别是:Servlet程序、Filter过滤器、Listener监听器

Listener监听器,顾名思义,它监听某个事物状态变化,然后反馈给用户信息。 1、监听事物状态变化 2、反馈用户结果

12.1、ServletContextListener监听器 ServletContextListener监听器,监听ServletContext对象的创建和销毁。

ServletContext是在web工程启动的时候创建,在web工程停止的时候销毁

如何使用ServletContextListener监听器,步骤如下: 1、编写一个类去实现ServletContextListener监听器接口 2、到web.xml中去配置监听器

ServletContextListenerImpl 代码:

代码语言:javascript
复制
public class ServletContextListenerImpl implements ServletContextListener {
    /**
     * ServletContext对象创建并初始化就马上调用此contextInitialized方法
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext对象被创建啦啦啦…………");
    }

    /**
     * 当ServletContext对象被销毁之后,就会马上调用contextDestroyed方法
     */
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext对象被销毁啦啦啦…………");
    }
}

web.xml中的配置:

代码语言:javascript
复制
<!-- listener标签配置监听器 -->
<listener>
    <!-- listener-class配置监听器的全类名 -->
    <listener-class>com.atguigu.listener.ServletContextListenerImpl</listener-class>
</listener>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档