JSP
JSP:Java server pages(Java服务器页面)
JSP是在HTML代码中嵌入Java代码。在JSP页面中HTML比较容易写,而写Java代码就比较难
当JSP第一次发起请求时,JSP引擎会将其转译成servlet(.java文件),接着由servlet引擎会将servlet编译成(.class文件)并执行。
Jsp 单例多线程:
当jsp页面被第一次请求时,这个jsp的一个实例会被创建并加载到内存中,接着系统会启动一个线程来执行jsp中的java代码,对于后续到来的每个请求,都会启动一个线程来访问这个jsp实例。
实例变量(<%! %>声明中定义的)被访问这个jsp的所有线程共享
局部变量(<% %>脚本中定义的)每个线程拥有一份自己的拷贝
五种元素
name | purpose |
---|---|
<% %> | jsp脚本 |
<%= %> | jsp表达式 |
<%@ %> | jsp指令 |
<%– –%> | jsp注释 |
<%! %> | jsp声明 |
<%– –%> jsp注释不会再servlet出现
// java、servlet注释会到servlet,但不会出现在HTML
\ html注释会被编译和执行,发送到浏览器,但浏览器不会显示它们
九个内置对象
类型 | 对象 | 作用域 |
---|---|---|
request | ServletRequest | 请求对象 |
response | ServletResponse | 响应对象 |
pageContext | PageContext | 页面上下文对象 |
session | HttpSession | 会话对象 |
application | ServletContext | 应用程序对象 |
out | JspWriter | 输出对象 |
config | ServletConfig | 配置对象 |
page | Object | 页面对象 |
exception | Throwable | 例外 |
“exception” 对象则代表了JSP文件运行时所产生的例外对象,此对象不能在一般JSP文件中直接使用,而只能在使用了“<%@ page isErrorPage=”true “%>”的JSP文件中使用
作用域范围:
- page: 在当前jsp页面里。从变量放入到jsp页面结束,都可以使用
- request: 当前请求周期。就是指从http请求发起,到服务器处理结束,返回响应的整个过程。在这个过程中可能使用forward(请求转发)的方式跳转了多个jsp页面,在这些页面里都能使用
- session: 当前会话。就是指从客户打开浏览器开始,到客户关闭浏览器这中间的过程。只要用户不关闭浏览器,会话中的变量就可以在当前会话的所有请求中使用
- application: 整个应用。应用的启动到结束。并没有说是服务器的启动到关闭,因为一个服务器可能部署了多个应用,当然关闭服务器,会把上面的所有应用都关闭。application作用域的变量存活时间最长,如果不手动删除,就可以一直使用。
不同的是:application里的变量可以被所有用户共用,page,request,session都是完全隔离的。
如果甲用户修改了application中的变量,乙用户再去访问得到的是修改后的值。而page,request,session中的值无论作何修改,都不会影响其他人的数据。
request对象中的方法:
- getParameter(String param) 根据参数名来获取参数的值
- getParameterValues(String param) 获得参数的多个值(复选框)
- getParameterNames() 返回一个枚举Enumeration类的对象。其中只包含请求request中包含的参数
- setCharacterEncoding(“UTF-8”) 设置中文字符,radio中“男”,直接取值不会乱码,但要用post方法
请求转发:
RequestDispatcher rd = request.getRequestDispatcher(“xxx.jsp”);
rd.forward(request,response);
重定向:
response.sendRedirect(xxx.jsp);
在web应用程序中获取文件的真实路径。“/”表示当前应用程序的根目录
String path = this.getServletContext().getRealPath(“/”);
JSP生命周期
- 解析:servlet容器解析jsp文件代码
- 翻译:servlet容器把jsp文件翻译成servlet源文件
- 编译:servlet容器编译源文件,生成servlet类
- 初始化:加载与jsp对应的servlet类,创建实例,并调用他的初始化方法
- 运行:调用与jsp对应的servlet实例的服务方法
- 销毁:调用与jsp对应的servlet实例的销毁方法,然后销毁servlet实例
JSP单例多线程,从第二次访问开始,系统只会启动另一个线程来调用实例的服务方法
JSP与HTML的区别
- HTML是静态页面,能直接使用浏览器打开。JSP是动态页面,需发布在web服务器如Tomcat上才能打开
- HTML中不能写java脚本,只能写js脚本。JSP中使用JSP脚本<% %>写java代码