jsp=html+java,可以在页面中嵌入java代码
概述:
jsp全称是Java Server Pages ,它和servlet技术一样,都是SUN公司开发的
动态web资源的技术,JSP实际上就是Servlet
html:静态内容
servlet:服务器端的小应用程序。适合编写java逻辑代码,如果编写网页内容(很难受)
jsp:适合编写输出动态内容,但不适合编写java逻辑
jsp原理
jsp内部使用java代码使用<% %>,后台会编译运行java代码,把输出结果放到html中,实现了
动态的网页
1.对于浏览器访问的jsp文件,服务器将jsp文件翻译(转译)为java文件,在编译出class文件
,底层执行class文件,再把数据反馈给浏览器,若已翻译并且转译,则会直接执行class文件
执行速度会更快
2.服务器以流的方式把html标签加载到浏览器执行,java代码直接解析,解析和的结果返回到客服端
3.内置对象:request,response,session,config(ServletConfig),application(ServletContext)
out, pageContext,page,_jspx_out,_jspx_page_context
jsp最佳实践
表单数据的处理,以及分发转向交给servlet,jsp主要负责给用户看的页面
jsp基本语法
1.网页静态内容(html)
2.小脚本
<%java代码%>
3.表达式
<%=文字%>等价于out.print(文字)
4.定义全局变量和方法
<%!int num=10;%>
注:jsp注释不会加载到浏览器,安全且省流量,html注释会加载
jsp的3个指令
jsp指令是为jsp引擎二设计的,他们并不直接产生任何可见输出,而只告诉引擎如何处理jsp页面中的其他部分
3大指令:page,include,taglib
语法:<%@ 指令名称 属性1=“属性值1” 属性2=“属性值2”......%>
//也可以分开写
<%@ 指令名称 属性1=“属性值1”%>
<%@ 指令名称 属性2=“属性值2”%>
page:
1.lauguage="java" //默认支持java,也只支持java
2.extends="package.class"//默认继承此类,单继承只能继承这个
3.import="..."//导包,和java一样,可以一次写多个包,用逗号隔开
注意:默认导包,lang包,servlet包,http包,jsp包
4.session="true/false"//默认是true,如果是false不创建session
5.buffer="none/8kb/sizekb(自定义)"//默认8kb,不建议修改
6.autoFlush="true/false"//缓冲的刷新清除
7.isThreadSafe="true/false" //false才继承SingleThreadModel接口,一个接口一个
sevlet,线程安全由服务器控制,该接口已过时
8.info="text"
9.errorpage="/???.jsp"//java语句出错时跳转到这个jsp页面,地址开头加/表示当前
web应用的根目录
10.isErrorPage="false/true"//是否创建throwable对象exception。默认为false;
11.isELIgnored:是否支持EL表达式。默认为false,也就是支持(不忽略),EL表达式:${....}相当于out
12.contentType="mimeType[;charset=characterSet]"|"text/html;charset=ISO-8859-1"//
此处的charset是告诉编译器用什么码表来解码
13.pageEncoding="charset"//告诉服务器用什么码表翻译(编码),默认是utf-8
注:开发是主要主要编码方式即可
include(包含)
静态包含:把其他资源包含到当前页面中
<%@ include file="/include/header.jsp"%>
动态包含
<jsp:include page="/include/header.jsp"></jsp:include>
区别:翻译时间不同
静态:在翻译时就把两个文件合并,可一个删头,一个删尾,保证代码的不重复
动态:不会合并文件,当代码执行到include时,才包含另一个文件的内容
使用原则:能用静不用动
taglib
作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段
<%@ taglib uri="java.sun.com/jsp/jstl/core" prefix="c"%>
6个动作
动态包含
<jsp:forward> 请求转发
<jsp:forward page="/7.jsp">
等价于request.getRequestDispatcher("/7.jsp").forward(request,response);
<jsp:param> 设置请求转发
<jsp:param value="123" name="name">//转发的到那个jsp可以用getParameter得到这个值
夹在请求转发的标签中
<jsp:useBean> 创建一个对象
<jsp:useBean id="stu" class="类的位置"></jsp:useBean>
等价于Student stu=new Student();
<jsp:setProperty> 给指定的对象属性赋值
<jsp:setProperty property(属性)="name" name(对象名称)="stu" value(对属性赋的值)="jerry"/>
等价于stu.setName("jerry");
<jsp:getProperty> 取出指定对象的属性值
<jsp:getProperty property="name" name="stu">
等价于stu.getName();
9大内置对象
1.request
2.response
3.session
由session="true"开关
4.applocation
ServletContext类的对象,储存主要信息
5.exception
由isErrorPage="true"开关
6.page
当前对象的实例,也就是this
7.config
读取当前对象的配置信息
8.out
9.pageContext
通过这个对象可以得到其他8个对象,做自定义标签
可以操控其他三个域对象
setAttribute(String name,Object o,int Scope);
Scope:常量
PageContext.PAGE_SCOPE//当前页面有效
PageContext.REQUEST_SCOPE//一次请求有效,用的比较多,能用request就不要用session
PageContext.SESSION_SCOPE//一次会话有效,存重要功能
PageContext.APPLOCATION_SCOPE//整个应用范围有效,应该少用
findAttribute()//在pageContext,request,session,application依次去找,找到就停止
EL表达式
expression language 表达式语言
要简化jsp中的java代码开发
不是一种开发语言,是jsp中获取数据的一种规范
${s} 底层代码等价于 pageContext.findAttribute("s")
${s.name} 底层代码等价于 pageContext.findAttribute("s"),getName()
实际上找这个对象的name不是通过属性(私有了),而是类似反射,通过getName()方法
list集合取值:先将集合添加到request或者session,调用对应名字即可,单独调用集合中
某个位置的元素,名字后加[index]
map集合取值:先将集合添加到request或者session,调用对应名字即可,单独调用集合中
某个元素,名字后面加["键"]
EL运算
${empty str} str本身为空,或者空字符串,或者空集合则返回true
注:当碰到null值,会输出空白字符串
利用三目运算符可以在EL运算符中使用
EL隐式对象:
pageContext
pageScope
requestScope
sessionScope
applicationScope
param
${param.a}==request.getParamemter("userName");
paramValue
${paramValue.a[0]}==request.getParamemterValue("userName");
header
${paramValue["a"]}获得a的请求消息头
headerValues
${paramValue["a"]}获得a的重名请求消息头
initParam
cookie
${cookie.a.value}//取到a这个cookie的值
当一个键对应page,request,session,application都有值对应的时候,需要取到对应不同的值的时候可以
可以使用隐式对象和点运算符来取对应的值
JSTL (JavaServerPages Standard Tag Library) JSP标准标签库
使用JSTL实现JSP页面中的逻辑处理。如判断,循环等
使用JSTL
(1).在JSP页面添加taglib指令
<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c”%>
(2).使用JSTL标签
常用标签介绍
核心标签库
通用标签:set,out,remove
设置变量:<c:set var="num" value=${10+5} scope="page"></c>变量名为num,大小为10,储存在page里面
输出变量:<c:out value="${num } default="aaa""></c:out>输出变量num,若变量不存在,默认输出aaa
删除变量:<c:remove var="num" scope="page"></c:remove>从page中删除变量num
条件标签:if choose
<c:if test="${5>3 }">bbbbb</c:if>
<c:choose>
<c:when test="${num==1 }">11111</c:when>
<c:when test="${num==2 }">222</c:when>
<c:when test="${num==3 }">3333</c:when>
<c:otherwise>
fdgfsger
</c:otherwise>
</c:choose>
注:没有类型else功能的标签
循环标签
<c:forEach var="i" begin="1" end="10" step="1">
${i }<br/>
</c:forEach>
//for循环,申请一个i变量,从1开始,每次加1,到10结束
<%
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
request.setAttribute("list",list);
%>
<c:forEach items="${list }" var="L">${L} <br/></c:forEach>
//利用集合的迭代循环输出
<table border="1">
<tr>
<th>数据</th>
<th>索引</th>
<th>计数</th>
<th>第一个</th>
<th>最后一个</th>
<tr>
</table>