一.jsp的简介
jsp(java server pages)java服务器端的页面,sun公司用于开发动态网站的技术
servlet,jsp就是servlet,最终会在访问jsp页面的时候编译成servlet,放到tomcat的..\work\Catalina\localhost目录里面.jsp的组成: html+java代码+jsp自身的一些东西
- 在jsp里面嵌入java代码有三种方式
第一种方式 <%! %> 定义成员变量
第二种方式 <%= %> 输出语句
第三种方式 <% %> 嵌入java代码
二、jsp的注释
- jsp的组成: html+java代码+jsp自身的一些东西
第一,html的注释
<!-- -->
第二,java注释. 有三种:单行 ,多行 ,文档注释
第三,jsp自身的注释 <%-- jsp自身的注释 --%>
- 注释的使用范围
(1)在jsp的源代码阶段,三种注释都存在
(2)在jsp编译成servlet之后,存在html的注释和java的注释
(3)通过浏览器访问jsp之后,在浏览器显示的内容里面只存在html的注释
三、 jsp的指令
- 写法: <%@ 指令的名称 属性=”属性值” %>
jsp里面有三个指令(page,include,taglib)
第一个 page指令
(1)设置页面的一些内容
(2)写法 <%@ page 属性=”属性值”%>
(3)属性1). language:jsp支持的语言类型,目前java
2). extends:jsp最终会编译成servlet,编译成的类继承的类(一般不需要修改,直接使用默认)3).session:是否可以在jsp里面直接使用session对象,true或者false,默认的值是true
4).import:
导入包 ,列如<%@ page import=”java.util.List,java.util.ArrayList”%>
5).buffer:缓冲区的大小
6).autoFlush:超出缓冲区是否会正常输出
7).errorPage:当执行jsp时候,出现异常,通过这个属性可以设置跳转的页面
8).isErrorPage:在错误页面中是否显示错误信息,值是true和false,当值设置成true之后,在生成serlvet里面,创建exception对象,显示错误信息。默认值是false
9).contentType:设置浏览器编码
10).pageEncoding:jsp编译成servlet采用的编码方式
11).isELIgnored:jsp里面是否忽略el表达式,默认是不忽略(可以使用el表达式)。如果把这个属性的值设置成true之后,把el表达式当做普通的文本内容输出第二个 include指令(静态包含)
(1)使用jsp包含其他的jsp页面,跟Android中的include属性相似
(2)写法 <%@ include file=”要包含的页面”%>
(3)注意事项
*注意一:在被包含的页面里面,直接写内容就可以了
* 注意二:在被包含的路径后面不能加参数
* 注意三:file属性的值不能为一变量
(4)使用include指令包含 多个jsp文件,最终会被编译成一个servlet(相当于代码复制 ,..\work\Catalina\localhost目录)第三个 taglib指令
(1)和jstl标签库一起使用,替代jsp页面中 <% %>
(2)写法 <%@ taglib uri=”jstl标签库的路径” prefix=”标签库的别名”%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
四、jsp的内置对象(*)
(1)什么是内置对象:在jsp中生成好的一些现有的对象,直接拿来使用
(2)jsp里面有九个内置对象
1) 、 request : 是servlet里面的HttpServletRequest,代表请求,得到表单提交的数据,是域对象
2)、response:是servlet里面的HttpServletResponse,代表响应,向页面输出内容
3)、session:是servlet里面HttpSession,是域对象
4)、config :是servlet里面的ServletConfig,获取初始化的参数,获取servlet名称
5)、application:是servlet里面的ServletContext,获取全局初始化参数,域对象,获取web项目中的文件
6)、exception:当在页面中使用page指令里面的属性 isErrorPage=”true”,生成异常对象,通过这个对象里面 getMessage()得到异常信息
7)、page:当前对象
8)、out:输出对象
** 通过out输出和使用response.getWriter()使用的是一个对象吗?
不是。out使用的是 JspWriter,response.getWriter()使用PrintWriter
* 在jsp中分别使用out输出和response.getWriter()输出,会产生两个缓冲区,一个是out缓冲区,一个是response缓冲区,使用out输出内容,会把内容放到out缓冲区里面,但是out缓冲区不能直接向页面输出,需要把内容先放到response,通过response进行输出。
9)、pageContext:(*******)
(1)本身也要一个域对象(只有jsp里面有这个对象,servelet中没有对应的)
* 向pageContext域对象里面设置值
<%
pageContext.setAttribute("page", "pagevalue");
%>
*从pageContext里面获取值
<%=pageContext.getAttribute("page") %>
*使用el表达式获取域对象里面的值
${page }
(2)向其他的域对象里面设置值
application、session、request、pageContext
* 方法:setAttribute(java.lang.String name, java.lang.Object value, int scope)
有三个参数:第一参数是名称,第二个参数是值
第三个参数是域的范围(使用pageContext里面的常量表示)
* 创建jsp,分别向四个域对象设置值
(3)从其他的域对象里面获取值
* 方法 getAttribute(java.lang.String name, int scope)
有两个参数:第一参数是名称,第二个参数域的范围(使用pageContext里面的常量表示)
* 重要的方法 findAttribute(java.lang.String name)
** **如果多个域对象的名称是相同的,使用这个方法得到是域范围小的里面的值**
(4)通过这个pageContext对象获取其他的八个内置对象
<%
//得到request对象
pageContext.getRequest();
//得到response对象
pageContext.getResponse();
//得到session对象
pageContext.getSession();
......
%>
*四个域对象作用范围
application: 范围是整个web项目
session:范围是一次会话
request:范围一次请求
pageContext:范围当前页面
五、jsp的动作标签
5.1 有六个动作标签
(1)<jsp:forward>:实现转发的操作
* <jsp:forward page="/jsp/hello.jsp"></jsp:forward>
(2)<jsp:include>:页面包含(动态包含)
* <jsp:include page="hello.jsp"></jsp:include>
* 多个的jsp会编译成几个servlet?
多个jsp会编译成多个servlet
(3)<jsp:param>:传递参数,用在包含路径的标签里面
5.2 另外三个动作标签(操作javabean的标签)
(1)<jsp:useBean>
(2)<jsp:setProperty>
(3)<jsp:getProperty>
<!--设置要封装的javabean -->
<jsp:useBean id="user" class="com.jrt.test.bean.User"></jsp:useBean>
<!--数据封装 name="user"表示当前对象-->
<jsp:setProperty property="name" name="user"/>
<jsp:setProperty property="age" name="user"/>
<!--获取数据 自动输出到页面-->
<jsp:getProperty property="name" name="user"/>
<jsp:getProperty property="age" name="user"/>
还有一种封装javabean的方式(BeanUtils 要导入依赖jar包)
//创建javabean对象
User user = new User();
//进行数据的封装
try {
BeanUtils.populate(user, request.getParameterMap());
} catch (Exception e) {
e.printStackTrace();
}
六、el表达式
6.1 作用:获取域对象里面的值
6.2 使用el表达式获取域对象里面的值
(1)写法: ${名称}
(2)创建jsp页面,在页面中分别向四个域对象设置值,使用el表达式获取值
<!-- 分别向四个域对象里面设置值 -->
<%
application.setAttribute("app", "appvalue");
session.setAttribute("app", "sessionvalue");
request.setAttribute("app", "requestvalue");
pageContext.setAttribute("app", "pagevalue");
%>
<!-- 使用el表达式获取域对象里面的值 -->
<!-- 得到applicat里面的值 -->
${applicationScope.app }
<br/>
<!-- 得到session里面的值 -->
${sessionScope.app }
<br/>
<!-- 得到request里面的值 -->
${requestScope.app }
<br/>
<!-- 得到pageContext值 -->
${pageScope.app }
(3)*如果多个域对象名称是相同的,如果使用 ${名称}得到域范围小的里面的值
(4)分别使用传统方式和el表达式获取域对象里面的值,如果属性名称不存在的情况下,输出的默认值如下:
*使用传统方式(getAttribute)得到null
*使用el表达式得到空字符串
<%=request.getAttribute("xxx") %> <!--输出 null -->
<hr/>
${xxx } <!--输出 空字符串 -->
6.3 向域对象里面放数组,集合(list和map)、对象,使用el表达式获取值
(1)向域对象里面放数组
<!-- 向域对象里面放数组,使用el表达式获取域对象里面数组的值 -->
<%
//创建数组
String[] arr = {"lucy","jack","mary"};
//把数组放到域对象里面 request
request.setAttribute("arr100", arr);
%>
<!-- el获取域对象里面数组的值 -->
${arr100[2] }
* 通过下标得到域对象数组的值,数组的下标从0开始的,如果写的下标超出了数组的访问,得到空字符串
(2)向域对象里面放list集合
<%
//创建list集合
List<String> list = new ArrayList<String>();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
//把list集合放到域对象里面
request.setAttribute("list", list);
%>
<!-- el获取域对象里面list集合的值 -->
${list[2] }
(3)向域对象里面放map集合
* 根据map的key得到value
<!-- 向域对象里面放map集合,使用el表达式获取域对象里面map集合的值 -->
<%
//创建map集合
Map<String,String> map = new HashMap<String,String>();
map.put("aaa", "AAA");
map.put("bbb", "BBB");
map.put("ccc", "CCC");
//把map集合放到request域对象里面
request.setAttribute("map", map);
%>
<!-- 使用el表达式获取域对象里面map集合的值 -->
${map.aaa }
(4)向域对象里面放对象
<!-- 向域对象放javabean对象,使用el表达式获取域对象里面对象的属性的值 -->
<%
//创建user对象
User user = new User();
user.setUsername("女神");
user.setAge(18);
user.setAddr("火星");
//把user对象放到域对象里面
request.setAttribute("user", user);
%>
<!-- 使用el表达式获取域对象里面对象的属性的值 -->
${user.username }
${user.age }
${user.addr }
七、Jstl标签库
7、jstl (JavaServerPages Standard Tag Library)jsp的标准标签库
7.1 和jsp里面taglib指令一起使用,替代页面中的<% %>
* <%@ taglib uri="jstl标签库的路径" prefix="标签库别名"%>
7.2 jstl里面的标签 if标签, choose标签,forEach标签
7.3 如果想要使用jstl标签,首先导入jar包
jstl常用标签的使用
1、c:if标签
<!--条件判断 -->
<!--条件判断 -->
<c:set var="a" value="5"></c:set><!--定义变量 -->
<c:if test="${a!=5 }"><!--判断条件 -->
a=${a}<!--输出结果 -->
</c:if>
2、c:choose标签
<!--switch判断 -->
<c:set var="a" value="5"></c:set>
<c:choose><!--switch -->
<c:when test="a==4"><!--case -->
a=4
</c:when>
<c:when test="a==5">
a=5
</c:when>
<c:otherwise><!--default -->
a=5
</c:otherwise>
</c:choose>
3、c:forEach标签
- 遍历域对象中数组的值
- 遍历域对象中list集合的值
- 遍历域对象中set集合的值
- 遍历域对象中map集合的值
- 遍历域对象中多个对象的值
<!--遍历数组 -->
<%String[] arr={"zhangsan","lisi","wangwu"};
request.setAttribute("arr",arr);
%>
<!--for(String s:arr){} -->
<c:forEach var="a" items="${arr}">
${a}
</c:forEach>
<hr/>
<!--遍历list集合 -->
<% List<String> list=new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list", list);
%>
<c:forEach var="item" items="${list}" >
${item }
</c:forEach>
<hr/>
<!--遍历set -->
<% Set<String> set=new HashSet<String>();
set.add("1");
set.add("2");
set.add("3");
request.setAttribute("set", set);
%>
<c:forEach var="item" items="${set}" >
${item }
</c:forEach>
<hr/>
<!--遍历map -->
<% Map<String,String> map=new HashMap<String,String>();
map.put("key1","Value1");
map.put("key2","Value2");
map.put("key3","Value3");
request.setAttribute("map", map);
%>
<!--var="entrySet" 相当于java中map.entrySet() -->
<c:forEach var="entrySet" items="${map}">
${entrySet.key}
${entrySet.value}<br/>
</c:forEach>
<hr/>
<!--遍历域对象中多个对象的值 -->
<%
User user1=new User();
user1.setName("小马哥");
user1.setAge(43);
User user2=new User();
user2.setName("东哥");
user2.setAge(41);
List<User> users=new ArrayList<User>();
users.add(user1);
users.add(user2);
request.setAttribute("users", users);
%>
<c:forEach var="user" items="${users}">
${user.name}
${user.age}<br/>
</c:forEach>