JSP(JSTL EL表达式 三个指令 六个动作标签 九个JSP内置对象)
概念
JSP: Java Server Page Java服务项目
是一种可以写html css js 也可以写Java代码的页面
作用是简化页面的书写
JSP本质上是个Servlet
* JSP:
* 注释:
* 标记语言注释: <!-- -->
* 缺点:
1.会发送到客户端
2.不能注释Java代码
* jsp注释: <%-- --%>
* 优点:
1.不会发送到客户端
2.能注释Java代码
* 3大指令:
* 指令:配置JSP页面的属性或者导入一些额外的内容
* 格式:<%@ 指令名称 属性名="属性值" %>
* 分类:
page:配置JSP页面的属性
include:静态包含
taglib:导入额外的内容
* page指令:
language :指定jsp页面使用的语言。只有一个值 java
*import :导入软件包
*pageEncoding :设置页面编码
1.指定jsp文件的编码
2.告诉浏览器页面使用的编码格式
autoFlush:自动刷新
buffer:缓冲区大小
*errorPage:指定错误页面,当页面发生异常时,指定跳转的页面
* 一般在开发完成后,会在web.xml中通过<error-page>标签来配置整个项目的错误页面
<error-page>
<error-code>500</error-code>
<!-- <exception-type></exception-type> -->
<location>/500.jsp</location>
</error-page>
<!-- <error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
-->
isErrorPage:是否是错误页面
true:是错误页面,可以使用内置对象exception
false:不是
* taglib:导入额外的内容,如:导入jstl标签
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
* include:静态包含
* 包含后,只会存在一个.class文件。
* 6个动作标签:
* 动作标签:替换Java代码。简化书写,提高可读性
<jsp:useBean> Person p = new Person()
使用一个ID和一个给定作用范围和同一ID的JavaBean相关联
<jsp:setProperty> p.setName("zhangsan")
设置JavaBean的属性值
<jsp:getProperty> String name = p.getName()
取得JavaBean的属性值
<jsp:include> 动态包含
请求时文件包含
* 多个.class字节码文件
<jsp:forward> 转发
接受用户输入并将请求分派给另一页面
<jsp:param> 传递请求参数
------------------------------------------------------------------------------------------------------
<%
Person p = new Person();
p.setName("张三");
String name = p.getName();
//request.getRequestDispatcher("").include(request, response);
//request.getRequestDispatcher("").forward(request, response);
%>
上面的标签可以替换为下面的
<jsp:useBean id="p1" class="cn.itcast.domain.Person" /><!-- 反射 -->
<!--
name对应的是setName方法
name---Name--setName
内省:通过字段名称,找到对应的setter和getter方法。
-->
<jsp:setProperty name="p1" property="name" value="李四"/>
<jsp:getProperty name="p1" property="name"/>
---------------------------------------------------------------------------------------------
<!-- 动态包含 -->
<!--
<jsp:include page="/hello.jsp" /> -->
--------------------------------------------------------------------------------------------------
<!-- 请求转发 -->
<jsp:forward page="/index.jsp">
<jsp:param name="msg" value="hehe"/>
</jsp:forward>
-------------------------------------------------------------------------------------------
* JavaBean:一种符合特定规范的Java类
1.私有所有成员变量
2.提供公共的访问方式 setter 或 getter
3.提供空参构造
domain
pojo
entity
beans
* 9个内置对象:
* 内置对象:在jsp转换后的.java文件的service方法中 声明好的 对象。在jsp中可以直接使用。
* 分类:
application:ServletContext
session:HttpSession
request:HttpServletRequest
pageCotext:PageCotext (页面域)
out:JspWriter
response:HttpServletResponse
config:ServletConfig
page:this
exception: Throwable
* pageCotext:
1.域对象:页面域
2.获取其他八个内置对象:可以在非jsp环境使用其他的内置对象。
* out和response.getWriter():
* 在使用对象向页面输出信息时,采用out
早期写法
脚本
<%
int num=100;
System.out.println(num);
out.print("abc");
String s="一树梨花";
%>
三六九
三个指令
三个指令
page指令:定义JSP页面的相关信息
contentType="text/html;charset=UTF-8" 响应的类型是html 用的编码方式为UTF-8
language="java" 支持语言
pageEncoding="UTF-8" 页面编码
import 导入包
isELIgnored="false" 是否忽略el标签
errorPage 设置错误页面
六个动作标签
JSP内置的 直接使用
<jsp:forward page="/san">
<jsp:param name="username" value="sanwa"/>
</jsp:forward>
九个JSP内置对象
JSP内置的 直接使用
1. request:HttpServletRequest
2. pageCotext:PageCotext(页面域)
3. session:HttpSession
4. application:ServletContext
5. response
6. exception
7. config
8. page
9. out
el表达式
el:JSP内置的表达式 作用是来替代<%=%>
el:
jsp的内置表达式语言,从jsp2.0开始.
用来替代<%=..%>
作用:
1.获取域中数据 ★
2.执行运算 ★
3.获取常见的web对象
4.调用java的方法
格式:
${el表达式}
获取域中数据:★
1.获取简单数据
${pageScope|requestScope|sessionScope|applicationScope.属性名}
以后经常使用:
${属性名}:依次从pageContext,request,session,application查找指定属性,若查找到返回值,结束该次查找
若查找不到,返回""
------------------------------------------------------------------------------------
例子: <%
request.setAttribute("rkey", "rvalue");
session.setAttribute("skey", "svalue");
session.setAttribute("rkey", "svalue");
application.setAttribute("akey", "avalue");
%>
获取request中的数据:<br>
老方式:<%=request.getAttribute("rkey") %><br/>
el方式:${requestScope.rkey }<br/>
<hr>
获取session中的数据:<br>
老方式:<%=session.getAttribute("skey") %><br/>
el方式:${sessionScope.skey }<br/>
<hr>
获取application中的数据:<br>
老方式:<%=application.getAttribute("akey") %><br/>
el方式:${applicationScope.akey }<br/>
<hr>
获取失败老方式:<%=application.getAttribute("aakey") %><br/>
获取失败el方式:${applicationScope.aakey }
<hr>
便捷获取:
${skey },${rkey },${aakey },${akey }
<hr>
${rkey }
----------------------------------------------------------------------------------------------
2.获取复杂数据
获取数组中的数据
${域中的名称[index]}
获取list中的数据
${域中的名称[index]}
获取map中的数据
${域中的名称.键名}
-----------------------------------------------------------------------------
<%
//往request域中放入数组
request.setAttribute("arr", new String[]{"aa","bb","cc"});
//往request域中放入list
List list=new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list", list);
//往request域中放入map
Map m=new HashMap();
m.put("username","tom");
m.put("age",18);
request.setAttribute("map", m);
%>
获取域中的数组:<br>
老方式:<%=((String[])request.getAttribute("arr"))[1] %><br>
el方式:${arr[1] }<br>
<hr>
获取域中的list:<br>
老方式:<%=((List)request.getAttribute("list")).get(1) %><br>
el方式:${list[1] }<br>
list的长度:${list.size() }
<hr>
获取域中的map:<br>
老方式:<%=((Map)request.getAttribute("map")).get("age") %><br>
el方式:${map.age}<br>
<hr>
-----------------------------------------------------------------------------------------------------------
javabean导航
javabean:
java语言编写的一个可重用的组件,
狭义上来说就是我们编写的一个普通的java类 例如:User Person
javabean规范:
1.必须是一个公共的具体的类 public class
2.提供私有的成员变量 private String id;//
3.提供公共访问字段的方法 get|set|is方法
public String getId(){..}
一旦有公共的方法之后,get|set|is之后的内容,将首字母小写,将这个东西称之为bean属性
id就是一个bean属性
4.提供一个无参的构造器
5.一般实现序列化接口 serializable
3.${域中javabean名称.bean属性}
---------------------------------------------------------------------
例子 el 获取对象中字段的值
<%
User u=new User();
u.setId("001");
u.setName("tom");
u.setPassword("123");
//将u放入域中
request.setAttribute("user", u);
%>
获取域中javabean的id值:<br>
老方式:<%=((User)request.getAttribute("user")).getId() %><br/>
el方式:${user.id }<!-- 相当于调用 getXxx() -->
<hr>
el获取那么:${user.name }<br>
错误演示:${user.username }
-------------------------------------------------------------------------------------
//
执行运算:
四则运算 关系(>..) 逻辑(&& ||)
注意:
+:只能进行加法运算,字符串形式数字可以进行加法运算.
empty:判断一个容器的长度是否为0(array set list map),还可以判断一个对象是否为空
${empty 域中的对象名称}
取反 not 例如 not empty
${not empty 域中对象名称}
三元运算符 ${ 3>4?"yes":"no" }
--------------------------------------------------------------------------------------------------------
例子:
<%
request.setAttribute("i", 3);
request.setAttribute("j", 4);
request.setAttribute("q", "12");
request.setAttribute("k", "k");
List l=null;
request.setAttribute("list", l);
List ll=new ArrayList();
ll.add("22");
request.setAttribute("list_", ll);
User user=null;
request.setAttribute("bean", user);
User user_=new User();
request.setAttribute("bean_", user_);
%>
${i+j }<br/>
${i+q }<br/>
${q+q }<br/>
<%-- ${i+k }<br/> --%>
<hr>
域中list的长度是否为0:${empty list}<br/>
域中list_的长度是否为0:${empty list_ }<br/>
<hr>
域中的bean是否为空:${empty bean }<br/>
域中的bean_是否为空:${empty bean_ }<br/>
<hr>
${ 3>4?"yes":"no" }<br/>
${i==3 }
--------------------------------------------------------------------------------------
//
el的内置对象(了解)
11个
pageScope
requestScope
sessionScope
applicationScope
param
paramValues
header
haederValues
initParam
cookie★
cookie内置对象:
${cookie} 获取map{key=Cookie}
例如:创建cookie
Cookie c=new Cookie("username","tom");
通过${cookie}获取相当于
{username=new Cookie("username","tom")}
相当于map的key是cookie的键
map的value是当前cookie
若项获取名称username的cookie的value值(获取tom)
${cookie.username.value}--javabean导航
注意:
java中Cookie的api
getName():获取cookie的名称
getValue():获取cookie的value值
我们称name和value是cookie的bean属性
使用cookie内置对象:
${cookie.给cookie起名字.value}
例如:
获取jsession的值
${cookie.JSESSIONID.value}
pageContext:获取不是map集合,相当于jsp的pageContext内置对象
在jsp页面中获取项目名
${pageContext.request.contextPath}
例如:<a href="${pageContext.request.contextPath }/demo8.jsp">pagecontext内置对象获取项目名(掌握)</a>
-----------------------------------------------------------------------------------------------------
JSTL
-----------------------------------------------------------------------------------------------------
jstl:
jsp标准的标签库语言
apache的
用来替代java脚本
使用步骤:
1.导入jar包 (jstl.jar和standard.jar)
2.在页面上导入标签库
<%@taglib prefix="" uri=""%>
例如:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
jstl的分类:
core:核心类库 ★
fmt:格式化|国际化
xml:过时了
sql:过时了
函数库:很少使用
core:掌握
★c:if
★c:forEach
★c:if 判断
<c:if test="${el表达式}">满足的时候输出的内容</c:if>
例如:
<c:if test="${3>4 }">
3大于4
</c:if>
<c:if test="${3<=4 }">
3不大于4
</c:if>
//
例子 比如可以给我们登陆成功页面 加上判断
<c:if test="${not empty name }">
${name}欢迎你!
</c:if>
<c:if test="${empty name }">
你尚未登陆请重新登陆<a href="/ServletDemo/login.jsp">点击登陆</a>
</c:if>
---------------------------------------------------------------------------------------------------------
★c:forEach 循环
格式1:
<c:forEach begin="从那里开始" end="到那里结束" step="步长" var="给变量起个名字" varStatus="循环状态变量">
${i }--${vs.count }--${vs.current }<br>
</c:forEach>
varStatus:用来记录循环的状态
常用的属性:
count:记录次数 从1开始
current:当前遍历的内容
index: 索引 从0 开始
例如:
<c:forEach begin="1" end="20" step="2" var="i" varStatus="vs">
${i }--${vs.count }--${vs.current }<br>
</c:forEach>
格式2:
<c:forEach items="${el获取域中的容器}" var="n">
${n }
</c:forEach>
例如:
//遍历list
<c:forEach items="${list }" var="n">
${n }
</c:forEach>
//遍历map
<c:forEach items="${map }" var="en">
${en.key }-- ${en.value }<br/>
</c:forEach>
-----------------------------------------------------------------------------------
例子:
<%
ArrayList<Student> list = new ArrayList<Student>();
list.add(new Student("张三", "23"));
list.add(new Student("李四", "24"));
list.add(new Student("王五", "25"));
list.add(new Student("赵六", "26"));
request.setAttribute("list", list);
%>
<table height=300 width=400 align=center>
<tr bgcolor=green>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
</tr>
<c:forEach items="${list }" var="stu" varStatus="s">
<c:if test="${s.count%2==0 }">
<tr bgcolor=red>
</c:if>
<c:if test="${s.count%2!=0 }">
<tr bgcolor=yellow>
</c:if>
<td>${s.count }</td>
<td>${stu.name }</td>
<td>${stu.age }</td>
</tr>
</c:forEach>
</table>
-----------------------------------------------------------------------------------------------------------------
* c:url:
功能:
* 自动补项目路径
* 自动url重写
<a href='<c:url value="/foreach.jsp" />'>foreach.jsp</a>
---------------------------------------------------------------------------------------------------------------------------
<%
HttpServletRequest req = (HttpServletRequest)(pageContext.getRequest());
String contextPath = req.getContextPath();
session.setAttribute("aaa", "aaa");
%>
<%=contextPath %><br>
${pageContext.request.contextPath}
<a href="${pageContext.request.contextPath}/foreach.jsp">foreach.jsp</a><br>
<a href='<c:url value="/foreach.jsp" />'>foreach.jsp</a>
--------------------------------------------------------------------------------------------------------------------
<%--使用标签 --%>
<%--set标签 :保存数据(保存到域中)默认保存到page域 --%>
<c:set var="name" value="rose" scope="request"></c:set>
<%
String msg = null;
pageContext.setAttribute("msg",msg);
%>
${msg }
<br/>
<%--out标签: 获取数据(从域中)
default: 当value值为null时,使用默认值
escapeXml: 是否对value值进行转义,false,不转义,true,转义(默认)
--%>
<c:out value="${msg}" default="<h3>标题3</h3>" escapeXml="true"></c:out>
<hr/>
----------------------------------------------------------
<%--choose标签+when标签+otherwirse标签: 多条件判断 --%>
<c:set var="score" value="56"></c:set>
<c:choose>
<c:when test="${score>=90 && score<=100}">
优秀
</c:when>
<c:when test="${score>=80 && score<90}">
良好
</c:when>
<c:when test="${score>=70 && score<80}">
一般
</c:when>
<c:when test="${score>=60 && score<70}">
及格
</c:when>
<c:otherwise>
不及格
</c:otherwise>
</c:choose>
--------------------------------------------
<%-- forToken标签: 循环特殊字符串 --%>
<%
String str = "java-php-net-平面";
pageContext.setAttribute("str",str);
%>
<c:forTokens items="${str}" delims="-" var="s">
${s }<br/>
</c:forTokens>
<%--redrict:重定向 --%>
<c:redirect url="http://www.baidu.com"></c:redirect>
--------------------------------------------------------------------------------------------
* MVC模式 一种前辈们总结出来的开发模式
* M :Model 模
* 封装数据,处理业务逻辑
* V : View 视图
* 界面显示
* C :Controller 控制器
* 调度
* JavaWeb的三层架构
* org.westos.web.servlet :web层
* org.westos.service:service层
*org.westos.dao:dao层
* org.westos.domain : JavaBean
* org.westos.util:工具包
org.westos.test:测试包