jsp读书笔记
1.jsp的由来
jsp的本质是servlet, 当用户向指定的servlet发送请求时, servlet利用输出流动态生成html页面, 包括静态的HTML标签和所有在HTML页面中出现的内容.
由于包含大量的HTML标签和大量的静态文本和格式, 导致Servlet的开发效率极其低下,
表现为所有的逻辑代码包括布局, 色彩图像等都必须耦合在java代码中.
jsp的出现弥补了这种不足. jsp通过在标准HTML页面中嵌入java代码, 其静态部分无需java程序控制, 只有例如从数据库读数据那种动态生成的页面内容才使用java脚本控制.极大地简化了页面流的开发.
2.jsp的本质
jsp的本质是servlet, 每个jsp页面就是一个servlet实例.jsp由系统编译成servlet,servlet再负责响应用户的需求.
3.jsp的基本语法
jsp注释
<%-- 注释内容--%>
jsp声明
<%!
public int coutn;
public String info(){
return“hello”;
}
%>
输出表达式
<%= %>
<body>
<%=count++ %>
</body>
jsp脚本
<% %>
4.jsp的三个编译指令
page
描述当前界面的指令
include
可以将外部文件嵌入到当前的jsp文件中
可包含静态文本和动态的jsp界面
taglib
自定义标签
5.7个动态指令
动作指令是运行时的动作, 编译指令是通过servlet引擎处理消息.
(1) forward指令
用于将页面响应转发到下一个界面, 可携带参数.
<body>
<jsp:forwardpage:”forward-result.jsp”>
<jsp:paramname=”age” value = “29”>
</jsp:forward>
</body>
forward-result.jsp
<body>
<%=request.getParameter(“age”) %>
</body>
forward指令给人的感觉是将用户请求转发到了一个新的界面, 但实际上, 它只是完全采用了新界面来对用户进行响应. 请求依然是一次请求, 所以请求参数,请求属性都不会丢失.
(2) include
这个动态导入, 区别于静态导入.
l 静态导入是将被导入页面代码的完全融入, 动态导入则在Servlet中使用include方法来引入被导入页面的内容.
l
(3) useBean, setProperty, getProperty
(4)param指令
一般与
jsp:include
与inlcude结合, 参数指令用于将参数值传入被导入界面
jsp:forward
与forward结合, param指令用于将参数值传入被转向的界面
jsp:plugin结合使用
与plugin结合, param指令用于将参数值传入JavaBean或者Appet实例
<jsp:param name=”paramName”value=”paramValue”>
6.jsp中的9个内置对象
l 浏览器的工作: 1.向远程服务器发送请求 (2)读取远程服务器返回的字符串数据 (3)根据字符串数据渲染出一个丰富多彩的界面
l web服务器的工作: 1.启动单独的工作线程 2.使用I/O流读取用户请求的二进制流数据3.从请求数据中解析参数 4.处理用户请求 5.生成响应数据6.使用I/O流向客户端发送请求数据.
1,2,6步骤由浏览器完成, 345 由web服务器调用Servlet的_jspService方法来完成. _jspService的主要作用是, 负责完成解析参数 处理请求 生成响应等业务功能.
web服务器在执行了第三步解析到用户的请求参数之后, 将需求通过这些参数来创建HttpServletRequest,HttpServletResponse等对象. 作为调用_jspService的参数
由上面得知: web应用里的jsp页面和Servlet等程序都由web服务器来调用.桥梁是类Map的四个结构: application,session, request, page.
(1)application对象
通常有两个作用:
1是让JSP Servlet之间共享数据
2是访问web应用的配置参数
(2)config对象
jsp页面的配置信息, 使用较少
(3)exception对象
在_jspService代码块中, 有try catch语句
所有jsp的静态脚本, 静态HTML部分都会转化为try语句中的代码,一旦发现异常, 就会在catch中进行处理, 由_jspx_page_context对异常进行处理. 如果该页面的page指令指定了errorPage属性, 那么将请求forward到errorPage属性指定的界面. 否则使用系统的页面来输出错误信息
(4)out对象
out对象代表一个页面的输出流, 通常用于在页面上输出变量值及常量.一般在使用输出表达式的地方, 都可以使用out对象来达到同样的效果.
例如下面的一段代码:
<%@ page contentType=”text/html; charset=GBK”language=”java” errorPage=”” %>
<%@ page import=”java.sql.*” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0Transitional//EN”
“http://www.w3.org/TR/xhtml1-transitional.dtd”>
<htmlxmlns=”http://www.w3.org/1999/xhtml”>
<head>
<title>out 测试</title>
</head>
<%
Class.forName(“com.mysql.jdbc.Driver”);
Connection conn = DriverManager.getConnection(
“jdbc:mysql://localhost:3306/javaee”,“root”, “111111”);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(“select * fromnews_inf”);
%>
<table bgcolor=”#9999dd” bord=”1 width=”400”>
<%
while(rx.next())
//输出表格行
out.println(“<tr>”);
//输出表格列
out.println(“<td>”);
输出结果集第二列的值
out.println(rs.getString(1));
关闭表格列
out.println(“</td>”);
关闭表格行
out.println(“</tr>”);
}
%>
</table>
</body>
</html>
(5)pageContext
该对象主要用于JSP之间的数据共享. 使用pageContext可以访问page, request, session, application范围的变量.
(6)request对象
每个request对象封装着用户的一次请求. 并且所有的 请求参数都被封装在request对象中, 因此request对象是获取请求参数的重要途径.
1. 获取请求头. 请求参数
JSP/Servlet获取请求的途径就是request. request是HttpServletRequest接口的实例.
请求头和请求参数, 都是由用户发送到服务器的数据, 区别是请求头通常由浏览器自动添加, 而请求参数通常需要开发人员控制添加.
2. 操作request范围的属性.
表单请求的request参数, 在jsp forward用户请求的时候. 请求参数和request范围的属性都不会丢失, 即forward之后, 还是原来的请求, 并没有再次向服务器发送请求.
3. 将jsp页面include到本页面中
getRequestDispatcher(“a.jsp”).include(request, response);
4. 将请求forward到jsp页面
getRequestDispatcher(“a.jsp”).forward()
(7)response对象
response代表服务器对客户端的响应, 大部分时候, 程序无需使用response来响应客户端请求, 因为有个简单的响应对象----out. 它代表界面的输出流, 直接使用out生成响应更简单, 但是out是JspWriter的实例, JspWriter是Writer的子类, Writer是字符流. 无法输出非字符内容. 假如需要在JSP页面中动态生成一幅位图, 或者一个PDF文档, 则必须使用response作为响应输出.
1. response响应生成非字符响应
生成一个位图
ImageIO.write(image, “png”, response.getOutputStream())
2. 重定向
与request不同的是, reponse重定向将生成第二次请求, 与前一次不在同一个request范围内, 所以发送一次请求的请求参数和request范围的属性会全部丢失.
response.sendRedirect(“redirect-result.jsp”);
输入http://localhost:8888/jspObject/doRedirect.jsp?name=lynash
那么会自动跳转到redirect-result.jsp界面. 并且参数name的值为空
所以使用重定向, 与在地址栏
3. 增加Cookie
session会随浏览器的关闭而失效, 但Cookie会一直存放在客户端机器上, 除非超出Cookie的生命周期
向客户端写Cookie的过程
创建Cookie实例, Cookie的构造器为Cookie(String name, String value)
Cookie c = new Cookie(“username”, name);
设置Cookie的生命期限,
c.setMaxAge(24*3600);//24小时
向客户端写Cookie
response.addCookie(c);
需要访问客户端的Cookie, 需要通过request对象.
(8)session对象
session代表一次用户会话,
一次会话:客户端浏览器连接服务器开始,到客户端浏览器与服务器断开为止, 这个过程是一个会话过程.
session范围内的属性可以在多个页面的跳转间共享, 一旦关闭浏览器, 即session结束, session范围内的属性将全部丢失.
关于session的机制, 通常用于保存客户端的状态信息, 这些状态信息需要保存到web服务器的硬盘上, 所以要求session里的属性值, 必须是可序列化的. session的属性值是任何可序列话的java对象,