javaWeb核心技术第九篇之JSP
JSP:全名是Java Server Pages,它是建立在Servlet规范之上的动态网页开发技术.在JSP文件中,HTML代码与Java代码共同存在,其中,HTML代码用来实现网页中静态内容的显示,Java代码用来实现网页中动态
内容的显示.JSP文件的扩展名为.JSP;
JSP技术所开发的Web应用程序是基于Java的,它可以用一种简捷而快速的方法从Java程序生成Web页面,使用上具有如下特征:
1:跨平台:由于JSP是基于Java语音的,它可以使用JavaAPI,所有它也是跨平台的,可以应用于不同的系统中,如Windows,Linux等.
2:业务代码相分离:在使用JSP技术开发Web应用时,可以将界面的开发与应用程序的开发分离开.
3:组件重用:JSP中可以使用JavaBean编写业务组件,也就是使用一个JavaBean类封装业务处理代码或者作为一个数据存储模型,在JSP页面中,甚至在整个项目中,都可以
重复使用这个JavaBean,同时,JavaBean也可以应用到其他Java应用程序中.
4.预编译:预编译就是在用户第一次通过浏览器访问JSP页面时,服务器将对JSP页面代码进行编译,并且仅执行一次编译.编译好的代码将被保存,在用户下一次访问时,
会直接执行编译好的代码.这样不仅节约了服务器的CPU资源,还大大的提升了客户端的访问速度.
原理解释:
1.jsp文件访问服务器的时候,就是访问服务器tomcat下的web.xml.
2.执行一个Servlet<servlet-class>org.apache.jasper.servlet.jspServlet</servlet-class>
3.这个Servlet将会把jsp转换成java文件.
4.在tomcat的\work\Catalina\localhost\e66_day38\org\apache\jsp 产生一个java文件.
5.将java文件编译成class.
6.相当于访问a_hello.jsp执行了一个class文件.
总结:jsp就是一个Servlet.
因为:1.jsp生成的类 ,继承extends prg.apache.jasper.runtime.HttpJspBase.
2.extends org.apache.jasper.runtime.HttpJspBase又继承了extends HttpServlet.
为什么有servlet还需要有jsp?
Servlet:可以在java里嵌套html代码(以java代码为主);
例如:response.getWriter().print(<a>);
Jsp:可以在html中嵌套java代码(主体是html);
例如:<a href=""><%=java代码%></a>.
分工明确:各自实现自己的特点,业务代码相分离.
脚本元素:
作用:主要就是在jsp中嵌套java代码.
Java一共分为三类:
1.成员变量 声明方式 类体中.
2.局部变量 for循环 方法体中
3.参数 方法体中 并且 某一共括号中 service.findAll(username,password);
<% %>脚本 允许 方法体中的代码 最后被编译到service方法中.
<% = %>输出 允许写参数 out.print(getUsername());
<%!%>声明 成员变量 在类体中
例题:九九乘法表用表格的形式表示出来:
<%
for(int x = 1 ; x <= 9 ; x++) {
out.print("<tr>");
String s = "";
for(int y = 1 ; y <= x; y++) {
s = x + " * " + y + " = " + x*y + " ";
out.print("<td>");
out.print(s);
out.print("</td>");
}
out.print("</tr>");
}
%>
脚本元素面试题:
<%=i%> 2.输出5
<% i++; %> 3.成员变量+1 --> this.i=6
<% int i = 10; %> 4.定义局部变量 i=10
<%=this.i%> 5.输出成员变量 --> this.i
<%! int i=5;%> 1.声明成员变量 --> this.i = 5
<% i++;%> 6.局部变量 +1 i=10;
<%=i%> 7.输出 i=11
在java文件中是这样显示的.
public class test {
private i = 5;
public void show() {
System.out.println(this.i);
this.i++;
i = 10;
System.out.println(this.i);
i++;
System.out.println(i);
}
}
注释:
以后在写页面时,只用jsp注释.
语法:<%-- --%>
page指令:是jsp转换成servlet的依据.
编码组:(重要)
pageEncoding:设置当前页面的编码(源文件);
contentType:设置响应流的编码;
缓存:(了解)
buffer:缓存的大小.
autoFlush : 是否自动刷新(如果缓存满了 刷新给浏览器)
out.print(任何数据类型)和System.out.println(任何数据类型");//都是输出的是一个字符串.所以一个字符占一个字节.
jsp的错误处理机制(了解) 每一个jsp都需要配置
errorPage: 指向一个专门处理错误的页面.
isErrorPage: 表示是不是错误处理页面.
Web中错误处理机制(扩展重要)
<error-page>
<error-code>错误的代码 404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<exception-tupe>异常的类型</exception-tupe>
<location>/类型.jsp</location>
</error-page>
其他:(了解)
session="true" 表示jsp页面可以直接使用session对象,只要是jsp需要支持session,第一次调用getSession.
第一次访问jsp的时候,底层会调用getSession()这个方法,session被创建.
language="java";
表示:jsp支持的语音.
impost=""
导入bao,alt+/
lnclude:静态包含.可以将另外一个页面引入进来
例如:<%@ include file="将要引入的页面" %>
静态包含:在服务编译的时候,将两个页面生成一个Servlet,输出给浏览器.
动态包含(动态元素) : 在服务器编译的时候,生成两个Servlet,最后输出给浏览器时,会合并输出.
<jsp:include page="header.jsp"></jsp:include>
使用时:动态和静态没有区别,要注意,变量声明和使用问题.
Taglib:
导入标签库:将一些规范导入到jsp页面,uri指的是规范的路径,prefix:指的是别名.
<%@ taglib="http://java.sun.com/jsp/jstl/core" prefix="c"%>
在JSP页面中,有一些对象需要频繁使用,如果每次都重新创建这些对象则会非常麻烦.为了简化Web应用程序的开发,JSP2.0规范中提供了9个隐式(内置)对象,
它们是JSP默认创建的,可以直接在JSP页面中使用.
九大内置对象:
1.page 类型是Object 就是java中this对象.
2.config 类型ServletConfig.
3.application 类型ServletContext.
4.request
5.response
6.session
7.out ==>> getWriter()
8.exception
9.pageContext : 页面上下文根对象
九大内置对象-out:
//以后的开发 不能混搭使用
//out表示的jsp的输出流
out.print("a");
//手动刷新
//out.flush();
//response.getWriter().print("x");//Servlet的输出流
out.print("b");
//字符流和字节流不可以同时使用.
response.getOutputStream().print("xxxx");
九大内置对象--pageContext
pageContext:当前页面的上下文根对象.
作用:
1:可以获得其他八个内置对象,传递参数有用,调用一个方法(pageContext);
pageContext.getXxx()
2:简化四个操作
默认情况下 往page域中操作.
setAttribute(name,value);
getAttribute(name);
removeAttribute(name) 特殊记忆,默认没有指定域,删除所有域数据.
统一api
pageContext.setAttribute(name,value,int scope) 常量,写死不会发生变化的,人家可以直接调用
pageContext.getAttribute(name,scope);
pageContext.removeAttribuet(name,scope);
依次从四个域中获得数据:
pageContext.findAttribute("name");
取值的顺序:从小到大 page request session application.
以后在往域中放数据时,一般不会取相同的name名称.
域:
Servlet三个域对象:
Request Session ServletContext;
API:
SetAttribute(String name,Object value);
getAttribute(String name);
removeAttribute();
jsp的四个域对象:
pageContext request session application;
page域和page对象 没有关系:
SetAttribute(String name,Object value);
getAttribute(String name);
removeAttribute();
数据共享:
Page:只能当前页面共享数据(相当于成员变量);
Request:当前请求共享数据;
Session:当前会话共享数据;
Application:当前项目共享数据;
//表示设置value的值
Document.getElementById("id的值").value = "";
//表示
Document.getElementById("id的值").value = "";
//表示获得了所有的以"input"为标签开头的数组里面第一个索引的标签对象,并把这个标签设置成了"#ffo"颜色的背景色.
Document.getElementsByTagName("input")[0].style.backgroundColor="#ffo";
//表示获得了所有的属性name为"username"的数组里面的第一个索引的标签对象,并把这个标签对象设置成了"#ffo"
Document.getElementsByName("username")[0].style.backgroundColor="#ffo";
EL表达式:是一门语言,主要是用来获得域中数据.
EL表达式中内置了十一个对象,这些对象其实就是字符串.
四大域 4 表示四个域而不是表示page request ..对象
pageScope requestScope sessionScope applicationScope
${对象.key}用的很少
重点记${key} 以后开发中不会往每个域中设置相同的名称,底层对应的是pageContext.findAttribute()
请求参数 2
param paramValues
可以获得请求的参数,对应的api getParameter() getParameterValues()
请求头 2
header headerValues
可以获得请求头中的参数
初始化参数 1
initParam
可以获得web.xml中全局初始化参数
PageContext 1
对应的就是jsp中的pageContext对象
很重要:例如:${pageContext.request.contextPath}
(重要)Cookie 1
原始代码:new Cookie(name,value);
获得 request.getCookies(),获得的是数组
再次请求的cookie以map形式保存,map的key是cookie名称,cookie的值=cookie的对象
案例:
${cookie}<br/>
${cookie.ns}<br/>
${cookie.ns.name }<br/>
${cookie.ns.value }<br/>
十一个对象,可以从不同的位置获得数据:
语法:
${对象.key} 或者${对象['key']} 主要用来处理特殊字符串.
例如:${param.username},${header['accept-encoding']}
{key=value,key=value} map集合
[L.......是数组 [........]list集合
<h2>算数运算符</h2>
<%-- 减号在el表达式中体现的就是减号 但如果想使用连接符- 使用特殊语法 ${对象['xxx-yyy']} --%>
${1} <br/>
${"1" + 1}<br/><%-- 会将字符串转换成数字类型 进行计算 --%>
${'1' + 1}<br/><%-- el表达式没有字符概念 只有字符串 单引号和双引号一样 但建议写单引 --%>
\${"a" + 1}<br/><%-- 报错 数字转换异常 --%>
${a + 1 }<br/> <%-- el表达式 会从域中先获得数据 如果没有是空字符串 --%>
<%
pageContext.setAttribute("a", 18);
%>
${a + 1 }<br/>
${10/5}<br/>
${10/3}<br/>
${10 / 3}<br/>
<h2>逻辑运算符</h2>
${true && false}
${true || false}
${!true}
${not true}
<h2>关系运算符</h2>
${3 gt 2}
${3 lt 2}
${3 eq 2}
${3 == 2}
<h2>三元(目)运算符 </h2>
三元的本质就是if <br/>
<%-- ${条件 ? 条件成立 :条件不成立 } 后台的Servlet 往jsp传递数据 如果传递的flag = true || false--%>
${3>2 ?"真的" : "假的"}
<input type="checkbox" ${param.flag ? "checked" : ""} >
<h2>empty 关键字</h2>
<%-- empty 表示是否为空
1.字符串是否为空字符串 ""
2.集合的大小是否为0
3.对象是否为null(重点)
以后登陆是 数据存放到session中 目的:多个页面 在同一个会话可以共享数据
--%>
案例:
<c:if test="${not empty user}">
欢迎您,${user.username}登陆成功;
</c:if>
<c:if test="${empty user}">
请登陆;
</c:if>
<%
//模拟用户登陆数据
pageContext.setAttribute("user", new Person("jack","18","男"));
%>
${empty user} 为null<br/>
${not empty user} 不为null <br/>
if(登陆){
欢迎您xxx
}else{
游客你好 请登陆
}
varStatus:表示当前对象状态.
index表示:索引
count:表示计算,当前遍历的个数.
案例:
<h2>数组</h2>
<%
String[] arr = {"a","b","c"};
pageContext.setAttribute("arr",arr);
%>
<c:forEach items="${arr}" var="a" varStatus="xxx">
${xxx.index} @@ ${xxx.count} @@ ${a}<br/>
</c:forEach>
insert into 数据库底层其实用的都是字符串
所以:例如用date时,在JavaBean中改用String
<h2>普通遍历</h2>
<%--
for(int i = 1 ; i<=9 ; i++){
}
<c:forEach begin="1" end="9" step="1" var="i">
</c:forEach>
begin: 表示循环开始
end:表示循环结束
step:步进
var : 临时变量 但会将临时变量存到page域中
--%>
<c:forEach begin="1" end="9" step="1" var="i">
<c:forEach begin="1" end="${i}" step="1" var="j">
${i}*${j} =${i*j}
</c:forEach>
<br/>
</c:forEach>
*/
ClassNotFoundException:表示找不到类,或者对类的操作有问题.
javaWeb核心技术第九篇之JSP的更多相关文章
- javaweb回顾第九篇EL表达式
前言:关于EL表示式开发用的非常多,现在我们回顾一下关于如果去操作EL表达式 1:EL表达式语法 所有EL表达式都是由{开始}结束,表达式中用.和[]操作符来访问数据比喻${user.userName ...
- 解剖SQLSERVER 第九篇 OrcaMDF现在能通过系统DMVs显示元数据(译)
解剖SQLSERVER 第九篇 OrcaMDF现在能通过系统DMVs显示元数据(译) http://improve.dk/orcamdf-now-exposes-metadata-through-s ...
- 第九篇 SQL Server代理了解作业和安全
本篇文章是SQL Server代理系列的第九篇,详细内容请参考原文 在这一系列的上一篇,学习了如何在SQL Server代理作业步骤启动外部程序.你可以使用过时的ActiveX系统,运行批处理命令脚本 ...
- 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容
第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...
- 第九篇 Integration Services:控制流任务错误
本篇文章是Integration Services系列的第九篇,详细内容请参考原文. 简介在前面三篇文章,我们创建了一个新的SSIS包,学习了脚本任务和优先约束,并检查包的MaxConcurrentE ...
- 第九篇 Replication:复制监视器
本篇文章是SQL Server Replication系列的第九篇,详细内容请参考原文. 复制监视器允许你查看复制配置组件的健康状况.这一篇假设你遵循前八篇,并且你已经有一个合并发布和事务发布.启动复 ...
- 第九篇 SQL Server安全透明数据加密
本篇文章是SQL Server安全系列的第九篇,详细内容请参考原文. Relational databases are used in an amazing variety of applicatio ...
- 用仿ActionScript的语法来编写html5——第九篇,仿URLLoader读取文件
第九篇,仿URLLoader读取文件 先看看最后的代码 function readFile(){ urlloader = new LURLLoader(); urlloader.addEventLis ...
- Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用 ...
随机推荐
- MySql 5.7.28 安装注意事项
刚好最近用到了5.7,所以顺便整理记录一下,5.7与5.6的区别是5.7不可以使用空密码直接登录 下载地址:https://cdn.mysql.com//Downloads/MySQL-5.7/mys ...
- c++之程序流程控制
三种程序运行结构:顺序结构.选择结构.循环结构. 顺序结构:程序按顺序执行,不发生跳转. 选择结构:依据条件执行不同的语句. 循环结构:判断条件是否满足,循环多次执行某段代码. 一.选择结构 //单行 ...
- AI-Azure上的认知服务之Computer Vision(计算机视觉)
使用 Azure 的计算机视觉服务,开发人员可以访问用于处理图像并返回信息的高级算法. 主要包含如下高级算法: 标记视觉特性Tag visual features 检测对象Detect objects ...
- vscode搭建C/C++环境
windows安装Mingw-w64 Mingw-w64安装 准备工作 创建文件夹Vc_c++ 在Vc_c++文件夹下创建下面两个文件夹 在g++下创建demo.cpp 在gcc下创建demo.c 打 ...
- 基于vue+leaflet+echart的足迹分享评论平台
(其实题目是随便取的,目的只是用来证明Vue+leaflet+springboot技术栈的可行性) 效果 小专栏不支持上传视频?想看的话可以去我的知乎看最新的文章,那个应该可以.在这里 主要功能描述 ...
- java存储数据到本地txt文件中
java存储数据,方便打印日志等 1.会覆盖以前的数据 try { File writeName = new File("D:\\data.txt"); // 相对路径,如果没有则 ...
- Android 上下文菜单 ActionMode
public class MainActivity extends Activity { private Button button; private ActionMode actionMode; @ ...
- Dynamics 365中的Client API form context (formContext)
适用于Dynamics 365 for Customer Engagement apps 9.x版本. 本文是一篇翻译,原文来源是微软官方文档. 本文链接:https://www.cnblogs.co ...
- Racket 命令行方式安装 collection
最近在学习 SICP,里面用的 Lisp 系列的 Scheme.OS X 上要配置Scheme环境. Racket 完整的包要 110 M,mini 版只要10M.我只需要简单的命令行操作,显然选mi ...
- ZKWeb 官网与演示站点的部署步骤 (Linux + Nginx + Certbot)
因为没有给域名续费,加上私人时间不足,ZKWeb 的官网和演示站点已经停止了几个月的时间. 最近时间开始变多,所以重新购买了别的域名和服务器把官网和演示站点重新部署上去. 在此前站点是托管在共享主机上 ...