Jsp

指Java serverpages。Java的服务器页面。本质上是一个servlet程序
主要作用是代替servlet程序回传html页面的数据。因为servlet程序回传html页面数据是一件繁琐的事情,开发成本和维护成本都很高

jsp页面本质是一个servlet程序
**

jsp头部的page指令

language属性 :表示 jsp翻译后是什么语言文件。暂时只支持java
contentType属性:表示jsp返回的数据类型是什么。也是源码中response.setContentType()参数值
pageEncoding属性:表示当前jsp页面文件本身的字符集
import属性:跟java源代码中一样。用于导包,导类
autoFlush属性:设置当out输出流缓冲区满了之后,是否自动刷新冲级区。默认值是true。
buffer属性:设置out缓冲区的大小。默认是8kb
errorPage属性:设置当前jsp页面运行错误出错,自动跳转去的错误页面路径
isErrorPage属性:设置当前jsp页面是否是错误页面。默认是false
session属性:设置访问当前jsp页面,是否会创建HttpSession对象。默认是true
extends属性:设置jsp翻译出来的java类默认继承誰

jsp中常用的脚本

声明脚本 <%! %>

  1. <body>
  2. //声明属性
  3. <%!
  4. private int id;
  5. private String name;
  6. private static Map<String,Object> map;
  7. %>
  8. //声明static静态代码块
  9. <%!
  10. static {
  11. map=new HashMap<>();
  12. map.put("k1", "v1");
  13. map.put("k2", "v2");
  14. map.put("k3", "v3");
  15. }
  16. %>
  17. //声明类方法
  18. <%!
  19. public int a(){
  20. return 12;
  21. }
  22. %>
  23. //声明内部类
  24. <%!
  25. public static class a{
  26. private int id;
  27. private String abc;
  28. }
  29. %>
  30. </body>

**

表达式脚本(常用) <%= %>

在jsp的页面上输出数据

特点:
1 所有表达式脚本都会被翻译到 _jsService() 方法中
2 表达式脚本都会被翻译成为out.print() 输出到页面
3 由于表达式脚本翻译的内容都在_jsService() 方法中,所以_jsService() 方法中的对象可以直接使用
4 表达式脚本中的表达式不能以分号结束

  1. <body>
  2. <%=12%>
  3. <%="abc"%>
  4. <%=map%>
  5. <%=request.getParameter("username")%> //获取方法中的对象
  6. </body>

代码脚本 <% %>
可以在jsp页面中,编写需要的功能(Java语句)
可以由多个代码脚本组合成一个

  1. <%
  2. for (int i = 0; i < 10; i++) {
  3. %>
  4. <%=i%> //代码脚本和表达式脚本使用
  5. <%
  6. }
  7. %>
  8. <table border="1">
  9. <%
  10. for (int i = 0; i < 8; i++) {
  11. %>
  12. <tr> //for循环做一个表格
  13. <td><%=i+1%> </td>
  14. </tr>
  15. <%
  16. }
  17. %>
  18. </table>

jsp的九大内置对象

request 请求对象
response 响应对象
pageContext jsp的上下文对象
session 会话对象

application ServletContext对象
config ServletConfig对象
out jsp输出流对象
page 指向当前jsp的对象
exception 异常对象

jsp四大域对象

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

使用优先顺序(内存逐渐增大):
pageContext—>request—>session—>application

jsp中的out输出和reponse.getwriter输出的区别
当jsp页面中所有代码执行完成后会做以下两个操作:
1、执行out.flush()操作,会把out缓冲区中的数据追加写入到response缓冲区末尾
2、会执行response的刷新操作。把全部数据写给客户端

一般使用out输出,避免打乱页面输出内容。
out.write() 输出字符串没有问题(底层源码是把int类型转为char类型放入数组中 所以int类型打印出来的是一个ASCII码)
out.print()输出任意数据都没有问题(都转换成为字符串后调用的write输出) 【使用这个】

jsp的常用标签

静态包含

用于改一处jsp页面即可实现多个其它页面的修改 便于维护网页

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

  1. <body>
  2. <%@include file="b.jsp"%> //静态包含
  3. </body>

动态包含

动态包含也可以像静态包含一样,把被包含的内容执行输出到包含位置

特点:
1 动态包含把包含的jsp页面也翻译成java代码
2 动态包含底层代码调用被包含的jsp页面输出
3 动态包含还可以传递参数 共享九大内置对象

  1. <jsp:include page="b.jsp">
  2. //可以传递参数到b.jsp页面去使用
  3. <jsp:param name="username" value="admin"/>
  4. </jsp:include>

请求转发

  1. <jsp:forward page="b.jsp"></jsp:forward>
  1. <body>
  2. <%--练习:jsp输出一个表格,里面有10个学生信息。--%>
  3. <%
  4. //获取request域中存放的list集合
  5. List<Student> studentList = (List<Student>) request.getAttribute("stuList");
  6. %>
  7. <table>
  8. <tr>
  9. <td>编号</td>
  10. <td>姓名</td>
  11. <td>年龄</td>
  12. <td>电话</td>
  13. <td>操作</td>
  14. </tr>
  15. <% for (Student student : studentList) { %>
  16. <tr>
  17. <td><%=student.getId()%></td>
  18. <td><%=student.getName()%></td>
  19. <td><%=student.getAge()%></td>
  20. <td><%=student.getPhone()%></td>
  21. <td>删除、修改</td>
  22. </tr>
  23. <% } %>
  24. </table>
  25. </body>
  26. </html>
  1. @Override
  2. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  3. // 获取请求的参数
  4. // 发sql语句查询学生的信息
  5. // 使用for循环生成查询到的数据做模拟
  6. List<Student> studentList = new ArrayList<Student>();
  7. for (int i = 0; i < 10; i++) {
  8. int t = i + 1;
  9. studentList.add(new Student(t,"name"+t, 18+t,"phone"+t));
  10. }
  11. // 保存查询到的结果(学生信息)到request域中
  12. req.setAttribute("stuList", studentList);
  13. // 请求转发到showStudent.jsp页面
  14. req.getRequestDispatcher("/test/showStudent.jsp").forward(req,resp);
  15. }

注:不能直接访问jsp页面,要通过客户端发请求给servlet跳转到jsp页面;(要先有客户端把数据存放在request域中后,才能从请求转发的jsp 页面中获取request 对象值)

Listener监听器

Listener它是JavaEE的规范,就是接口;监听器的作用是,监听某种事物的变化,然后通过回调函数,反馈给客户(程序)去做一些相应的处理

ServletContextListener监听器

servletContextListener它可以监听 ServletContext对象的创建和销毁
ServletContext对象在web工程启动的时候创建,在web工程停止的时候销毁
监听到创建和销毁之后都会分别调用ServletContextListener监听器的方法反馈

  1. //实现类
  2. public class TestListener implements ServletContextListener {
  3. @Override
  4. public void contextInitialized(ServletContextEvent servletContextEvent) {
  5. System.out.println("创建");
  6. }
  7. @Override
  8. public void contextDestroyed(ServletContextEvent servletContextEvent) {
  9. System.out.println("创建");
  10. }
  11. }
  12. //web.xml配置监听器
  13. <listener>
  14. <listener-class>com.testjsp.servlet.TestListener</listener-class>
  15. </listener>