06-jsp

    技术2022-07-11  79

    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输出流缓冲区满了之后是否自动刷新缓冲区,默认值是truebuffer属性设置out输出流缓冲区的大小,默认是8kberrorPage属性设置当jsp页面运行时出错,自动跳转去的错误页面路径(用于提示用户页面出错)isErrorPage属性设置当前jsp页面是否是错误信息页面,默认是false,如果是true可以获取异常信息session属性设置访问当前jsp页面,是否会创建HttpSession对象,默认是trueextends属性设置jsp翻译出来的java类默认继承谁

    jsp中常用脚本

    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.表达式脚本

    格式: <%=表达式%>

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

    特点:

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

    3.代码脚本

    格式: <% java语句 %>

    作用:可以在jsp页面中编写需要的功能。

    特点:

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

    jsp中的三种注释

    html注释—— html注释会被翻译到Java源代码中。在__jspService()方法中以out.writer输出到客户端。 Java注释——/**/和// Java注释会被翻译到Java源代码中。 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工程范围内都有效 域对象是可以像Map一样存取数据的对象,功能相同,不同的是它们对数据的存取范围。四个域在使用时,优先顺序(范围从小到大)是: 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输出的区别

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

    out也用来做输出操作。

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

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

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

    7.jsp的常用标签

    jsp静态包含

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

    jsp动态包含

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

    jsp转发标签

    格式: <jsp:forward page="/a.jsp"></jsp:forward> 说明: 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个学生信息)

    Student类: public class Student { private Integer id; private String name; private Integer age; private String phone; } 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); } } 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监听器

    定义

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

    作用

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

    ServletContextListener监听器

    可以监听ServletContext对象的创建和销毁。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("被销毁"); } } 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>
    Processed: 0.012, SQL: 9