jsp
一.JSP的介绍
JSP(全称Java Server Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。
JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
二.脚本和注释(开发一般不用)
jsp:脚本:<%java代码%>
<%=java变量或表达方式%>
<%!java代码%> 里面写成员变量或者方法
JSP中的注释分为三种:
HTML注释:
可以在页面中可见
JSP注释: <%-- 这是JSP注释 --%> 只能在jsp页面中可见
Java注释:只能在小脚本中写 可以在翻译成的Servlet中可见
//在jsp中显示出9*9乘法表
<%
for(int i=1;i<=9;i++){
for(int j=1;j<=i;j++){
%>
<%=j+"*"+i+"="+(j*i) %>
<%
}
%>
<%="<br>" %>
<%
}
%>
三.jsp指令
1.jsp指令的写法
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ 指令名 属性="属性内容" %>
2.指令的种类与包含的属性
jsp指令(3个):page,include,taglib
(1)page的属性
- language jsp的小脚本使用的是那种语言,(这个属性不起作用,只能用Java语句)
- contentType 浏览器以什么格式打开当前输出的页面,就是response.setContentType(“text/html; charset=UTF-8”)
- pageEncoding 当前页面中可以写什么格式的语言。如果有contentType,这个属性可以不写
- buffer 是out内置对象输出的缓冲区,一般默认值是8KB
- import 导入java需要的指定包
- session=“true” 是否开启直接回话。如果是false,不能直接使用session这个内置对象的
- errorPage 如果当前页面出现了异常,跳转到哪个异常处理页面
- isErrorPage: 是否是异常处理页面
(2)include的属性
<%@ include file="index.jsp" %>
(3)targlib的属性
<%@ targlib prefix="c" uri=""%>
四.JSP的内置对象(9个)
request: HttpServletRequest的对象
response: HttpServletresponse的对象
pageContext: PageContext的对象(当前页面上下文的对象)
session: HttpSession的对象
application: ServletContext的对象
config: ServletConfig的对象
out: jsp的输出对象 PageWriter
page: 当jsp被翻译成Servlet时,Servlet的对象
exception:异常的对象
五.jsp四大域对象
jsp四大域对象:==Servlet三大域对象+pageContext
application :整个Web应用
session :一次会话
request :一次请求
pageContext:当前jsp页面范围
六.pageContext的作用
pageContext的作用:
1:可以获取其它的八个内置对象。
后面会使用EL表达式来完成对小脚本的替代,EL表示有11个隐式对象
在这里面jsp的内置对象只有一个pageContext。这时可以在EL表达式中获取其它八个JSP
的内置对象。
2:可以获取其它的三个域对象的值。
pageContext.getRequest();
pageContext.getSession();
七.动态包含与静态包含
JSP的动作:使用的是jsp内置的标签完成的servlet的某些功能
jsp:标签名</jsp:标签名>
forward: servlet中是请求转发,这里也是一样的。
<jsp:forward page=“index.jsp”></jsp:forward>
include: 请求包含
三大指令中有个包含指令
<%@ include file="" %> 静态包含
<jsp:include page=""></jsp:include> 动态包含
区别:
1:静态包含中,被包含的jsp页面是不会单独翻译成一个servlet的。
将被包含页面中的所有东西都挪动到了主页面的service方法中,导致主页面代码混乱。
2:动态包含中,被包含的jsp页面会单独翻译成一个servlet。
在主页jsp翻译成的servlet中通过代码来引入被包含页面的。
service方法比较整洁,同时效率稍微高
八.EL技术
1.el的简单写法
在jsp页面中使用el技术,可以不用谢脚本,书写格式为${}
EL表达式来完成基本四则运算<br>
${1+1} <br>
${1-1} <br>
${2*2} <br>
${8/3} <br>
${8%3} <br>
${1==1} <br>//返回一个true
${empty a}<br>
${not empty b}<br>
EL表达式还可以在JS代码中写,需要用引号括起来
<button οnclick="fun()">点 </button>
<script>
function fun(){
var s="${123}";
alert(s);
}
</script>
</body>
</html>
2.EL从域中提取数据
先创建一个Servlet来储存数据
HttpSession session = request.getSession();
//普通字符串
session.setAttribute("userName", "张飞");
//User对象的,先创建了一个User的类,有名字和年龄两个变量
session.setAttribute("sessionUser", new User("李白", 22));
//List<String>
List<String> strList=new ArrayList<String>();
strList.add("tom");
strList.add("jerry");
strList.add("mama");
session.setAttribute("sessionListStr", strList);
//List<User>
List<User> userList=new ArrayList<User>();
userList.add(new User("a", 16));
userList.add(new User("b", 15));
userList.add(new User("С", 15));
session.setAttribute("userList", userList);
//Map<String,String>
Map<String,String> strMap=new HashMap<>();
strMap.put("userName", "lala");
strMap.put("userAge", "18");
session.setAttribute("strMap", strMap);
//EL获得Map<String,User>
Map<String,User> mapUser=new HashMap<String, User>();
mapUser.put("user1", new User("aa", 22));
mapUser.put("user2", new User("bb", 25));
session.setAttribute("mapUser", mapUser);
//转向
request.getRequestDispatcher("el_demo2.jsp").forward(request, response);
取出域中的值:
EL最主要的作用是获得四大域中的数据,格式****${EL表达式}****
EL获得pageContext域中的值:$(pageContextScope.key);
EL获得request域中的值:$(requestScope.key);
EL获得session域中的值:$(sessionScope.key);
EL获得application域中的值:$(applicationScope.key);
EL从四个域中获得某个值$(key);
对于session.setAttribute(“strMap”, strMap);而言,括号中前者是key
示例:
1)EL获得普通字符串
${sessionScope.userName}
2)EL获得User对象的值
//[sessionScope.Key(自己定义的)]大括号中获取的是User对象,然后想获取什么变量就.变量
${sessionScope.sessionUser.username}
3)EL获得List的值
//sessionScope.Key(自己定义的).get(集合角标)
${sessionScope.sessionUser.get(0)}
4)EL获得List的值
${sessionScope.userList[0].userName}
5)EL获得Map<String,String>的值
${sessionScope.strMap.userName}
6)EL获得Map<String,User>的值
${sessionScope.mapUser.user2.userName}
3.EL的内置对象
pageScope
requestScope
sessionScope
applicationScope
---- 获取JSP中域中的数据
param,paramValues - 接收参数.
header,headerValues - 获取请求头信息
initParam - 获取全局初始化参数
cookie - WEB开发中cookie
pageContext - WEB开发中的pageContext.
注:加粗是需要特别记忆的
****${ pageContext.request.contextPath }****获取的是程序名字
<link rel="stylesheet" href="${ pageContext.request.contextPath }/css/a.css" />
九.JSTL技术
1.常用的标签库
标签库:Core
prefix:“c”
uri:“http://java.sun.com/jsp/jstl/core”
注意:选uri中存在jstl的一个
使用的时候需要
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>
2.需要用到的jar包
两个:standard.jar jstl.jar
3.标签的写法
<c:if> 如果标签
<c:foreach> 循环标签
(1)对于<c: if>而言:
test指判断条件,判断条件一定要使用el表达式书写
c:if 没有else,想要写相反的条件,就再来一个
<c:if test="${1>0}">
hello
</c:if>
<c:if test="${1<=0}">
haha
</c:if>
(2)对于<c: for>
begin+end+items+var 等价与fori循环
items是需要被循环的数组或集合
begin:从第几个开始循环(包含)
end: 到哪结束(包含)
var:具体循环出来的值
for i循环
<c:forEach begin="1" end="100" var="i">
${i}
</c:forEach>
超级for循环
var可以自己随便写,这时var的值可以代表item
<c:forEach items="${sessionScope.userList}" var="user">
姓名是:${user.userName } 年龄是:${user.age}<br>
</c:forEach>