-jsp-

1、什么是jsp,有什么作用?

jsp的全称是java server pages。java的服务器页面。

jsp的主要作用是代替Servlet程序回传html页面的数据。

因为Servlet程序回传html页面数据是一件非常繁琐的事情,开发成本和维护成本都极高。

html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    这是一个html页面数据
</body>
</html>

web.xml配置Servlet程序的代码如下

    <servlet>
        <servlet-name>PringHtml</servlet-name>
        <servlet-class>servlet.PringHtml</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>PringHtml</servlet-name>
        <url-pattern>/pringHtml</url-pattern>
    </servlet-mapping>

1)普通Servlet程序回传html页面数据

public class PringHtml extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //通过响应的回传流回传html页面数据
        PrintWriter writer = resp.getWriter();

        writer.write("<!DOCTYPE html>\r\n");
        writer.write("  <html lang=\"en\">\r\n");
        writer.write("  <head>\r\n");
        writer.write("    <meta charset=\"UTF-8\">\r\n");
        writer.write("    <title>Title</title>\r\n");
        writer.write("    <title>Title</title>\r\n");
        writer.write("  </head>\r\n");
        writer.write("  <body>\r\n");
        writer.write("   这是一个html页面数据\r\n");
        writer.write("  </body>\r\n");
        writer.write("  </html>\r\n");
        writer.write("\r\n");

    }
}

页面输入http://localhost:8080/08_jsp/pringHtml 可用观察到回传数据


2)jsp文件页面数据 - - - 可以看出本质是Servlet程序

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
        这是jsp页面数据
</body>
</html>

页面输入http://localhost:8080/08_jsp/a.jsp 可用观察到回传数据


总结

jsp页面和html页面一样,都是存放在web目录下。访问也跟访问html页面一样。

比如:
	在web目录下有如下文件:
	web目录
		a.html页面		访问地址是		http://ip:port/工程路径/a.html
		b.jsp页面		访问地址是		http://ip:port/工程路径/b.jsp

2、jsp的本质是什么

jsp页面本质是一个Servlet程序。

当第一次访问jsp页面的时候。Tomcat服务器会把jsp页面翻译成为一个java源文件,并且对它进行编译成为.class字节码程序,打开java源文件不难发现其里面的内容是:
在这里插入图片描述

跟踪源代码发现,HttpjspBase类,直接继承了HttpServlet类。也就是说,jsp翻译出来的java类,间接继承了HttpServlet类,即翻译出来是一个Servlet程序。
在这里插入图片描述
总结:

	通过翻译的java源代码可得到结果:jsp就是Servlet程序。
	可以观察发现翻译出来的Servlet程序的源代码,其底层实现,也是通过输出流,把html页面数据回传给客户端。

3、jsp的三种语法

3.1 jsp头部的page指令

jsp的page指令可以修改jsp页面中一些重要的属性,或者行为。

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

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

3.2 jsp中的常用脚本

1)声明脚本- - - 极少使用

声明脚本的格式是:<%! 声明java代码 %>

作用:可以给jsp翻译出来的java类定义属性、方法、静态代码块、内部类等。

练习:
	① 声明类属性
	② 声明static静态代码块
	③ 声明类方法
	④ 声明内部类		
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

④ 声明内部类--%>

<%--① 声明类属性--%>
    <%!
        private Integer id;
        private String name;
        private static Map<String,Object> map;
    %>

<%--② 声明static静态代码块--%>
    <%!
        static {
            map = new HashMap<>();
            map.put("key1","value1");
            map.put("key2","value2");
            map.put("key3","value3");
            map.put("key4","value4");
            map.put("key5","value5");
        }
    %>

<%--③ 声明类方法--%>
    <%!
        public int abc(){
            return 0;
        }
    %>

<%--④ 声明内部类--%>
    <%!
        public static class A{
            private Integer id=12;
            private String abc="abc";
        }
    %>
</body>
</html>

2)表达式脚本- - - 常用

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

作用:在jsp页面上输出数据。

练习:
	① 输出整型
	② 输出浮点型
	③ 输出字符串
	④ 输出对象	
    <%=12 %> <br/>
    <%=12.12 %> <br/>
    <%="字符串" %> <br/>
    <%=map %> <br/>

表达式脚本的特点

① 所有的表达式脚本都会被翻译到 _jspService()方法中
② 表达式脚本都会被翻译成为out.print()输出到页面上
③ 由于表达式脚本翻译的内容都在_jspService()方法中,所以_jspService()方法中的对象都可以直接使用
④ 表达式脚本中的表达式不能以分号结束

3)代码脚本

表达式脚本的格式是:<%java语句%>

作用:可以在jsp页面中,编写我们自己需要的功能(写的是java语句)。

练习:
	① 代码脚本---if语句
	② 代码脚本---for循环语句
	③ 翻译后java文件中_jspService放啊内的代码都可以写
<%--① 代码脚本---if语句--%>
    <%
        int i=0;
        if (i==0){
            System.out.println("0");
        }else {
            System.out.println("1");
        }
    %>


<%--② 代码脚本---for循环语句--%>
    <%
        for (int j=0;j<10;j++){
            System.out.println(j);
        }
    %>

<%--③ 翻译后java文件中_jspService放啊内的代码都可以写--%>
    <%
        String username = request.getParameter("username");
        System.out.println("用户名的请求参数值是:"+username);
    %>

代码脚本的特点

① 代码脚本都会被翻译到 _jspService()方法中
② 代码脚本翻译的内容都在_jspService()方法中,所以_jspService()方法中的对象都可以直接使用
③ 还可以由多个代码脚本块组合完成一个完整的java语句。
④ 代码脚本还可以和表达式脚本一起组合使用,在jsp页面上输出数据

3.3 jsp中三种注释

1)html注释

<!--这是html注释-->
html注释会被翻译到java源代码中,在_jspService方法里,以out.writer输出到客户端。

2)java注释

<%
	// 单行注释
	/* 多行注释 */
%>

java注释会被翻译到java源代码种

3)jsp注释

<%--这是jsp注释--%>

jsp注释可以注解掉jsp页面种的所有代码

3.4 jsp中九大内置对象

jsp中的内置对象,指Tomcat在翻译jsp页面称为Servlet源代码后,内部提供的九大对象,叫内置对象。

在这里插入图片描述

3.5 jsp 四大域对象

四个域对象分别是:

	pageContext			(PageContextImpl类)			当前jsp页面范围内有效
	request				(HttpServletRequest类)			一次请求内有效
	session				(HttpSession类)				一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器)
	application			(ServletContext类)				整个web工程范围内都有效(只要web工程不停止,数据都在)

域对象是可以像Map一样存取数据的对象,四个域对象功能一样。不同的是它们对数据的存取范围。

四个域在使用的时候,优先顺序分别是,从小到大的范围的顺序。

pageContext ---> request ---> session ---> application

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

response中表示响应,经常用于设置返回给客户端的内容(输出),out也是给用户做输出使用的。- - -如果前面执行中出现out.flush()操作,之前的out就会写入到response中,最后执行完所有的jsp中的代码,自动执行out.flush()把剩下的out写到后面。

在这里插入图片描述
由于jsp翻译之后,底层源代码都是使用out来进行输出,所以一般情况下,在jsp页面中统一使用out来进行输出。避免打乱页面输出内容的顺序。

out.write() 输出字符串没有问题
out.print() 输出任意数据都没有问题(都转换成为字符串后调用write输出)

深入源码,浅出结论:在jsp页面中,可以统一使用out.print()来进行输出。


3.7 jsp 的常用标签

1)jsp静态包含 - - -常用

在这里插入图片描述
静态包含的特点:

1、静态包含不会翻译被包含的jsp页面
2、静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置执行输出

举例:使得访问main时,可以输出footer中的尾部信息。

footer代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
        尾部信息<br/>
</body>
</html>

main代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
        头部信息<br/>
        主体内容<br/>

        <%--以下就是静态包含,file属性指定要包含的jsp页面的路径
                地址中第一个斜杠/  表示为http://ip:port/工程路径/ 映射到代码的web目录
        --%>
        <%@include file="/include/footer.jsp"%>

</body>
</html>

2)jsp动态包含

动态包含的底层原理:
在这里插入图片描述

动态包含的特点:

1、动态包含会把包含的jsp页面也翻译成为java代码
2、动态包含底层代码使用如下代码去调用被包含的jsp页面执行输出。
	JspRuntimeLibrary.include(request,response,"/include/footer.jsp",out,false);
3、动态包含,还可以传递参数。

举例:使得访问main时,可以输出footer中的尾部信息。*

footer代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
        尾部信息<br/>
        <%=request.getParameter("password")%>
</body>
</html>

main代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
        头部信息<br/>
        主体内容<br/>

        <%--动态包含如下所示  page属性指定要包含的jsp页面的路径
                动态包含也可以像静态包含一样,把被包含的内容执行输出到包含位置
         --%>
        <jsp:include page="/include/footer.jsp">
                <jsp:param name="username" value="bbj"/>
                <jsp:param name="password" value="root"/>
        </jsp:include>

</body>
</html>

3)jsp标签-转发

下面举例请求转发

两种方式演示:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
       <%--请求转发方式一:--%>
        <%
                request.getRequestDispatcher("/a.jsp").forward(request,response);
        %>
        
        <%--请求转发方式二:--%>
        <%--<jsp:forward page=""></jsp:forward>是请求转发标签
             它的功能就是请求转发  page属性设置请求转发的路径
        --%>
        <jsp:forward page="/a.jsp"></jsp:forward>

</body>
</html>

4、jsp的练习题

4.1 在jsp页面输出九九乘法表

test1.jsp代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <style type="text/css">
        table{
            width: 650px;
        }
    </style>
</head>
<body>
        <%--练习在jsp页面中输出九九乘法表--%>
        <h1 align="center">九九乘法表</h1>
        <table align="center">
        <% for (int i=1;i<=9;i++){ %>
            <tr>
            <% for (int j=0;j<i;j++){ %>
                <td> <%=j+"x"+i+"="+(i*j)%> </td>
            <% } %>
            </tr>
        <% } %>
        </table>
</body>
</html>

4.2 在jsp输出一个表格,里面有10个学生的信息

学生类:

public class Student {
    private Integer id;
    private Integer age;
    private String name;
    private String phone;

    public Student() {
    }

    public Student(Integer id, Integer age, String name, String phone) {
        this.id = id;
        this.age = age;
        this.name = name;
        this.phone = phone;
    }
...get、set、toString...

test2.jsp代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <style type="text/css">
        table{
            border: 1px blue solid;
            width: 600px;
            border-collapse: collapse;
        }
        td,th{
            border: 1px blue solid;
        }
    </style>
</head>
<body>
        <%--练习:jsp输出一个表格,里面有10学生信息--%>
        <%
            ArrayList<Student> studentList = new ArrayList<>();
            for (int i=0;i<10;i++){
                int t=i+1;
                studentList.add(new Student(t,18+t,"name"+t,"phone"+t));
            }
        %>

        <table>
            <tr>
                <td>编号</td>
                <td>姓名</td>
                <td>年龄</td>
                <td>电话</td>
                <td>操作</td>
            </tr>
        <% for (Student student:studentList){ %>
        <tr>
            <td><%=student.getId()%></td>
            <td><%=student.getName()%></td>
            <td><%=student.getAge()%></td>
            <td><%=student.getPhone()%></td>
            <td>删除、修改</td>
        </tr>
        <%    }
        %>
        </table>
</body>
</html>

5、请求转发的使用说明

在这里插入图片描述
注意

实现的原因是一次请求中request域中的数据是共享的

SearchStudentServlet代码如下:其中1、2是通过for循环模拟查询到的数据

public class SearchStudentServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 1、获取请求的参数
        // 2、发sql语句查询学生的信息
        // 1、2的操作使用for循环生成查询到的数据做模拟

        ArrayList<Student> studentList = new ArrayList<>();
        for (int i=0;i<10;i++){
            int t=i+1;
            studentList.add(new Student(t,18+t,"name"+t,"phone"+t));
        }

        // 3、保存查询到的结果(学生信息)到request中
        request.setAttribute("stuList",studentList);
        // 4、请求转发到showStudent.jsp页面
        request.getRequestDispatcher("/Test/showStudent.jsp").forward(request,response);

    }

showStudent.jsp代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <style type="text/css">
        table{
            border: 1px blue solid;
            width: 600px;
            border-collapse: collapse;
        }
        td,th{
            border: 1px blue solid;
        }
    </style>
</head>
<body>
        <%--练习:jsp输出一个表格,里面有10学生信息--%>
        <%
            ArrayList<Student> studentList = (ArrayList<Student>) request.getAttribute("stuList");
        %>

        <table>
            <tr>
                <td>编号</td>
                <td>姓名</td>
                <td>年龄</td>
                <td>电话</td>
                <td>操作</td>
            </tr>
        <% for (Student student:studentList){ %>
        <tr>
            <td><%=student.getId()%></td>
            <td><%=student.getName()%></td>
            <td><%=student.getAge()%></td>
            <td><%=student.getPhone()%></td>
            <td>删除、修改</td>
        </tr>
        <%    }
        %>
        </table>
</body>
</html>

6、什么是Listener监听器

1)Listener监听器是JavaWeb的三大组件之一。JavaWeb三大组件分别是:Servlet程序、Filter过滤器、Listener监听器

2)Listener是JavaE的规范,就是接口

3)监听器的作用是,监听某种事物的变化,然会通过回调函数,反馈给客户(程序)去做一些相应的处理。

6.1 ServletContextListener监听器

ServletContextListener可以监听ServletContext对象的创建和销毁。

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

监听到创建和销毁之后都会分别调用ServletContextListener监听器的方法反馈

两个方法分别是:

public interface ServletContextListener extends EventListener {
	
	// 在ServletContext对象创建之后马上调用,做初始化
	default void contextInitialized(ServletContextEvent sce) {
 }

	// 在ServletContext对象销毁之后调用
	default void contextDestroyed(ServletContextEvent sce) {
 }
}

在这里插入图片描述

public class MyservletContextListenerImpl implements ServletContextListener {


    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext对象被创建了");

    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext对象被销毁了");

    }
}

web.xml配置代码如下:

 <!--配置监听器-->
    <listener>
        <listener-class>listener.MyservletContextListenerImpl</listener-class>
    </listener>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值