06-jsp

1.jsp定义及作用

定义

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

作用

主要作用是代替Servlet程序回传html页面的数据,因为使用Servlet程序回传html页面数据开发和维护成本都比较高。

示例

servlet程序回传html页面数据:

public class PrintHtml extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       resp.setContentType("text/html;charset=UTF-8");

        //通过响应的回传流回传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("  </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");
    }
}

jsp回传html页面数据:

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

2.jsp的本质

jsp页面本质上是一个Servlet程序,当我们第一次访问jsp页面时,Tomcat服务器会帮我们把jsp页面翻译成为一个Java源文件,并对它进行编译称为**.class字节码程序**。

3.jsp的三种语法

jsp头部的page指令

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
属性作用
language属性表示jsp翻译后的语言文件
contextType属性表示jsp返回的数据类型,即源码中的response.setContextType()参数值
pageEncoding属性表示当前jsp页面文件本身的字符集
import属性用于导包、导类
autoFlush属性设置当out输出流缓冲区满了之后是否自动刷新缓冲区,默认值是true
buffer属性设置out输出流缓冲区的大小,默认是8kb
errorPage属性设置当jsp页面运行时出错,自动跳转去的错误页面路径(用于提示用户页面出错)
isErrorPage属性设置当前jsp页面是否是错误信息页面,默认是false,如果是true可以获取异常信息
session属性设置访问当前jsp页面,是否会创建HttpSession对象,默认是true
extends属性设置jsp翻译出来的java类默认继承谁

jsp中常用脚本

1.声明脚本

  1. 格式:
<%! 声明脚本 %>
  1. 作用:可以给jsp翻译出来的java类定义属性方法甚至是静态代码块内部类等。

例:

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

<%--2、声明 static 静态代码块--%> 
<%!
  	static{ 
  			map = new HashMap<String,Object>();
        map.put("key1","value1");
        map.put("key2","value2");
        map.put("key3","value3");   
    }
%>   

<%--3、声明类方法--%> 
<%!
  	public int abc(){
  				return 12;
		}
%>  

<%--4、声明内部类--%> 
<%!
  public static class A{
    private integer id = 12;
    private String name = "abc";
  }
%>

2.表达式脚本

  1. 格式:
<%=表达式%>
  1. 作用:在jsp页面上输出数据。

  2. 特点:

  • 所有的表达式脚本都会被翻译到__jspService()方法中;
  • 表达式脚本都会被翻译成out.print()输出到页面上;
  • 由于表达式脚本翻译的内容都在__jspService()方法中,所以jspService()方法中的对象都可以直接调用;
  • 表达式脚本中的表达式不能以分号结束。
  1. 练习:
<%--输出整型--%>
    <%=12%><br>
<%--输出浮点型--%>
    <%=12.12%><br>
<%--输出字符串--%>
    <%="字符串"%><br>
<%--输出对象--%>
    <%=map%><br>
    <%=request.getParameter("username")%><br>

3.代码脚本

  1. 格式:
<%
		java语句
%>
  1. 作用:可以在jsp页面中编写需要的功能。

  2. 特点:

  • 代码脚本翻译之后都在__jspService()方法中;
  • 代码脚本由于翻译到__jspService()方法中,所以在jspService()方法中现有的对象都可以直接使用;
  • 多个代码脚本块可以组合成一个完整的Java语句;
  • 代码脚本还可以和表达式脚本一起组合使用,在jsp页面上输出数据。

jsp中的三种注释

  1. html注释——
  • html注释会被翻译到Java源代码中。在__jspService()方法中以out.writer输出到客户端。
  1. Java注释——/**/和//
  • Java注释会被翻译到Java源代码中。
  1. jsp注释——<%–jsp注释–%>
  • jsp注释可以注释掉jsp页面中所有代码。

4.jsp的九大内置对象

jsp中的内置对象,是指Tomcat服务器在翻译jsp页面成为Servlet源代码后,内部提供的九大对象。

对象名说明
request请求对象
response响应对象
pageContextjsp的上下文对象
session会话对象
applicationServletContext对象
configServletConfig对象
outjsp输出流对象
page指向当前jsp的对象
exception异常对象

5.jsp的四大域对象

对象名所属类说明
pageContextPageContextImpl类当前jsp页面范围内有效
requestHttpServletRequest类一次请求内有效
sessionHttpSession类一次会话范围内有效(浏览器打开到浏览器关闭)
applicationServletContext类整个web工程范围内都有效
  1. 域对象是可以像Map一样存取数据的对象,功能相同,不同的是它们对数据的存取范围
  2. 四个域在使用时,优先顺序(范围从小到大)是:
  • pageContext < request < session < application

例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>scope.jsp页面</h1>
  
    <%
        //往四个域对象中存储数据
        pageContext.setAttribute("key", "pageContext");
        request.setAttribute("key", "request");
        session.setAttribute("key", "session");
        application.setAttribute("key", "application");
    %>
  
    <%--取四个域对象中的数据--%>
    pageContext是否有值:<%=pageContext.getAttribute("key")%><br>
    request是否有值:<%=request.getAttribute("key")%><br>
    session是否有值:<%=session.getAttribute("key")%><br>
    application是否有值:<%=application.getAttribute("key")%><br>

    <%
        request.getRequestDispatcher("/scope2.jsp").forward(request, response);
    %>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--取四个域对象中的数据--%>
    pageContext是否有值:<%=pageContext.getAttribute("key")%><br>
    request是否有值:<%=request.getAttribute("key")%><br>
    session是否有值:<%=session.getAttribute("key")%><br>
    application是否有值:<%=application.getAttribute("key")%><br>
    %>
</body>
</html>

6.out输出和writer输出的区别

  1. writer中表示响应,经常用于设置返回给客户端的内容。

  2. out也用来做输出操作。

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

  4. out.write()——输出字符串。

  5. out.print()——输出任意数据(转换成字符串后调用write输出)。

7.jsp的常用标签

jsp静态包含

  1. 格式:
<%@include file="/include/a.jsp"%>
  1. 说明:
  • file属性是指定要包含的jsp页面路径。
  1. 特点:
  • 不会翻译被包含的jsp页面;
  • 本质是将被包含的jsp页面的代码拷贝到合适的位置执行输出。

jsp动态包含

  1. 格式:
<jsp:include page="/include/a.jsp">
	<jsp:param name="username" value="a"/>
	<jsp:param name="password" value="123"/>
</jsp:include>
  1. 说明:
  • page属性指定要包含的jsp页面的路径。
  1. 特点:
  • 将被包含的jsp页面翻译成Java代码;
  • 动态包含可以传递参数。

jsp转发标签

  1. 格式:
<jsp:forward page="/a.jsp"></jsp:forward>
  1. 说明:
  • page属性设置请求转发的路径。

8.jsp练习题

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--在 jsp 页面中输出九九乘法口诀表--%>
    <h1 align="center">九九乘法口诀表<h1/>
        <table align="center">
            <%
                for(int i = 1; i <= 9; i++) { %>
            <tr>
                <%
               for(int j = 1; j <= 9; j++) { %>
                <td><%=j + "*" + i + "=" + (i*j)%></td>
               <%}%>
                    </tr>
                <%}%>
        </table>
</body>
</html>

jsp输出一个表格(存在10个学生信息)

  1. Student类:

public class Student {
    private Integer id;
    private String name;
    private Integer age;
    private String phone;
}
  1. SearchStudentServlet程序:
public class SearchStudentServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ArrayList<Student> studentList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            int t = i + 1;
            studentList.add(new Student(t,"name"+t, 18+t,"phone"+t));
        }
        req.setAttribute("stuList", studentList);
        req.getRequestDispatcher("/test/test2.jsp").forward(req, resp);
    }
}
  1. showStudent.jsp页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <style>
        table{
            border: 1px black solid;
            width: 600px;
            border-collapse: collapse;
        }
        td,th{
            border: 1px black solid;
        }
    </style>
</head>
<body>
    <%
        List<Student> studentList = (List<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>

9.Listener监听器

定义

  1. Java三大组件分别是:Servlet程序Filter过滤器Listener监听器
  2. Listener监听器是JavaEE的规范(接口)。

作用

  • 监听某种事物的变化,然后通过回调函数反馈给程序去做一些响应的处理。

ServletContextListener监听器

  1. 可以监听ServletContext对象的创建和销毁。
  2. ServletContext对象在web工程启动时被创建,在web工程停止的时候被销毁,监听到创建和销毁之后都会分别调用ServletContextListener监听器的方法反馈。
  • 方法一:
//在ServletContext对象创建后马上调用,做初始化操作
public interface ServletContextListener extends EventListener{
  @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("被创建");
    }
}
  • 方法二:
//在ServletContext对象销毁后调用
public interface ServletContextListener extends EventListener{
  @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("被销毁");
    }
}
  1. ServletContextListener监听器使用步骤:
  • 编写一个类去实现ServletContextListener,实现其两个回调方法
public class MyServletContextListenerImpl implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("被创建");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("被销毁");
    }

}
  • 配置web.xml文件
<listener>
        <listener-class>listener.MyServletContextListenerImpl</listener-class>
</listener>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值