jsp理解
jsp像写HTML一样,只是单一的HTML是静态的使用不灵活,jsp可以在页面中嵌套Java代码,使用起来更加方便灵活,可以动态获取数据。jsp技术基于Servlet, 是对 Servlet 的包装。同时也在Servlet的基础上进行了扩展,更容易对数据进行排版。
Tomcat 服务器会把 jsp 页面解析先成为一个 java 源文件。再编译成为.class 字 节 码 程 序
JSP 公式:
jsp=html+java 片段+标签+javascript+css
page 指令(常用的)
1. language: jsp 翻译后是什么语言文件, 只支持 java
2. contentType : jsp 返回的数据类型,对应源码中 response.setContentType()参数值
3. pageEncoding 属性:当前 jsp 页面文件本身的字符集
4. import 属性: 跟 java 源代码中一样。用于导包,导类
JSP 三种常用脚本基本语法
声明脚本格式:<%! 声明 java 代码 %>
声明脚本用于定义 jsp 的需要属性、方法、静态代码块和内部类等。
表达式脚本格式:<%属性=表达式%>
在 jsp 页面上输出数据 , 表达式脚本中的表达式不能以分号结束。
代码脚本格式:<% java 代码%>
可编写需要的功能代码,代码脚本可以和表达式脚本一起组合使用,在 jsp 页面上输出数据。
JSP 九大内置对象
1. out 向客户端输出数据,out.println("");
2. request 客户端的 http 请求
3. response 响应对象
4. session 会话对象
5. application 对应 ServletContext
6. pageContext jsp 页面的上下文,是一个域对象,可以 setAttribue(),作用范围只是本页面
7. exception 异常对象 , getMessage()
8. page 代表 jsp 这个实例本身
9. config 对应 ServletConfig
JSP 域对象
1. pageContext 域对象:存放的数据只能在当前页面使用,其他页面无法取出数据,范围最小。例:请求转发。
2. request 域对象:存放的数据在一次 request 请求有效,第二次request无效。例:重定向
3. session域对象:存放的数据在一次会话有效,会话关闭无效。例:浏览器关闭
4. application域对象:存放的数据在整个 web 应用运行期间有效, 范围最大。例:Tomcat重启
域对象作用域范围:pageContext < request < session < appliction
注意事项和细节
jsp 页面嵌套了Java代码,不能直接用浏览器运行。要通过浏览器访问 Tomcat 来访问 jsp 页面。jsp 页面本质是一个 Servlet 程序,和Java相关联。
EL 表达式
EL 表达式语法:${key}
EL 表达式在输出 null 时,输出的是 " "空字符串
jsp 表达式脚本输出 null 的时,输出的是 "null" 字符串
EL 表达式常用输出 Bean 的普通属性、 数组属性、List集合属性和 map 集合属性
在Jspy页面中用EL表达式调用属性变量,输出数据更简洁。
EL运算语法:${ 运算表达式}
empty 运算可以判断一个数据是否为空,如果为空,返回 true,否则返回flase
●值为 null
● 值为空串的时
● 值是 Object 类型数组,长度为零
● list 集合,元素个数为零
● map 集合,元素个数为零
以上情况为空
EL 的三元运算和Java的三目运算符是一样的使用,只是语法表现不同
EL 的 11 个隐含对象
EL 四个特定域变量
可通过 request(http请求) 对象来获取和 HTTP 协议相关的数据
请求的协议:request.getScheme()
请求的服务器 ip 或域名:request.getServerName()
请求的服务器端口号:request.getServerPort()
当前工程路径:getContextPath()
请求的方式(GET 或 POST):request.getMethod()
客户端的 ip 地址:request.getRemoteHost()
会话的唯一标识:session.getId()
JSTL 标签库
JSTL 用于替换代码脚本,使 jsp 页面 变得更简洁。
JSTL 由五个标签库组成
使用前,需导入相关Jar包,导入后需要重新发布 web 工程,不然不会识别jstl。
<c:set/>:set 标签可以往域中保存数据
<c:if/>: if 标签用来做 if 判断。 test 属性表示判断的条件(用 EL 表达式输出)
<c:choose/>:相当于Java的switch
<c:when/>:相当于case
<c:otherwise/>:相当于default
这三个标签是一起组合使用的,使用的标签不是单标签,都要关闭。
<c:forEach/>:相当于for循环,用来遍历输出,主要有四种形式:
● 普通遍历输出 i 到 j
<c:forEach begin="1";end="5";var="i"> <li>排名=${i}</li> </c:forEach>
1.遍历 1 到 5,
2. 输出 begin 属性设置开始的索引 end 属性设置结束的索引
3. var 属性表示循环的变量(也是当前正在遍历到的数据)
4. 等价 for (int i = 1; i <= 5; i++)
● 遍历数组
<c:forEach items="${requestScope.sports}" var="sport"> 运动名称= ${sport}<br/> </c:forEach> 1. items 遍历的集合/数组 2. var 遍历到的数据 3. 等价 for (Object item: arr) {}
● 遍历 Map
<c:forEach items="${requestScope.cities}" var="city"> 城市: ${city.key}--${city.value}<br/> </c:forEach> 1. items 遍历的map集合 2. var 遍历到的数据 3. entry.key 取出key 4. entry.value 取出值
● 遍历 Lis
<c:forEach items="${requestScope.monsters}" var="monster"> 个人信息: ${monster.id}-${monster.name}-${monster.skill}<br/> </c:forEach> items 表示遍历的集合 var 表示遍历到的数据 monsters.属性值