JSP全称为Java Server Pages,其根本是一个简化的Servlet设计,实现了在Java中使用html标签。JSP是一种动态网页技术标准,也是JavaEE的标准。JSP同Servlet一样,是在服务器端执行的
三种开发技术对比
Jsp | Asp.net | PHP |
---|---|---|
基于Java平台,安全性高,跨平台型好,维护量大,适合大型企业 | 简单易学,但安全性与跨平台性差 | 简单高效,成本低,尤其适合中小型企业的Web应用开发 |
对于PHP有一个黄金组合,LAMP(Linux+Apache+MySQL+PHP)
JSP页面元素构成
- 指令
- 表达式
- 小脚本
- 声明
- 注释
- 静态内容
指令
- page指令:位于页面顶端,同一个页面可以有多个page指令
- include指令:将一个外部文件嵌入到当前的JSP文件中,同时解析这个页面中的JSP语句
- taglib指令:使用其定义新的自定义标签,并在JSP页面中启用这些定制的标签
page指令
语法格式:
<%@ page 属性1="属性值" 属性2="属性值1, 属性值2" 属性n="属性值n" %>
常用属性 | 描述 | 默认值 |
---|---|---|
language | 指定JSP页面使用的脚本语言 | java |
import | 通过该属性引用脚本语言中使用到的类文件 | 无 |
contentType | 用来指定JSP页面所采用的编码方式 | text/html; ISO-8859-1 |
推荐将contenType的值改为:text/html; charset=UTF-8
注释
在JSP中可以使用三种格式的注释
- html注释
<!--html注释-->
这种注释在客户端是可见的,即可以通过查看页面源码(F12)的方式看到
- JSP注释
<%--JSP注释--%>
这种注释在客户端不可见
- JSP脚本注释(注意还是需要
<%%>
包围)
<%//单行注释%>
<%/*多行
注释*/%>
这种在客户端不可见
小脚本
本身就是可以在JSP页面中执行的java代码
语法:<% Java代码 %>
需要注意:在JSP中System.out.println()是在java控制台输出,而想要在页面输出,必须使用out.println()
如果在这一步中出现对out.println()的编译报错,可能是没有引入tomcat的jar包
声明
声明就是在JSP页面中定义变量或者方法
语法:<%! Java代码 %>
例如:
<%!
String s = "haha";
int add(int x, int y){
return x+y;
}
%>
表达式
在JSP页面中执行的表达式
语法:<%=表达式 %>
注意:表达式不以分号为结束,而且第一个%号与=号之间不能有空格
JSP页面的生命周期
jspService()方法用来处理客户端的请求。对于每一个请求,JSP引擎创建一个新的线程来处理该请求,如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。每个客户端请求对应一个线程。以多线程方式执行可以大大降低对系统的资源需求,提高系统的并发量和响应时间,但也要注意多线程带来的同步问题,由于该Servlet始终驻留在内存,所以响应是非常快的。
jspService()和jspInit()方法可以在tomcat的work目录中,找到对应的工程进行查看
JSP内置对象
JSP内置对象是Web容器所创建的一组对象,不使用new关键字就可以使用的对象。
常用内置对象有:
- out
- request
- response
- session
- application
out对象
方法名 | 含义 |
---|---|
void println() | 向客户端打印字符串 |
void flush() | 将缓冲区的内容输出到客户端 |
void clear() | 清除缓冲区内容,如果在flush()之后调用会抛出异常 |
void close() | 关闭输出流 |
void clearBuffer() | 清除缓冲区内容,在flush()之后调用不会抛出异常 |
int getBefferSize() | 返回缓冲区的字节数大小,如不设置缓冲区则返回0 |
int getRemaining() | 返回缓冲区还剩余多少可用 |
boolean isAutoFlush() | 返回缓冲区满时,是自动清空还是抛出异常 |
request对象
它是HttpServletRequst类的实例。客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求并作出响应。
response对象
是HttpServletResponse类的实例,包含了响应客户请求的有关信息。该对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其它页面的response对象对当前页面无效。
尽管response对象比较重要,但实际在JSP中,很少直接去使用它
值得注意的是:
<p>这是一个相应页面</p>
<%
out.println("out生成的页面");
PrintWriter outer = response.getWriter();
outer.println("outer新生成的对象");
%>
执行后的页面结果为:
outer新生成的对象
这是一个相应页面
out生成的页面
也就是是,通过response.getWriter()
方法获得的PrintWriter对象会显示在正常的页面流的前面。为了解决这种问题,可以通过out.flush()
将outer对象前面的部分进行强制输出
session对象
是HttpSession类的实例。session对象在第一个JSP页面被装载时自动创建,完成会话期管理
session生命周期
- 创建:当客户端第一次访问某个jsp或者Servelet时,服务器会为当前会话创建一个SessionId,每次客户端向服务器发送请求时,都会将这个SessionId携带过去,服务器会对它进行校验
-
活动:
- 某次会话当中通过超链接打开的新页面属于同一次会话
- 只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话
- 除非本次会话的所有页面都关闭(主动关闭或超时关闭),重新访问某个jsp或者Servelet将会创建新的会话
注意原有会话还存在,即这个旧的SessionId仍然存在于服务器中,只不过再也没有客户端会携带它然后交予服务器进行校验
-
销毁:有三种方式
- 调用session.invalidate()方法
- Session过期(超时)
- 服务器重新启动
application对象
application对象开始于服务器的启动,终于止服务器的关闭(服务器的启动和关闭决定了application对象的生命)。
application对象实现了用户间数据的共享,可以存放全局变量。在用户的前后连接或者不同用户之间的连接中,可以对application对象的同一属性进行操作,在任何地方对application对象属性的操作,都会影响到其他用户对此的访问。
JavaBeans
JavaBeans就是符合某种特定规范的Java类。使用JavaBeans的好处是解决代码重复编写,减少代码冗余,功能区分明确,提高代码的可维护性
附录
get与post
表单常见的两种方式有get和post
- get:以明文的方式通过URL提交数据,数据在URL中可见,提交的数据最多不超过2KB。其安全性较低,但是效率比POST要高,适合提交数据量不大,安全性不高的数据,例如搜索、查询等功能
- post:将用户提交的数据封装在HTML Header中。适合提交数据量大,安全性高的用户信息。比如注册、修改等功能
请求重定向与请求转发
- | - | 代码示例 | 说明 |
---|---|---|---|
请求重定向 | 客户端行为 | response.sendRedirect() | 本质上相当于两次请求,前一次请求对象不会保存,地址栏的URL会改变 |
请求转发 | 服务器行为 | request.getRequestDispatcher().forward(req,resp) | 只是一次请求,转发后请求对象会保存,地址栏的URL不会改变 |
session
session表示客户端与服务器的一次会话,其存在的时间是从进入网站到浏览器关闭这段时间
session会保存在服务器内存中,而且用户与session一一对应,不同的用户对应的session不同。当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象
从一个客户打开浏览器并连接服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。
有些页面也设置有过期时间,一旦长时间离开页面,会话也可能被关闭
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。