赞
踩
1)说明:jsp 的全称是 Java servlet pages,Java 的服务器页面。主要作用是代替 servlet 程序回传 html 页面的数据。
2)本质:jsp 页面本质上是一个 Servlet 程序。
1)jsp 头部的 page 指令
page 指令可以修改 jsp 页面中的一些重要属性,或者行为。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
i)language属性:表示 jsp 翻译后是什么语言文件,暂时只支持 java。
ii)contentType属性:表示 jsp 返回的数据类型,也是源码中 resp.setContentType参数值。
iii)pageEncoding属性:表示当前 jsp 页面文件本身的字符集,默认 utf-8。
iv)import属性:用于导包导类。
v)autoFlush属性:设置当 out 输出流缓冲区满了之后,是否自动刷新缓冲区,默认为true。
vi)buffer属性:设置 out 输出流缓冲区的大小,默认是 8kb。
vii)errorPage属性:设置当 jsp 页面运行时出错,自动跳转去的错误页面。
viii)isErrorPage属性:设置当前 jsp 页面是否是错误信息页面,默认是 false。
ix)session属性:设置访问当前 jsp 页面,是否会创建 HttpSession 对象,默认是 true。
x)extends属性:设置 jsp 翻译出来的 java 类,默认继承谁。
2)jsp 中常用的脚本
i)声明脚本(极少使用)
格式:<%! 声明Java代码 %>
作用:可以给 jsp 翻译出来的 Java 类定义属性和方法,甚至是静态代码块、内部类等。
练习:a)声明类属性
- <%--a)声明类属性--%>
- <%!
- private Integer id;
- private String name;
- private String password;
- private static Map<String, Object> map;
- %>
b)声明static静态代码块
- <%--b)声明static静态代码块--%>
- <%!
- static {
- map = new HashMap<String, Object>();
- map.put("key1", "value1");
- map.put("key2", "value2");
- }
- %>
c)声明类方法
- <%--c)声明类方法--%>
- <%!
- public String add(){
- return "name + password";
- }
- %>
d)声明内部类
- <%--d)声明内部类--%>
- <%!
- public static class A {
- private Integer Aid = 12;
- private String Aname = "AAA";
- }
- %>
ii)表达式脚本(常用)
格式:<%=表达式%>
作用:在 jsp 页面上输出数据
特点:a)所有的表达式脚本都会被翻译到 _japService 方法中
b)所有的表达式脚本都会被翻译成为 out.print() 输出到页面上
c)由于表达式脚本翻译的内容都在 _japService 方法中,所有 _japService 方法中的对象都可以直接使用
d)表达式脚本中的表达式不能以分号结束
练习:a)输出整形
- <%--a)输出整形--%>
- <%=12%><br>
b)输出浮点型
- <%--b)输出浮点型--%>
- <%=12.12%><br>
c)输出字符串
- <%--c)输出字符串--%>
- <%="这是字符串12.12"%><br>
d)输出对象
- <%--d)输出对象--%>
- <%=map%><br>
对应的页面显示和翻译内容:
iii)代码脚本
格式:<% java 语句 %>
作用:可以在 jsp 页面编写需要的功能(基本是 java 语句)
特点:a)代码脚本翻译之后都在 _jspService 方法中
b)由于代码脚本翻译的内容都在 _japService 方法中,所有 _japService 方法中的对象都可以直接使用
c)还可以有多个代码脚本块完成一个完整的 Java 语句
d)代码脚本还可以与表达式脚本一起使用,在 jsp 页面输出数据
练习:a)代码脚本 --- if 语句
b)代码脚本 --- for循环语句
c)jsp 被翻译后的 Java 文件中 _jspService 方法内的代码都可以写
- <%--a)代码脚本 --- if 语句--%>
- <%
- int i = 12;
- if (i == 21) {
- System.out.println("correct!");
- } else {
- System.out.println("error!");
- }
- %>
-
- <%--b)代码脚本 --- for循环语句--%>
- <%
- for (int j=0; j<10; j++) {
- System.out.println(j);
- }
- %>
-
- <%--c)jsp 被翻译后的 Java 文件中 _jspService 方法内的代码都可以写--%>
- <%
- String username = request.getParameter("username");
- System.out.println(username);
- %>
1)在上述九大内置对象中,有四大域对象,分别是:pageContext(PageContextImpl类)、request(HttpServlerRequest类)、session(HttpSession类)、application(ServletContext类)
2)域对象是可以像 Map 一样存取数据的对象。四个域对象功能一样,不同的是它们对数据的存取范围。
3)四大域对象存取范围:分别给四个对象存入数据,并取出
pageContext(PageContextImpl类) --- 当前 jsp 页面范围内有效。
request(HttpServlerRequest类) --- 一次请求内有效。
session(HttpSession类) --- 一次会话范围内有效(浏览器访问服务器,直到浏览器关闭,数据都在)。
application(ServletContext类) --- 整个 web 工程范围内都有效(只要web不停止,数据都在)。
四大域对象存入数据,并取出:
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>四大域对象</title>
- </head>
- <body>
- <h1>四大域对象</h1>
- <%
- //给四大域对象存入数据
- pageContext.setAttribute("pageContextKey","pageContextValue");
- request.setAttribute("requestKey","requestValue");
- session.setAttribute("sessionKey","sessionValue");
- application.setAttribute("applicationKey","applicationValue");
- %>
- pageContext域中是否有值:
- <%=
- // 取出四大域对象中的值
- pageContext.getAttribute("pageContextKey")
- %><br>
- request域中是否有值:
- <%=
- // 取出四大域对象中的值
- request.getAttribute("requestKey")
- %><br>
- session域中是否有值:
- <%=
- // 取出四大域对象中的值
- session.getAttribute("sessionKey")
- %><br>
- application域中是否有值:
- <%=
- // 取出四大域对象中的值
- application.getAttribute("applicationKey")
- %><br>
-
- <%
- //一次请求
- request.getRequestDispatcher("/四大域对象范围测试.jsp").forward(request,response);
- %>
- </body>
- </html>
四大域对象不存入数据,直接取出:
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>四大域对象</title>
- </head>
- <body>
- <h1>四大域对象范围测试</h1>
-
- pageContext域中是否有值:
- <%=
- // 取出四大域对象中的值
- pageContext.getAttribute("pageContextKey")
- %><br>
- request域中是否有值:
- <%=
- // 取出四大域对象中的值
- request.getAttribute("requestKey")
- %><br>
- session域中是否有值:
- <%=
- // 取出四大域对象中的值
- session.getAttribute("sessionKey")
- %><br>
- application域中是否有值:
- <%=
- // 取出四大域对象中的值
- application.getAttribute("applicationKey")
- %><br>
- </body>
- </html>
4)四大域对象在使用上的优先顺序:pageContext > request > session > application,有效范围越小,若数据不使用,就会在越短的时间,数据释放就会越快,从而减轻服务器内存的压力。
当 jsp 页面所有代码执行完成后会做以下两个操作:
1)执行 out.flush() 操作,会把 out 缓冲区中的数据追加写入到 response 缓冲区末尾。
2)会执行 response 的刷新操作,把全部数据写给客户端。
1)jsp 静态包含
格式:<%@ file="/" %> ,file 属性指定要包含的 jsp 页面路径
2)jsp 动态包含
格式:<jsp:include page=""></jsp:include>,page 属性指定要包含的 jsp 页面路径
特点:动态包含可以在标签内添加内容<jsp:param name="" value=""><jsp:param>,用于传递参数
3)jsp 标签-转发
格式:<jsp:forward page=""></jsp:forward>,page 属性指定要转发到的 jsp 页面路径
用法:
1)在 jsp 页面输出九九乘法表
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>九九乘法表</title>
- </head>
- <body>
-
- <%
- for (int i=1; i<=9; i++) {
- for (int j=9 ;j>=i; j--) {
- %>
- <%=i + "*" + j + "=" + (i*j)%>
- <%
- }
- %>
- <br>
- <%
- }
- %>
- </body>
- </html>
2)jsp 输出一个表格,里面有十个同学的信息
- <%@ page contentType="text/html;charset=UTF-8" language="java" import="com.ldyr.Student" %>
- <html>
- <head>
- <title>表格</title>
- </head>
- <body>
-
- <%
- Student student = new Student();
- for (int i=0; i<10; i++) {
- student.setName("name" + (i+1));
- student.setSex("女");
- %>
-
- <table border="1" style="border-collapse: collapse" >
- <tr>
- <td><%= student.getName() %></td>
- <td><%= student.getSex() %></td>
- </tr>
- </table>
- <%}%>
- </body>
- </html>
3)通过 jsp 回传数据给客户端
Servlet程序将查询到的信息储存到request域中:
- public class StudentRequestServlet extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- List<Student> stuList = new ArrayList<Student>();
- for (int i=0; i<10; i++) {
- stuList.add(new Student("name" + (i+1),"男"));
- }
- req.setAttribute("stuList",stuList);
-
- req.getRequestDispatcher("/JSP回传数据给客户端.jsp").forward(req,resp);
- }
- }
jsp页面查询request域中的值 ,进行显示:
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>jsp回传数据给客户端</title>
- </head>
- <body>
- <%
- List<Student> stuList = (List<Student>) request.getAttribute("stuList");
- %>
-
- <table border="1" style="border-collapse: collapse" >
- <% for (Student student: stuList) {%>
- <tr>
- <td><%= student.getName() %></td>
- <td><%= student.getSex() %></td>
- </tr>
- <%}%>
- </table>
-
- </body>
- </html>
8. Listener 监听器
1)说明:
Listener 监听器时 JavaWeb 三大组件之一。JavaWeb 三大组件分别是 Servlet程序、Listener监听器、Filter过滤器。
Listener 是 JavaEE 的规范,就是接口。
监听器的作用是 监听某种事物的变化,然后通过回调函数,反馈给客户(程序)做一些相应的处理。
2)ServletContextListener 监听器
ServletContextListener 可以监听 ServletContext对象的创建和销毁。
ServletContext对象在 web 工程启动的时候创建,在 web 对象停止的时候销毁。
监听到创建和销毁后会分别调用 ServletContextListener 监听器的两个方法进行反馈。
两个方法分别是:
- public interface ServletContextListener extends EventListener {
- // ServletContext对象创建后马上调用,做初始化
- void contextInitialized(ServletContextEvent var1);
-
- // ServletContext对象销毁后马上调用,做销毁处理
- void contextDestroyed(ServletContextEvent var1);
- }
使用步骤:
i)编写一个类实现 ServletContextListener
ii)实现两个方法回调
- public class ContextListenerServlet implements ServletContextListener {
- @Override
- public void contextInitialized(ServletContextEvent servletContextEvent) {
- System.out.println("context_Init");
- }
-
- @Override
- public void contextDestroyed(ServletContextEvent servletContextEvent) {
- System.out.println("context_Destroy");
- }
- }
iii)在web.xml中配置监听器
- <listener>
- <listener-class>com.ldyr.ContextListenerServlet</listener-class>
- </listener>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。