JSP&EL&JSTL
今日任务
- 商品信息的显示
教学导航
教学目标 |
掌握JSP的基本的使用 掌握EL的表达式的用法 掌握JSTL的常用标签的使用 |
教学方法 |
案例驱动法 |
1.1 案例一:商品信息的显示的案例:
1.1.1 需求:
将数据库中的商品的信息,显示到页面中.尽量少使用<%%>形式.
1.1.2 分析:
1.1.2.1 技术分析
【JSP技术】
- JSP的概述:
JSP:Java Server Pages.
为什么要有JSP:Servlet显示页面元素的时候有自身缺陷.
使用JSP:
* JSP的脚本:
* JSP的注释:
* JSP的内置对象:
* JSP的指令:
* JSP的标签:
- JSP的脚本:
一种:<%! %> :翻译成Servlet内部的内容
二种:<% %> :翻译成Servlet的service方法内部东西.
三种:<%= %> :翻译成out.print();
- JSP的执行原理:
JSP也会被翻译成Servlet.被编译成class.
- JSP的注释:
JSP支持三种注释:HTML的注释 Java代码注释 JSP的注释:
<h3>HTML的注释</h3>
<!-- HTML的注释:可以存在JSP源码中,翻译成的Servlet中的注释也存在,在HTML的代码中也会存在. -->
<h3>Java代码的注释</h3>
<%
// 单行注释 可以存在于JSP源码中 在翻译成Servlet的时候,Java代码的注释也是会存在的.但是生成HTML的页面之后,注释就会消失了.
/*
多行注释
*/
/**
* 文档注释
*/
%>
<h3>JSP的注释</h3>
<%-- JSP的注释:只会存在于JSP的源代码中,当代表翻译成Servlet了 JSP的注释就消失了. --%>
- JSP的指令:
JSP的指令:JSP中的三大指令。
语法:<%@ 指令的名称 属性名=”属性值” 属性名=”属性值”%>
* page指令:
* language :JSP的语言的属性.现在只能是java.
* contentType :设置浏览器默认的打开的时候的编码.
* pageEncoding :设置JSP文件保存到硬盘,以及翻译成Servlet保存到硬盘的编码格式.
* import :设置JSP中引入其他的类.import属性可以出现多次的.
* extends :设置JSP被翻译成Servlet后继承的类:默认值:org.apache.jasper.runtime.HttpJspBase. 修改这个值得话一定要使这个类是一个Servlet才可以.
* autoFlush :设置自动刷出缓存
* buffer :JSP的缓冲区的大小。默认8kb
* session :默认值是true.设置JSP的页面中是否可以直接使用session对象.
* isELIgnored :设置JSP是否忽略EL表达式.默认值false 不忽略.可以在JSP中写EL表达式.
* isErrorPage :设置JSP页面中出现错误信息应该如何处理的.
* errorPage :设置JSP页面中出现错误信息应该如何处理的.
* 设置全局错误页面:
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
* include指令:用于引入其他的页面
* file属性:属性中不能使用变量,不能传递参数
<%@ include file="logo.jsp" %>
<%@ include file="menu.jsp" %>
<h1>Body</h1>
<%@ include file="footer.jsp" %>
* taglib指令:用于在JSP中引入标签库
<%@ taglib uri="" prefix="" %>
- JSP的内置对象:(*****)
内置对象:JSP中可以直接使用的对象.
JSP的内置对象有哪些?常用的方法?真实对象是谁?
JSP中有9个内置对象:
* request HttpServletRequest getParameter(),setAttribute(),getAttribute();
* response HttpServletResponse setStatus(),sendRedirect(),getOutputStream();
* session HttpSession setAttribute(),getAttribute(),removeAttribute();
* application ServletContext setAttribute(),getAttribute(),removeAttribute();
* page Object toString(),wait(),
* JSP翻译成Servlet的引用.
* pageContext PageContext setAttribute(),getAttribute(),removeAttribute();
* out JspWriter write(),print(),
* config ServletConfig getInitParamter(),getInitParameterNames(),
* exception Throwable getMessage(),getCause()
* out对象:先将自身缓存区中的内容输出到response的缓冲区中,由response向页面作出响应.
* out :JspWriter
* response.getWriter() :PrintWriter
* pageContext:
* 一类:用pageContext对象获得其他的8个内置对象. 用来编写一个通用性高的或者框架的时候.
* 二类:用来存取数据.向四个域中存取数据.
- JSP的四个域对象:
* pageContext pageScope 页面范围
* request requestScope 请求范围
* session sessionScope 会话范围
* application applicationScope 应用范围
- JSP的动作标签:
语法:<jsp:动作标签 属性=””/>
为什么使用标签:简化代码的编写,尽量要少在JSP中使用<%%>
<jsp:forward />
* 转发:<jsp:forward page="/demo1/demo5.jsp"></jsp:forward>
<jsp:include />
* 包含:<jsp:include page="/demo1/include2/logo.jsp"></jsp:include>
***** 静态包含 和 动态包含的区别?
* 静态包含相对于代码的copy,最终被翻译成一个Servlet解释执行的.动态包含,包含其他页面的运行的结果.最终翻译成多个Servlet解释执行的.
<jsp:param />
* 传递参数.
<jsp:useBean />
<jsp:setProperty />
<jsp:getProperty />
【EL表达式】
- EL:
EL:Expression Language.表达式语言.
语法:${ EL表达式 }
JSP中尽量少使用<%%>代码块.使用EL和JSTL替换页面中<%%>
- 使用EL表达式:
用途:
1.获取数据.
2.EL执行运算
3.获得常用WEB开发的对象.
4.调用Java中的函数.
- EL用来获取数据:(获取是四个域范围中的值)
* 获得普通的值:
* 获得数组的数据:
* 获得List集合的数据:
* 获得Map集合的数据:
[]和. 有什么区别?
[]获得带有下标的(数组,List) .获得一个对象的属性,如果属性名中包含了特殊字符.必须使用[]不能使用.
<h1>EL获取数据</h1>
<%
pageContext.setAttribute("pname", "王守义");
request.setAttribute("rname", "王凤儿");
session.setAttribute("sname", "王如花");
application.setAttribute("aname", "王芙蓉");
%>
<h3>传统方式</h3>
<%= pageContext.getAttribute("pname")%>
<%= request.getAttribute("rname")%>
<%= session.getAttribute("sname")%>
<%= application.getAttribute("aname")%>
<h3>EL的方式</h3>
${ pageScope.pname }
${ requestScope.rname }
${ sessionScope.sname }
${ applicationScope.aname }
<hr/>
<%
//pageContext.setAttribute("name", "王守义");
//request.setAttribute("name", "王凤儿");
session.setAttribute("name", "王如花");
application.setAttribute("name", "王芙蓉");
%>
${ name }
<h3>EL获得数组的数据</h3>
<%
String[] arrs = {"王守义","王如花","王凤儿"};
pageContext.setAttribute("arrs", arrs);
%>
${ arrs[1] }
<h3>EL获得List集合的数据</h3>
<%
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
pageContext.setAttribute("list", list);
%>
${ list[1] }
<h3>获得Map集合的数据</h3>
<%
Map<String,String> map = new HashMap<String,String>();
map.put("aaa", "111");
map.put("bbb", "222");
map.put("ccc.ddd", "333");
pageContext.setAttribute("map", map);
%>
${ map["ccc.ddd"] }
<h3>EL获得JavaBean中的数据</h3>
<%
Person person = new Person();
person.setId(1);
person.setName("王美丽");
pageContext.setAttribute("person", person);
%>
${ person.name }
- EL执行运算:
执行算数运算:
+ - * / %
执行逻辑运算:
> < >= <= != ==
执行关系运算:
&& || !
<h1>EL执行运算</h1>
<h3>EL执行算数运算</h3>
<%
pageContext.setAttribute("n1", "10");
pageContext.setAttribute("n2", "20");
pageContext.setAttribute("n3", "40");
pageContext.setAttribute("n4", "60");
%>
${ n1+n2+n3 }
<h3>EL执行逻辑运算</h3>
${ n1 < n2 }
${ n1 > n2 }
<h3>EL执行关系运算</h3>
${ n1<n2 && n3<n4 }
${ n1<n2 || n3<n4 }
<%
Person person = new Person();
pageContext.setAttribute("person", person);
%>
${ empty person }
${ not empty person }
- EL获得WEB开发的常用的对象:(EL的内置对象)
EL常用的对象:11个.
${pageScope}
${requestScope}
${sessionScope}
${applicationScope}
${ param } :相当于request.getParameter();
${ paramValues } :相当于request.getParameterValues();
${ header } :获得请求头 一个key对应一个value
${ headerValues } :获得请求头 一个key对应多个value
${ initParam } :获得初始化参数
${ cookie } :获得Cookie的信息
${pageContext} :相当于pageContext对象.
【JSTL标签库】
- JSTL的标签库概述:
JSTL(JSP Standard Tag Library,JSP标准标签库)(网址为:http://baike.baidu.com/item/%E6%A0%87%E7%AD%BE%E5%BA%93)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat 4.x。在JSP 2.0中也是作为标准支持的。
作用:结合EL替换页面中的<% %>
- 使用JSTL的标签库:
JSTL的五大标签库:core、fmt、xml、sql、fn
JSTL的版本:JSTL1.0 JSTL1.1 JSTL1.2
* JSTL1.0是EL还没有被纳入规范的时候使用标签.
* JSTL1.1和1.2的版本中 EL已经被纳入到规范中.JSTL可以支持EL表达式了.
步骤一:引入标签库.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
常用的标签:
c:set
c:if
c:forEach
c:choose
* c:when
* c:otherwise
- JSTL的函数库(EL的函数库)
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
${ fn:length("HelloWorld") }
${ fn:toLowerCase("ABCDEFG") }
${ fn:toUpperCase("abcdefg") }
${ fn:contains("www.baidu.com","baidu") }
1.1.2.2 步骤分析:
步骤一:准备工作:
创建一个商品表:
创建一个动态的web工程
引入相关的jar包和工具类:
* mysql,c3p0,dbutils,jstl
创建包结构:
* com.itheima
* servlet
* service
* dao
* domain
* utils
步骤二:访问一个Servlet--->Service--->DAO
Servlet调用业务层,业务层调用DAO进行查询.
步骤三:查询到以后显示到JSP的页面中.
使用JSTL和EL表达式将数据显示到页面.
1.1.3 代码实现:
创建数据库和表:
create database day12;
use day12;
create table product(
id int primary key auto_increment,
pname varchar(20),
price double,
pdesc varchar(20)
);
insert into product values (null,'电视机',3200,'液晶曲面大电视');
insert into product values (null,'韭菜盒子',3,'味重请小心食用');
insert into product values (null,'益达',10,'韭菜伴侣');
insert into product values (null,'十三香',12,'守义牌');
实体bean
private int id;
private String pname;
private double price;
private String pdesc;