概述
- JSP全称Java Server Pages,是一种动态网页开发技术,使用JSP标签在HTML网页中插入Java代码,简化Server编写
- 只对网页中需动态产生的内容采用Java代码编写,静态内容则采用HTML网页方式编写
- Servlet的缺陷(JSP出现的原因):写静态页面必须部署后才能看到效果,很难控制页面的外观
- JSP以静态代码为主,Java代码为辅,Servlet反之
- JSP从本质上来说内核还是Servlet,但与Servlet不是替代关系而是一种互补的关系
- JSP适合于写显示层的动态页面(与HTML书写位置相同),而Servlet则适合写控制层的业务控制(页面转发,与java书写位置相同)
- JSP的执行效率低于Servlet
运行原理
- WEB容器接受到以.jsp为扩展名的URL访问请求时,将请求交给JSP引擎去处理,JSP引擎将它翻译成Servlet源程序,再编译成class类文件,之后由WEB容器装载执行
- JSP规范没要求脚本代码必须采用Java语言,但JSP页面最终会转换为Java Servlet程序
- eclipse中修改jsp模板编码:window → Preferences → Web → JSP Files → Encoding → 修改编码 → Apply and Close
生命周期
- 1.访问jsp页面时,web容器查找是否有相关对象
- 2.无则将.jsp翻译为.java文件,再编译为.class文件
- 3.创建构造器,实例化对象
- 4.执行_jspInit()方法,将对象放入WEB容器中
- 5.执行_jspService()方法,处理业务逻辑,把信息响应回客户端(不调用doGet/doPost方法)
- 6.若第一次访问有相关对象,则直接执行第5步
- 7.长时间未调用,WEB容器会调用_jspDestroy()方法对jsp进行回收
注释
- java格式注释
- 编译器会忽略掉此类注释中的内容(客户端的源码看不见)
- <%-- JSP注释,可多行 --%>
- <%// java单行注释 %>
- <%/* java 多行注释 */%>
- <%/** java 文档注释 */%>
- html格式注释
- 编译器会执行注释中的代码(客户端的源码看得见)
- <!-- html格式注释 -->
- 缺点:页面注释信息太多的时候会增大服务器的负荷,注释信息需在网络上传输从而降低效率且不安全
指令元素(JSP标签)
- 以<%@ 开始, 以%> 结束,用来设置整个JSP页面相关的属性(以键值对的形式存在,并用逗号隔开),如网页的编码方式和脚本语言
- 指令元素主要有三种:page,include,taglib
page指令
- <%@ page … %> 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
- 在一个jsp文件中,至少有一个page指令元素,放在页面的最上面. 描述jsp页面的服务器端属性设置
- 常用属性
- language=“java” //表示脚本中使用的编程语言
- contentType=“text/html; charset=UTF-8” //设置了内容的类型和静态页面的编码
- pageEncoding=“UTF-8” //页面本身的编码格式
- buffer=“8kb” //页面的缓存默认是8kb
- session=“true” //相当于request.getSession(true)
- errorPage=“路径” //表示当前jsp发生服务器端错误的时进入此路径(路径里要有isErrorPage="true"属性)
- import //导入其他的包和类
- <%@page import=“java.util.Date”%> //具体的包和类
- <%@page import=“java.sql.*”%> //包下的所有类
- <%@page import=“java.util., java.io., java.net.*”%> //连写,逗号分隔
- session //指示当前的jsp是否参与会话(默认为true参与会话)
- <%@page session=“false”%> //与session不可会话
Include指令
- <%@ include … %> 包含其他文件
- 把目标页面的内容放到当前页面,产生页面叠加以后的输出效果
- 常用属性
- file=“路径” //导入目标页面路径
Taglib指令
- <%@ taglib … %> 引入标签库的定义
- 常用属性
- uri=“uri” //确定标签库的位置
- prefix=“c” //指定标签库的前缀
基础语法
- JSP的声明
- <%! 代码 %>
- 位于jsp转换为.java文件的service方法的外部,类的里面
- 定义在产生的类文件中的类的属性和方法,也可声明内部类
- 最先加载,可写于任何位置,无顺序
- JSP代码段
- <% 代码 %>
- 位于jsp转换为.java文件的Service方法中
- 书写Java语句、局部变量、输出或流程控制语句
- 具有上下顺序
- JSP表达式
- <%= 代码 %>
- 位于jsp转换为.java文件的Service方法中代码片断
- 书写Java语言规范的表达式
- 执行的顺序为从左到右,不能使用分号
- 计算表达式的值,将值转换成String,用out.println发送标签,把数据输出至页面的当前位置
动作元素
- 动作元素在请求处理阶段起作用,为请求处理阶段提供信息,遵循XML元素的语法,利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码
- Include动作
- 形式:<jsp:include page=“url”> </jsp:include>
- 等价于Servlet中通过RequestDispatcher.include()
- 用来包含静态和动态的文件,该动作把指定文件插入正在生成的页面
- 与include指令不同的是,include指令是在JSP文件被转换成Servlet的时候引入文件,而Include动作是在页面被请求的时候
- 传参:<jsp:param name=“name” value=“value”/>
- 属性
- page:包含在页面中的相对URL地址
- flush:布尔属性,定义在包含资源前是否刷新缓存区
- forward动作
- 形式:<jsp:forward page=“url”> </jsp:forward>
- 等价于Servlet中通过RequestDispatcher.forward()
- 该动作把请求转到另外的页面
- 传参:<jsp:param name=“name” value=“value”/> //写在forward动作中
- useBean动作
- 形式:<jsp:useBean id=“name” class=“完整包名”/>
- 用来装载一个将在JSP页面中使用的JavaBean(Java组件)
- setProperty动作
- 形式:<jsp:setProperty name=“BeanIdName” property=“Bean属性名”/>
- 设置已经实例化的Bean对象的属性,与useBean连用
- getProperty动作
- 形式:<jsp:getProperty name=“BeanIdName” property=“Bean属性名”/>
- 获得已经实例化的Bean对象的属性,转换成字符串,与useBean连用
内置对象
- 也称隐式对象,是JSP容器为每个页面提供的Java对象,可以直接使用
| 对象 | 描述 |
|---|---|
| page | 当前类的当前对象等同于编译后的Servlet,类似于Java类中的this关键字 |
| pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
| request | HttpServletRequest类的实例,Http请求对象 |
| response | HttpServletResponse类的实例,Http响应对象 |
| session | HttpSession类的实例,会话对象 |
| application | ServletContext类的实例,定义全局属性,应用上下文 |
| config | ServletConfig类的实例,用于访问Servlet或者JSP引擎的初始化参数,需要在web.xml中,针对jsp进行配置 |
| out | JspWriter类的实例,用于输出,往浏览器写内容 |
| exception | Exception类的对象,包装了从先前页面中抛出的异常信息 |
- 范围对象
- pageContext对象:主要用于存取属性,是page的上下文
- Object getAttribute(String name, int scope) //获取name属性
- Enumeration getAttributeNamesInScope(int scope) //获取所有属性范围为scope的属性名称
- void removeAttribute(String name, int scope) //移除属性名称为name的属性对象
- void setAttribute(String name, Object value, int scope) //设置属性名称为name的属性对象
- Exception getException() //获取目前网页的异常,不过此网页要为error page
- JspWriter getOut() //获取目前网页的输出流
- Object getPage() //获取目前网页的Servlet
- ServletRequest getRequest() //获取目前网页的请求
- ServletResponse getResponse() //获取目前网页的响应
- ServletConfig getServletConfig() //获取目前此网页的ServletConfig
- ServletContext getServletContext() //获取目前此网页的执行环境(context)
- HttpSession getSession() //获取和目前网页有联系的会话(session)
- request对象:获取请求的来源、标头、cookies和请求相关的参数值等等
- void setAttribute(String name, Object value) //设定name属性的值为value
- Enumeration getAttributeNamesInScope(int scope) //获取所有scope范围的属性
- Object getAttribute(String name) //获取name属性的值
- void removeAttribute(String name) //移除name属性的值
- String getParameter(String name) //获取name的参数值
- Enumeration getParameterNames() //获取所有的参数名称
- String[] getParameterValues(String name) //获取所有name的参数值
- Map getParameterMap() //获取一个要求参数的Map
- String getHeader(String name) //获取name的标头
- Enumeration getHeaderNames() //获取所有的标头名称
- Enumeration getHeaders(String name) //获取所有name的标头
- int getIntHeader(String name) //获取整数类型name的标头
- long getDateHeader(String name) //获取日期类型name的标头
- Cookie[] getCookies() //获取与请求有关的cookies
- String getContextPath() //获取Context路径
- String getMethod() //获取HTTP的方法
- String getProtocol() //获取使用的协议
- String getQueryString() //获取请求的参数字符串
- String getRequestedSessionId() //获取用户端的Session ID
- String getRequestURI() //获取请求的URL,但是不包括请求的参数字符串
- String getRemoteAddr() //获取用户的IP 地址
- String getRemoteHost() //获取用户的主机名称
- int getRemotePort() //获取用户的主机端口
- String getRemoteUser() //获取用户的名称
- void getCharacterEncoding(String encoding) //设定编码格式,用来解决窗体传递中文的问题
- session对象:表示目前个别用户的会话
- void setAttribute(String name, Object value) //设定指定名字的属性的值
- Object getAttribute(String name) //获取指定名字的属性的值
- void removeAttribute(String name) //删除指定名字的session属性
- void invalidate() //取消session对象,并将对象存放的内容完全抛弃
- String getId() //获取session的ID
- long getMaxInactiveInterval() //获取最大session不活动的时间,若超过这时间,session将会失效
- void setMaxInactiveInterval(int interval) //设定最大session不活动的时间,若超过这时间,session将会失效
- long getCreationTime() //获取session产生的时间,单位是毫秒
- long getLastAccessedTime() //获取用户最后通过这个session送出请求的时间
- boolean isNew() //判断session是否为"新"的会话
- application对象:存取ServletContext中的信息
- int getMajorVersion() //获取Container主要的Servlet API版本
- int getMinorVersion() //获取Container次要的Servlet API版本
- String getServerInfo() //获取Container的名称和版本
- String getMimeType(String file) //获取指定文件的MIME类型
- ServletContext getContext(String uripath) //获取指定Local URL的Application context
- String getRealPath(String path) //获取本地端path的绝对路径
- void log(String message) //将信息写入log文件中
- void log(String message, Throwable throwable) //将stack trace所产生的异常信息写入log文件中
- pageContext对象:主要用于存取属性,是page的上下文
- 其他对象
- response对象:将处理数据后的结果传回到客户端
- 设定表头的方法
- void addCookie(Cookie cookie) //新增cookie
- void addDateHeader(String name, long date) //新增long类型的值到name标头
- void addHeader(String name, String value) //新增String类型的值到name标头
- void addIntHeader(String name, int value) //新增int类型的值到name标头
- void setDateHeader(String name, long date) //指定long类型的值到name标头
- void setHeader(String name, String value) //指定String类型的值到name标头
- void setIntHeader(String name, int value) //指定int类型的值到name标头
- 设定响应状态码的方法
- void sendError(int sc) //传送状态码
- void sendError(int sc, String msg) //传送状态码和错误信息
- void setStatus(int sc) //设定状态码
- String encodeRedirectURL(String url) //对使用sendRedirect()方法的URL予以编码
- out对象:以字符流的形式输出数据
- void clear() //清除输出缓冲区的内容
- void clearBuffer() //清除输出缓冲区的内容
- void close() //关闭输出流,清除所有的内容
- int getBufferSize() //获取目前缓冲区的大小(KB)
- int getRemaining() //获取目前使用后还剩下的缓冲区大小(KB)
- boolean isAutoFlush() //获取true表示缓冲区满时会自动清除;false表示不会自动清除并且产生异常处理
- exception对象
- getMessage() //获取异常信息
- getLocalizedMessage() //获取本地化后的信息
- printStackTrace(new java.io.PrintWriter(out)) //打印日志
- config对象
- String getInitParameter(name) //获取名称为name的初始参数的值
- Enumeration getInitParameterNames() //获取所有初始参数的名称集合
- ServletContext getServletContext() //获取ServletContext对象
- Sring getServletName() //获取编译后的Servlet名称
- response对象:将处理数据后的结果传回到客户端
表达式语言(EL)
jsp默认就支持EL表达式,使得访问存储在JavaBean中的数据变得非常简单,为网页美工而设,使jsp趋向于html,EL不能进行逻辑处理,可以代替<%= 表达式%>代码部分
- 语法
- ${表达式} //表达式可为数字,字符串,布尔值,null
- 用单引号或双引号定界
- 运算符
- 算术运算符:+, -,*,/(或 div),%(或 mod)
- 关系运算符:==(或 eq),!=(或 ne),<(或 lt),>(或 gt),<=(或 le),>=(或 ge)
- 逻辑运算符:&&(或 and),||(或 or),!(或 not)
- 验证运算符:empty //${empty name}
- 变量和JavaBean属性数据输出
- 在范围对象中查找相应属性,而非直接在页面中查找实例或局部变量
- 表达式语言查找变量的顺序是:pageContext→request→session→application //从小到大查找所有范围都未找到时,赋值null
- 存取器
- []:输出对象属性值,输出数组或集合中对应索引值
- .:输出对象属性值
- 隐含对象
| EL隐藏对象 | JSP隐藏对象 |
|---|---|
| pageScope/pageContext | pageContext |
| requestScope | request |
| sessionScope | session |
| applicationScope | appication |
| param | request.getParameter() |
| paramValues | request.getParameterValues() |
| header | request.getHeader()按照key-value的形式取出String类型值 |
| headerValues | request.getHeader()按照key-value的形式取出String类型的集合 |
| cookie | request.getCookies() |
| initParam | 上下文初始化参数 |
标准标签库(JSTL)
JSTL是一个JSP标签集合,减少java代码,简化页面编写,封装了JSP应用的通用核心功能
- 步骤
- 复制jstl的jar包(jstl.jar,standard.jar)到/WEB-INF/lib
- 在使用jstl功能的jsp页面中增加指令
- <%@taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%> //核心标签库
- <%@taglib prefix=“x” uri=“http://java.sun.com/jsp/jstl/xml”>
- <%@taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt”>
- <%@taglib prefix=“sql” uri=“http://java.sun.com/jsp/jstl/sql”>
- <%@taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions”>
- prefix表前缀(可改),uri 指向标签库的入口
- 核心标签
- <c:out/> //在JSP中显示数据
- value=“要输出的内容”
- default=“输出的默认值”
- escapeXml=“false” //是否忽略XML特殊字符
- <c:set/> //设置变量值和对象属性
- value //要存储的值
- target //要修改的属性所属的对象
- property //要修改的属性
- var //存储信息的变量
- scope //var属性的作用域
- <c:remove/> //移除一个变量
- var //要移除的变量名称
- scope //变量所属的作用域
- <c:catch></c:catch> //处理产生错误的异常状况,并且将错误信息储存起来
- var //用来储存错误信息的变量
- <c:if></c:if> //判断表达式的值
- var //用于存储条件结果的变量
- test //条件
- scope //var属性的作用域
- <c:choose></c:choose> //相当于switch,<c:when></c:when> //相当于case,<c:otherwise></c:otherwise> //相当于default
- test //条件
- <c:forEach></c:forEach> //相当于for循环
- var //代表当前条目的变量名称
- begin //开始的元素
- end //最后一个元素
- step //迭代的步长
- items //要被循环的信息
- <c:forTokens></c:forTokens> //与c:forEach相似
- delims //分隔符,其他属性与上相同
- <c:import/> //jsp:include功能相同
- url //需要检索和引入的页面的URL
- charEncoding //所引入的数据的字符编码集
- <c:url></c:url> //将URL格式化为一个字符串,然后存储在一个变量中
- value //基础URL
- context //本地网络应用程序的名称
- var //代表URL的变量名
- scope //var属性的作用域
- <c:param> //指定c:url参数
- name //URL中要设置的参数的名称
- value //参数的值
- <c:redirect> //重定向至一个新的URL
- url //目标URL
- context //紧接着一个本地网络应用程序的名称
- <c:out/> //在JSP中显示数据
版权声明:本文为weixin_45453240原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。