jsp&el
JSP(JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。
访问servlet的问题: 页面出现白板 , 我们希望让页面更好看 , 需要修改响应体, 代码及其复杂
jsp用来替换html存在 , jsp当作html一模一样使用 也可以编写html代码 , jsp用来作为servlet的响应体部分
html有特点:只支持html代码 不支持java代码 , jsp 可以支持html 并且支持java
重点:Jsp其实就是一个servlet。
jsp有java的特性存在
jsp和servlet区别
在jsp中
该方法等效域servlet的service方法,只要执行jsp必然执行该方法。
jsp脚本(了解)
jsp本质是一个java代码-> jsp应该能够编写代码的
jsp中编写java代码的脚本元素
脚本 ( 相当于 方法体的代码 public void service(){ 方法体 } 循环 局部变量 )
<% %>
输出脚本( 相当于 out.print(参数部分) 参数部分可以写的内容 )
<%= %>
声明脚本 ( 相当于 类体的 public class 类名 { 类体 } 全局变量 方法声明 )
<%! %>
jsp指令
jsp最后要转换成java代码
指令(规则)的作用-> jsp转换java代码的依据
指令的语法: <%@ 指令 %>
page(不重要)
最后还是转换成servlet代码 处理问题
include
一个jsp可以包含另一个jsp
taglib(重要)
tag标签 lib 库 引入标准的标签库 在jsp的页面中引入一些特殊的语法 让程序会更简单
jsp内置对象(重要)
内置对象: 在jsp中我们不需要经过任何声明 就可以直接使用的对象 (jsp已经创建好了 我们直接使用即可)
有九大内置对象:
pageContext:页面的根对象
可快速获得其他八个对象
在jsp中有四个域对象 : page域 , request , session , application(应用)
共享范围:
page域: 表示 当前页面共享数据 , 只能在当前类 当前页面中共享数据
request:一次请求共享数据
session :一次会话共享数据
application : 一个项目共享数据
servlet有三个域对象 : request , session , servletContext
pageContext
<%--scope 的含义是 域--%>
<%--jsp是一个servlet --%>
<%--存入域中数据--%>
<%-- <%
//内置对象直接放入域数据
request.setAttribute("ds" , "request_老王" );
session.setAttribute("ds" , "session_老王" );
application.setAttribute("ds" , "application_老王" );
%>--%>
<%-- <%=request.getAttribute("ds") %> <br/>
<%=session.getAttribute("ds") %> <br/>
<%=application.getAttribute("ds") %> <br/>--%>
<%--
pageContext :
作用1:获得其他八个内置对象
作用2:简化(统一)域对象的操作
pageContext.setAttribute( String key , Object value , 域);
pageContext.getAttribute(String key , 域 )
作用3:
提供一个 findAttribute(String key ) 不需要指明域 , 依次从四个域中查找数据
取数据从范围开始小的取
page < request < session < application(ServletContext)
以后的建议 四个域中不要存入同名的key 因为我们使用findAttribute 有可能拿到的不是我们想要的数据
--%>
<%
pageContext.setAttribute("ds" ,"page_老王_pageContext", PageContext.PAGE_SCOPE);
pageContext.setAttribute("ds" ,"request_老王_pageContext", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("ds" ,"session_老王_pageContext", PageContext.SESSION_SCOPE);
pageContext.setAttribute("ds" ,"application_老王_pageContext", PageContext.APPLICATION_SCOPE);
%>
<%=pageContext.getAttribute("ds" , PageContext.PAGE_SCOPE) %> <br/>
<%=pageContext.getAttribute("ds", PageContext.REQUEST_SCOPE) %> <br/>
<%=pageContext.getAttribute("ds", PageContext.SESSION_SCOPE) %> <br/>
<%=pageContext.getAttribute("ds", PageContext.APPLICATION_SCOPE) %> <br/>
<%=pageContext.findAttribute("ds")%>
jsp动作标签
jsp提供一个很特殊的标签 , 该标签的作用 引入其他的页面
一个jsp可以包含另外一个jsp
静态引入:两个jsp编译阶段就在一起了 最后输出给浏览器
动态引入:两个jsp只不过是将最后的结果合并输出给浏览器,本质上还是两个类。
el表达式(重要)
el表达式作用:简化获得域中数据的操作
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
el.jsp页面
<h1>原始获得数据的方式</h1>
<%=pageContext.getAttribute("ds" , PageContext.REQUEST_SCOPE) %><br/>
<%=pageContext.getAttribute("ds" , PageContext.SESSION_SCOPE) %><br/>
<%=pageContext.getAttribute("ds" , PageContext.APPLICATION_SCOPE) %><br/>
<h1>el表达式获得数据</h1>
<%--
expression language : 表达式语言
表达式语言:固定语法 作用:快速获得域中的数据
语法格式: ${ 固定的字符串 }
固定的字符串 : el表达式中提供了 3个固定的字符串
pageScope requestScope(常见) sessionScope(常见) applicationScope(常见)
效果: ${requestScope.key} ${sessionScope.key} ${sessionScope.key}
Scope :域
能把所有的代码放到一个{}里面吗 ?不能
${requestScope.key} == <%=request.getAttribute("ds")
${key}的说明:(重要)
底层采用的是 findAttribute("") 依次从四个域中获得数据的
page->request->session-> application
使用原因: 建议不要往不同域中放同名的key
el表达式对比pageContext.getAttribute("ds" , PageContext.REQUEST_SCOPE)
好处: el表达式如果获得不到数据 顶多显示空字符串
--%>
${requestScope.ds}<br/>
${sessionScope.ds}<br/>
${applicationScope.ds}<br/>
${ds}<br/>
</body>
</html>
el表达式运算符
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="com.llz.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
模拟servlet存储数据 el表达式操作域数据
--%>
<%
request.setAttribute("str" , "xxx"); //放在servlet
%>
<%--
jsp获得数据
--%>
<h1>算术运算 + - * / </h1>
${1} <br/> <%--输出1 没有修改--%>
${1+1} <br/> <%--结果是2 el表达式中的数字进行会计算 --%>
${1+"1"} <br/> <%--结果是2 el表达式字符串 先将字符串转换成数字 进行计算--%>
${1+'1'} <br/> <%--结果是2 在el表达式中没有字符串和字符的概念 将字符串 转换成数字进行计算 --%>
<%-- ${ key } 依次从四个域中获得数据 --%>
${1+a} <br/> <%--结果是1 , ${a} 先从域中获得数据 , 域中没有数据结果为空 1+空= 1 --%>
<%
request.setAttribute("a" , "100"); //放在servlet
%>
${1+a} <br/> <%--结果:101 --%>
<%-- java.lang.NumberFormatException: For input string: "a" --%>
<%--${1+"a"} <br/>--%><%--结果: 报错 , 尝试将"a" 转换成数字 此处报错 --%>
<%-- jsp中除法是有余数的 --%>
${10/5}<br/>
${10/4}<br/>
<h1>逻辑运算</h1>
<%-- 一模一样 --%>
${ true && true } <br/>
${ true || false}<br/>
${ !true }<br/>
<%--el表达式提供特殊符号--%>
${ true and true }
${ true or false }
${ not true }
<h1>比较运算</h1>
<%-- 一样 --%>
${10 > 3 } ${10< 3} ${10 == 3}<br/>
<%--grant than less than equals--%>
${10 gt 3 } ${10 lt 3} ${10 eq 3}<br/>
<h1>三元运算</h1>
<%--一模一样--%>
${10 > 3 ? "大于" :"小于" }
<h1>empty运算符</h1>
<%--
empty : 空
1.判断字符串是否为空串
2.判断集合大小是否为0
3.判断对象是否为null
--%>
<%
request.setAttribute("dzd" ,"");
List list = new ArrayList();
request.setAttribute("user" , new User());
request.setAttribute("username" , "jack");
%>
${empty dzd }
${empty list}
${empty user}
<%--伪代码 执行不了的--%>
<%--if(${empty username }){
你好,请登录
}else{
欢迎您登录, ${username}欢迎回家
}--%>
</body>
</html>
el获得域中复杂数据
<%@ page import="com.llz.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--el获得数据(域中数据)--%>
<h1>字符串</h1>
<%--模拟代码 赋值到域中--%>
<%
request.setAttribute("str" , "aaa");
%>
<%--获得域中数据--%>
${str}
<h1>数组</h1>
<%
String [] myArray = {"a" , "b" , "c"};
request.setAttribute("myArray" , myArray);
%>
<%--
直接输出数组 执行toString方法
数组获得数据 ${key[索引值]}
数组的格式: [L..... 数组
--%>
${myArray} @@ ${myArray[0]} @@ ${myArray[1]}
<h1>对象-javaBean</h1>
<%
User user = new User("jack" , "rose" , "1234");
//user.getUsername();
request.setAttribute("user" , user);
%>
<%--
${key.get方法} 去掉get首字母小写的过程 不是${key.属性名称}
--%>
${user} @@ ${user.username2} @@ ${user.nickname}
<h1>List集合-放字符串</h1>
<%
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
request.setAttribute("list" , list);
%>
<%--
获得list的数据
格式: [ 值1 , 值2 , 值3 ]
获得数据跟数组一模一样 ${key[索引值]}
--%>
${list} @@ ${list[0]} @@ ${list[1]}
<h1>List集合-javaBean</h1>
<%
//矩形编译 alt + 鼠标左键
List<User> javaBeanList = new ArrayList<User>();
javaBeanList.add(new User("jack1" ,"rose1" , "1234"));
javaBeanList.add(new User("jack2" ,"rose2" , "1111"));
javaBeanList.add(new User("jack3" ,"rose3" , "2222"));
request.setAttribute("javaBeanList" , javaBeanList);
%>
<%--第二个javaBean中nickname和password--%>
${javaBeanList[1].nickname} @@ ${javaBeanList[1].password}
<h1>Map集合-string-string</h1>
<%
//矩形编译 alt + 鼠标左键
Map<String , String > map = new HashMap<String ,String>();
map.put("a" , "b");
map.put("key1" , "value1");
map.put("xxx" , "张三");
request.setAttribute("map" , map);
%>
<%--
数组: [L.....
集合: [值1 , 值2, 值3 ]
map的输出格式: { key = value , key=value , key=value }
获得数据的方式和javaBean一样
${域中的key.map的key即可}
--%>
${map.key1} <br/>
${map.a} <br/>
${map.xxx} <br/>
<h1>Map集合-string-javaBean</h1>
<%
//矩形编译 alt + 鼠标左键
Map<String , User > javaBeanMap = new HashMap<String ,User>();
javaBeanMap.put("bean1" , new User("jack1" ,"rose1" , "1234"));
javaBeanMap.put("bean2" , new User("jack2" ,"rose2" , "1111"));
javaBeanMap.put("bean3" , new User("jack3" ,"rose3" , "2222"));
request.setAttribute("javaBeanMap" , javaBeanMap);
%>
<%--第二个javaBean中nickname和password--%>
${javaBeanMap.bean2.nickname} @@ ${javaBeanMap.bean2.password}
</body>
</html>
jsp中获得动态项目发布路径
<%--服务器名称不建议写死--%>
<%-- request.getContextPath() 获得项目的发布路径 --%>
<a href="<%=request.getContextPath()%>/DemoServlet">访问servlet</a><br/>
<a href="${pageContext.request.contextPath}/demo2.jsp">原理</a><br/>
jsp和js(JavaScript)区别
1、JSP全称是java server page JS全称是javaScript
2、最主要的区别是运行位置不同。
JSP运行在后台服务器上,混合在HTML中的java程序段用于控制HTML的动态生成,并且通常负责调用后台数据库中的数据,形成能够根据使用情况的变化的,具有丰富数据交互效果的页面。
JavaScript 通常是运行在前台,即运行于用户浏览器的,通常不需要服务器的后台支持(AJAX交互例外),混合在HTML中的JavaScript脚本程序直接被浏览器解释执行,以提高页面的美观性和UI操作响应速度为基本目标。
3、JSP在HTML中用<%%>里面实现。JS在html中用实现