JSP
Java server page 服务器端用来开发动态网页
原因: 替换servlet中显示逻辑的servlet
(获得作用域中的数据 + 想浏览器显示网页)
java+HTML (java代码嵌套html标签)
第一个JSP程序
//显示当前系统时间
1.代码命名: *.JSP
HTML代码+java代码(html标签嵌套java代码)
2.部署tomcat中
部署地位相当于html文件。
3.访问JSP
和HTML访问一样。
注意:
① jsp开发无须在web.xml中注册
② jsp代码无须程序员编译
JSP程序执行:
HTML表签直接输出浏览器
java代码,执行。如果有执行结果,显示给浏览器.
JSP对比servlet
servlet
java嵌套HTML
开发后需要程序员编译
在web.xml配置
修改代码需要重新启动tomcat
JSP
HTML嵌套java
直接部署,无须程序员手动编译
无需要在web.xml配置
修改代码无须重新启动tomcat
JSP中java脚本元素
表达式脚本: 将结果输出给浏览器
表达式? 1+1 a/b a++ a==b
<%= java表达式 %>
* 末尾不能有分号 ;
* 表达式有执行结果;
普通脚本
流程控制代码.
<% 普通java代码 %>
声明脚本
<%! 声明变量,定义函数的代码%>
注意:
1. java脚本不能嵌套HTML标签
2. java脚本不能相互嵌套.
JSP原理
本质上是Servlet程序.
JSP执行原理:
1. 浏览器请求jsp程序,tomcat将jsp翻译servlet程序(*.java)
2. 将servlet程序编译成class文件
3. 调用servlet程序service方法提供响应服务。
* 一次访问jsp
tomcat将jsp翻译servlet程序(*.java)
* 一旦修改jsp
tomcat将jsp重新发翻译servlet程序(*.java)
JSP的翻译规则
1.HTML标签部分,翻译成响应输出流方法中内容
JSP:
<body>
<h1></h1>
</body>
翻译Servlet:
pw.println("<body>");
pw.println("<h1></h1>");
pw.println("</body>");
2. 表达式脚本
将表达式翻译输出语句中的代码。
JSP:
<%=new java.util.Date() %>
翻译servlet:
pw.println(new java.util.Date());
3. 普通脚本
翻译成service方法内部的代码
4. 声明脚本
翻译成Servlet的成员变量(成员方法)
JSP指令元素
页面指令
<%@page 属性=’值‘%>
导包:
servlet: import java.util.*;
jsp: <%@page import="java.util.*" %>
设置响应的编码格式:
servlet:
resp.setCharacterEncoding("GBK");
resp.setContentType("text/html");
JSP:
contentType='text/html;charset=GBK'
设置jsp文件流编码
JSP:
pageEncoding='GBK'
获得session:
servlet: getSession();
JSP: session='true' 当前jsp中可以使用session
* session='false' 当前jsp中无法使用session
翻译后的servlet中没有getSession();
默认 值 true;
错误页面
isErrorPage=’false|true‘
表明当前jsp是否是一个错误页面
包含隐含exception对象。
errorPage='url-pattern'
指明如果当前页面有异常,自动跳转errorPage指向的页面
isELIgnored="false" 表明当前页面是否忽略EL表达式 [了解]
标签库指令
<%@taglib uri='' prefix=''%>
uri: 引入外部标签库的地址
prefix: 标签前缀
例如:
<%@taglib uri='/struts-tags' prefix=’s‘%>
<s:if>
包含指令
<%@include file=’被包含的jsp的url-pattern路径‘%>
注意:
静态包含,源代码包含,注意java变量重复声明的问题。
动作指令
包含动作
<jsp:include page="被包含的页面的路径 url-pattern"></jsp:include>
* 输出包含,动态包含。不会存在java变量冲突的 问题.
JSP 9大内置(隐含)对象
什么叫内置对象:
可以直接在java脚本中使用。不能在声明脚本中使用
是service方法局部变量.
exception
request HttpServletRequest
session HttpSession
application ServletContext
response HttpServletResponse
page this Object
out JspWriter 面向浏览器的输出流
config ServletConfig
web.xml ------ ServletContext
filter标签------FilterConfig
servlet标签------ServletConfig
pageContext【重点】
1. 作用域:存储命名属性
pageContext.setAttribute("name",值);
pageContext.getAttribute("name");
生命周期: 仅限当前jsp页面。
2. 管理其他所有的作用域:
pageContext
request
session
servletContext(application)
获得作用域中的值:
pageContext.getAttribute(arg0, arg1)
参数1: 获得的命名属性的名字
参数2: 指定的作用域 是一个int类型的数字 作用域对应的常量
pageContext 1 PageContext.PAGE_SCOPE
request 2 PageContext.REQUEST_SCOPE
session 3 PageContext.SESSION_SCOPE
servletContext 4 PageContext.APPLICATION_SCOPE
向作用域中存储值
pageContext.setAttribute(name, Value,作用域对应的常量)
3. 管理其他所有jsp内置对象。
获得request对象
pageContext.getRequest();
获得session对象
pageContext.getSession();
获得application对象(ServletContext)
pageContext.getServletContext();
案例:
动态获得 "/项目名"
HttpServletRequest
使用request:
request.getContextPath();
使用pageContext:
((HttpServletRequest)pageContext.getRequest()).getContextPath()
栗子
导入PersonSystemServlet项目,改名字;
左边---右键---import--general--Existing projects in workspace
---brows---项目目录---勾选 copy projects into workspace
该项目名:
项目名--右键--refacter---rename
项目名--右键--properties--搜 web--修改 web context root(改为项目名一致)
1.将通讯录展示所有联系人的页面
该JSP实现。
旧: showAllPersonAction --------->showAllPersonView
调用service获得list 获得request作用域list
list存入request作用域 显示成一个table
forward
新: showAllPersonAction --------->showAllPersonView.jsp
调用service获得list 获得request作用域list
<%request.getAttribute%>
list存入request作用域 显示成一个table
forward html嵌套java脚本.
2.完成显示所有商品功能
showAllProductAction showAllProductView.jsp
调用service获得list 获得request作用域list
list存入request作用域 显示成一个table
forward
ProductService:
public List<Product> getAllProducts();
ProductDAO
public List<Product> selectAllProducts();
实体Product:
添加JDBCUtil 配置文件 jar包
建表
创建web项目
批量删除
EL
expression language 表达式语言
特点: 结果输出给浏览器
语法:
java表达式脚本: <%= java表达式,调用方法%>
EL: ${java表达式}
访问语法: [] .
语法介绍
1. 数学运算符 + - * / %
注意: ${10/3} 3.33333333
2. 逻辑运算符 > < >= <= != ==
&& || !
3. 三目运算符 booleab表达式?值1:值2
4. 访问作用域中的值
访问pageContext作用域
${pageScope.命名属性的name}
获得request作用域中的命名属性
${requestScope.命名属性的name} 不是 <%=request%>
获得session作用域中的值
${sessionScope.命名属性的name}
获得servletContext作用域中的值
${applicationScope.命名属性的name}
5. 访问对象的属性
${对象.属性名}
* 原理 调用对象.get属性();
例如:
${person.username}
person.getUsername()
获得 /项目名
java: <%=request.getContextPath()%>
<%=((HttpServletRequest)pageContext.getRequest()).getContextPath()%>
EL: ${pageContext.request.contextPath} 【重要】
6. 访问请求参数
${param.请求参数的name}
7. 访问cookie
${cookie.cookie的name}
${cookie.cookie的name.value} //获得cookie得到value
8. 访问数组和List集合
${集合[下标]}
9. 访问Map
${map.key} //通过map的key获得value
总结EL中可以使用的内置对象
pageScope requestScope sessionScope applicationScope
pageContext param cookie
*重点记住:
1. 不要再JSP写java代码
2.
获得request作用域中的命名属性
${requestScope.命名属性的name}
获得session作用域中的值
${sessionScope.命名属性的name}
JSTL part I
jsp标签库。
作用: 条件判断,流程控制,循环。 url生成。
使用:
1. 导入jstl的jar包
2. 导入jstl
<%@taglib uri='http://java.sun.com/jsp/jstl/core' prefix=‘c’%>
if: 单条件判断
使用:
<c:if test='boolean表达式结果'>
条件成立执行。
</c:if>
choose: 多条件分支
when
otherwise
使用:
<c:choose>
<c:when test='条件1'>
条件1成立
</c:when>
<c:when test='条件2'>
条件1不成立,条件2成立
</c:when>
<c:when test='条件3'>
条件1,2都不成立,条件3成立
</c:when>
<c:otherwise>
else,条件都不成立
</c:otherwise>
</c:choose>
forEach 遍历集合
<c:forEach items='list' var='p'>
${p}
</c:forEach>
var:每次循环得到的当前元素对象。
items:被遍历的集合。
begin:遍历集合的起始下标
end:遍历集合的结束下标
step:下标渐变值。步长.
varStatus:
varStatus='aa'
aa.index 下标
aa.count 被遍历出来的元素个数(序号)
JSTL问题
1. jstl标签属性中,使用EL表达式,el表达式外不能写空格.
总结:
JSP开发
显示逻辑代码
EL+JSTL(不要出现java代码)
EL: ${requestScope}
${sessionScope}
${对象.属性名}
JSTL:
choose
forEach
JSTL part II
formatDate:
使用:
① 导入 <%@taglib uri="http://java.sun.com/jsp/jstl/fmt"
prefix="fmt" %>
② <fmt:formatDate value="" pattern=""/>
value: 要格式化的日期
pattern: 日期格式
年 yyyy
月 MM
日 dd
remove
使用:
<c:remove var='' scope='' />
删除作用域中的值
var:要删除的命名属性的name
scope:删除的作用域哪个
page pageContext作用域
request request作用域
session session作用域
application ServletContext作用域
url
使用:
<c:url value='url-pattern'></c:url>
1.将url-pattern转换成uri
2.在cookie被禁用的时候,自动将JESSSIONID追加在url后面
禁用cookie的解决办法:
1. 将jsp中所有的超链接,表单的action
<c:url value='url-pattern'></c:url>
2. 处理servlet中重定向的路径
response.encodURL(uri);
在uri后自动追加 jsessionid的值