JavaScript
一.Js中的流程控制语句
1. 选择结构
if()中的数据类型可以自动转换.
switch语句需要手动转换,String转换number:var res = parseInt(num)
case语句后可以使用变量
if...else...
if...else if...else
switch...case...default
2.循环结构
for
while
do...while...
3.跳转
continue
break
4.遍历
普通for遍历
for(var i=0;i<arr.length;i++){
遍历输出
}
for-in 遍历
for(var 变量名 in 数组对象或者对象名称){
用这个变量名
}
5.创建一个数组
方式一:var 数组名称 = new Array();//没有给定数组长度
方式二:var 数组名称 = new Array(size);//给定数组长度
方式三:var 数组名称 = [元素1,元素2,...];//静态初始化
二.Js中的函数定义以及函数调用
函数定义:
function 函数名称(参数名称列表或空参){
完成的方法体的逻辑
情况1)----直接输出
情况2)---return 直接返回数据 ;
}
情况1的调用:
单独调用:函数名称(实际参数列表) ;
情况2的调用:
赋值调用:var 结果变量 = 函数名称(实际参数列表) ;
注意事项:
1.定义函数的时候,函数中参数列表不能带var和Java不一样(Javascript弱类型语言)
2.Javascript定义函数function 函数名称(参数列表){},不需要返回类型但是方法体中是可以使用return语句的
3.javascript不存在函数重载的概念,函数名称相同,后面的函数将前面的函数覆盖!
4.js的函数中存在默认数组arguments,将实际参数赋值给形式参数!
三.Js中常见的内置对象 :String/Array/Date/Boolean…
Array内置对象功能
//join(str):通过指定的分割符号将数组的元素拼接成字符串
var str = arrArray.join("-") ;
//reverse():将数组的元素反转....
arrArray = arrArray.reverse() ;
//valueOf():比较两个字符串对象的原始值是否相同
document.write(((s1.valueOf())==(s2.valueOf()))+"<br/>") ;
String内置对象常用功能
//charAt(index)返回指定索引位置处的字符
document.write(str.charAt(4)+"<br/>") ;
//concat(str):拼接功能
document.write(str.concat("world")+"<br/>") ;
//fontcolor("颜色名称"):给字符串标记颜色
document.write(str.fontcolor("darkorange")+"<br/>") ;
//fontsize(整数), 给字体设置大小
//<font size="25"></font>
document.write(str.fontsize(25)+"<br/>") ;
//substring(start, end):截取功能
document.write(str.substring(0,5)+"<br/>") ;
Date内置对象
//获取年份getFullYear();
document.write(date.getFullYear()+"年") ;
//获取年中的月份getMonth():返回0-11之间的整数
document.write((date.getMonth()+1) +"月") ;
//月份中的日期值getDate()
document.write(date.getDate()+"日 ") ;
//getHours()小时 getMinutes()分钟 getSeconds()秒数
document.write(date.getHours()+":"+date.getMinutes()+":"+date.getSeconds())
四.Js的事件编程
1.事件源----html标签 点击按钮/图片点击等等
2.编写事件监听器---写一个函数
function 函数名称(形式参数不需要带var){
完成的逻辑
}
3.在1中通过一些属性绑定这个函数
οnclick="函数名()"
点击事件:click/dbclick
焦点事件:focus/blur
选项卡变化的事件:change
鼠标经过事件:mouserover
鼠标移出事件:mouserout
页面载入事件:load
按键按下....事件
五.JS的dom操作(Document Object Model)
dom编程:文档对象模型编程
浏览器的js引擎解析浏览器html页面的时候,将html页面中所有的标签都解析为 "标签对象",通过标签对象完成一些具体的操作 ;
1)获取标签对象
通过id属性值获取标签对象(最常用的,id必须唯一的)
2)改变标签对象的属性
通过特有方式获取节点对象(元素对象)改变一些属性!
通用的document对象的方法获取标签对象
document.getElementById("id属性值") ;
document.getelementsByClass("同名的class属性值") ;
document.getElementsByTagName("同名的标签名称") ;
document,getElementsByName("所有的同名的name") ;
//document对象的方法获取标签对象
//1)getElementById("id属性值"),获取指定标签对象
var inputObj =document.getElementById("username") ;
//通过节点关系获取标签对象---js内置对象属性 parentNode
var bodyNode = inputObj.parentNode ;
alert(bodyNode.nodeName) ;//获取节点名称 nodeName
var childs = bodyNode.childNodes ; //所有的子节点
for(var i= 0 ; i <childs.length ; i ++){
document.write(childs[i].nodeName+"<br/>") ;
}
//2)var 标签对象列表 =doucment.getElementsByClassName("页面中所有的同名的class属性值)
var inputObj = document.getElementsByClassName("user")[0] ;
//3)通过标签名称获取标签对象--标签对象列表
document.getElementsByTagName("标签名称") ;
var inputObj = document.getElementsByTagName("input")[0] ;
//4)通过name属性值获取标签对象--标签对象列表
document.getElementsByName("所有 同名的name属性值") ;
var inputObj = document.getElementsByName("name")[0] ;
alert(inputObj.value) ;
六.定时器
方式一:window.setInterval(定时任务就是一个函数, iMilliSeconds )
每经过iMilliSeconds毫秒后重复执行这个任务函数
代码实现:
<body>
当前的时间是:<span id="spanTip"></span>
</body>
<script>
function time(){
//1)需要创建js的日期对象
var date = new Date();
//2)拼接日期+时间的字符串
var strDate = date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate()+
"  "+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds();
//3)将日期+时间的字符串 动态设置到span标签体中
//3.1)获取id="spanTip"标签对象
var spanObj = document.getElementById("spanTip");
//3.2)设置它的文本内容
spanObj.innerHTML = "<h3>"+strDate+"</h3>";
}
//4)需要有定时器---每秒(1000毫秒)都执行
setInterval("time()",1000);//每1秒中都需要执行这个函数
</script>
方式二:window.setTimeout(定时任务就是一个函数, iMilliSeconds)
经过iMilliSeconds毫秒后执行一次任务函数!
代码实现:
<body>
<input type="button" οnclick="myClick()" value="点击"/>
<input type="button" οnclick="clearMyClick()" value="清除定时器"/>
</body>
<script>
//1)点击按钮----触发单击点击事件
function myClick(){
//3秒后执行一次任务
window.setTimeout("OpenHref()",3000) ;
}
function OpenHref(){
//open方法:参数1:打开地址 参数2:打开地址的方式
window.open("06_Date日期对象.html","_blank") ;
}
</script>
任何标签都有的两个属性
给标签设置文本
innerText:普通文本
innerHTML:html文本 <h3>文本内容</h3>
动态给标签设置文本
1)需要获取当前标签对象 通过id属性值获取标签对象
var 标签对象名称= document.getElementById("id属性值") ;
2)使用标签对象名称 访问属性
innerText
innerHTML
//通过id属性值 spanTip获取span标签对象
var spanObj = document.getElementById("spanTip") ;
alert(spanObj.nodeName); //获取标签对象的名称---js提供属性 nodeName:节点名称
spanObj.innerText = "<h3>helloworld</h3>";
spanObj.innerHTML = "<h3>helloworld</h3>"
七.JS自定义对象的方式
方式一:类似Java中有参构造方法
定义一个对象-- 和定义函数的格式相同
function 对象(形式列表){
//追加属性
this.属性名1 = 参数名1;
this.属性2= 参数名2;
//追加功能
this.方法名 = function(){
逻辑...
}
}
//创建对象
var 对象名 = new 对象(实际参数列表) ;
例:
//定义一个学生对象,name,age,gender三个属性
function Student(name,age,gender){
//追加属性名
this.name = name ;
this.age = age ;
this.gender = gender ;
//追加功能
this.sperkEng=function(languageName){
alert("会讲"+languageName) ;
}
}
方式二:类似Java中无参构造方法
定义对象
function 对象(){
}
创建对象
var 对象名 = new 对象() ;
//追加属性
对象名.属性名= 值
//追加功能
对象名.方法名 = function(){
...
}
例:
//定义学生对象
function Student(){
}
//创建对象
var s = new Student() ;
//追加属性
s.name = "文章" ;
s.age = 35 ;
s.gender = "男" ;
//追加方法
s.speak=function(name){
alert("会说"+name) ;
}
方式三:利用Object 对象,所有js对象的模板!
例:
//直接创建对象
var s = new Object() ;
//追加属性
s.name = "张佳宁" ;
s.age =32 ;
s.gender="女" ;
//追加功能
s.speak=function(lname){
alert("会说"+lname) ;
}
方式四:字面值的方式 利用json字符串
{"key":"value"}
最常用的一种格式
普通字符串
var json对象 = {"key1":"value1","key2":"value2",....} ;
例:
var students = [
{"name":"高圆圆","age":44,"gender":"女","address":"西安市"},
{"name":"文章","age":35,"gender":"男","address":"咸阳市"},
{"name":"张佳宁","age":32,"gender":"女","address":"鄠邑区"},
];
document.write("姓名是:"+students[1].name) ;
document.write("地址是:"+students[2].address) ;
八.正则表达式
正则表达式是描述字符模式的对象。
正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具。
语法:
var re = new RegExp("\\w+");
var re = /\w+/;
8.1修饰符:用于执行区分大小写和全局匹配:
修饰符 | 描述 |
---|---|
i | 执行对大小写不敏感的匹配。 |
g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 |
m | 执行多行匹配。 |
8.2方括号:用于查找某个范围内的字符
表达式 | 描述 |
---|---|
[abc] | 查找方括号之间的任何字符. |
[^abc] | 查找任何不在方括号之间的字符 |
[0-9] | 查找0-9的数字 |
[a-z] | 查找小写a-z的字符 |
[A-Z] | 查找大写A-Z的字符 |
[A-z] | 查找所有字母不区分大小写 |
(red | blue | green) | 查找指定项 |
8.3元字符(Metacharacter):是拥有特殊含义的字符:
8.3量词:用于表示重复次数的含义
8.4RegExp 对象方法
方法 | 描述 |
---|---|
compile | 编译正则表达式 |
exec | 检索字符串中指定的值。返回找到的值,并确定其位置。如果没有发现匹配,则返回 |
test | null。检索字符串中指定的值。返回 true 或 false。 |
8.5支持正则表达式的 String 对象的方法
方法 | 描述 |
---|---|
search | 检索与正则表达式相匹配的值。 |
match | 找到一个或多个正则表达式的匹配。 |
replace | 替换与正则表达式匹配的子串。 |
split | 把字符串分割为字符串数组。 |
8.5正则表达式的用法
X代表任意字符
数量词相关的
X+:表示X字符出现一次或者多次 等价于{1,} 至少出现一次
X*:表示X字符零次或多次 等价于{0,}。至少出现0次
X?:表示X字符出现0次或者1次,等价于{0,1}:至少出现0次,不超过1次
范围:
X{n}: 表示X字符恰好出现n次
X{n,}:表示X字符串至少出现n次 等价于X+
X{n,m}:表示X字符串至少n次,但是不超过m次
其他语法:
\d--- 等价于[0-9]匹配纯数字
\w-- 等价于[A-Za-z0-9_]:匹配带有下划线的任何单词字符
邮箱里面--本身包含字符 .---->必须转义 \.
正则表达式如何使用?
1)创建正则表达式对象
var 对象名 = /正则语法/ ; -- 不推荐 "不完全匹配"
推荐
var 对象名= /^ 正则语法 $/ ;
边界匹配符号:
^:以...开头
$:以...结尾
2)var flag = 通过正则表达式对象名.test(输入的字符串)
flag--true,成功
false,匹配失败
九.表单校验
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>原生Js表单校验</title>
<!--
1)js正则表达式 使用
2)dom操作---获取标签对象---获取用户信息
3)js事件编程
-->
<style>
#formDiv{
border: 1px solid #000;
width:450px;
height: 300px;
margin-left: 350px;
margin-top: 150px;
}
#userDiv{
margin: 20px 0 0 70px;
}
#pwdDiv{
margin: 20px 0 0 70px;
}
#rePwdDiv{
margin: 20px 0 0 70px;
}
#emailDiv{
margin: 20px 0 0 70px;
}
#btnDiv{
margin: 20px 0 0 180px;
}
</style>
</head>
<body>
<div id="formDiv">
<!--
表单是否能够提交取决onsubmit事件 的返回结果:true---提交表单
否则false,不能提交表单(有一些表单项通不了正则)
-->
<form action="server.html" method="get" οnsubmit="return checkAll()">
<div id="userDiv">
用户  名:<input type="text"
placeholder="请输入用户名" οnblur="checkUserName()" id="username" /><span id="userTip"></span>
</div>
<div id="pwdDiv">
密    码:<input type="password"
placeholder="请输入密码" id="pwd" οnblur="checkPwd()" /><span id="pwdTip"></span>
</div>
<div id="rePwdDiv">
确认密码:<input type="password"
placeholder="两次密码输入信息一致" id="repwd" οnblur="checkRePassword()" /><span id="repwdTip"></span>
</div>
<div id="emailDiv">
邮    箱:<input type="text"
placeholder="请输入 邮箱" id="email" οnblur="checkEmail()" /><span id="emailTip"></span>
</div>
<div id="btnDiv">
<input type="submit" value="注册" />
</div>
</form>
</div>
</body>
</html>
<script>
/**
* 正则规则;
* 用户名:5-14位的数字或者字母组成
* 密码:6-10位的数子或者字母组成
* 确认密码:和密码一致
* 邮箱:满足基本邮箱格式
* 919081924@qq(163/126).com
* 企业邮箱:
* 企业名字@部门名字.com.cn....
*
*
*/
function checkAll(){
//将表单中表单项都需要校验
if(checkUserName() && checkPwd()
&& checkRePassword() && checkEmail()){
return true ;
}else{
return false ;
}
}
//校验用户名的函数
function checkUserName(){
//获取id="username"它所在的input标签对象,同时获取输入的内容
var username = document.getElementById("username").value ;
//alert(username) ;
//获取id="userTip"的span标签对象
var spanObj = document.getElementById("userTip") ;
//定义正则规则:
//5-14位的数字或者字母组成
var reg = /^[A-Za-z0-9_]{5,14}$/;
if(reg.test(username)){
//成立
spanObj.innerHTML = "恭喜您可用".fontcolor("green") ;
return true ;
}else{
//失败
spanObj.innerHTML = "对不起,格式有误".fontcolor("red") ;
return false ;
}
}
//校验密码
function checkPwd(){
//获取id="pwd" 的input标签对象,同时密码的内容
var pwd = document.getElementById("pwd").value ;
//获取 id="pwdTip"的span标签对象
var spanObj = document.getElementById("pwdTip");
//密码的正则规则:
//6-10位的数子或者字母组成
var reg = /^[A-Za-z0-9_]{6,10}$/ ;
if(reg.test(pwd)){
//成功
spanObj.innerHTML = "密码格式正确".fontcolor("green") ;
return true ;
}else{
spanObj.innerHTML="密码格式有误".fontcolor("red") ;
return false ;
}
}
//确认密码
function checkRePassword(){
//获取id="pwd" 的input标签对象,同时密码的内容
var pwd = document.getElementById("pwd").value ;
//获取id="repwd"的input标签对象,同时确认密码框的内容
var repwd = document.getElementById("repwd").value ;
//获取id="repwdTip"的span标签对象
var spanObj = document.getElementById("repwdTip") ;
if(repwd == pwd){
spanObj.innerHTML ="两次密码一致".fontcolor("green") ;
return true ;
}else{
spanObj.innerHTML ="两次密码不一致".fontcolor("red") ;
return false ;
}
}
//校验邮箱
function checkEmail(){
//获取id="email"的input标签对象.同时获取邮箱内容
var email = document.getElementById("email").value ;
//获取id="emailTip"的span标签对象
var spanObj = document.getElementById("emailTip") ;
//邮箱正则
/**
* 919081924@qq(163/126).com
* zhangsan@163.com..
* xxxx@126.com
* 企业邮箱:
* 企业名字@部门名字.com.cn....
*/
var reg = /^[A-Za-z0-9_]+@[A-Za-z0-9]+(\.[a-z]{2,3}){1,2}$/ ;
//匹配
if(reg.test(email)){
//成立
spanObj.innerHTML="邮箱格式正确".fontcolor("green") ;
return true ;
}else{
spanObj.innerHTML="邮箱格式有误".fontcolor("red") ;
return false ;
}
}
</script>
十.服务器的作用
服务器通过"网络"介质,
1)让数据在不同服务器之间数据共享!
2)可以提高网络安全性
3)提高访问执行速度
4)通过服务器集群--->增大并发访问量
tomcat理论并发量:500个
Servlet
一.Servlet ---- 底层框架(最原生)
Servlet的概念
Servlet:(全称Server Applet)是Java Applet简称,服务器连接(连接全前端后端接口的中间层)
Servlet:被web容器进行解析(web容器---> tomcat服务器/Jetty服务器/nginx服务器)--->开发一个中间层,首先需要有核心类----->服务器提供了核心jar包 servet-api.jar
SerVlet的本质
狭义的Servlet要实现javax.servlet.Servlet接口,一般都是广义的servlet,要实现javax.servlet.Servlet接口的类--->HttpServlet----->自定义一个类继承它,完成业务功能!
一句话:servlet本身就是要实现Servlet接口的java类
二.Servlet的生命周期
1.实例化:只执行一次
当用户第一次访问Servlet时,由容器调用Servlet的构造器创建具体的Servlet对象。也可以在容器启动之后立刻创建实例。使用如下代码可以设置Servlet是否在服务器启动时就创建。
2.初始化:init方法只被执行一次
在初始化阶段,init()方法会被调用。这个方法在javax.servlet.Servlet接口中定义。其中,方法以一个ServletConfig类型的对象作为参数。
3.服务:此方法会执行多次
当客户端有一个请求时,容器就会将请求ServletRequest与响应ServletResponse对象转给Servlet,以参数的形式传给service方法。
4.销毁:destroy方法执行一次
当Servlet容器停止或者重新启动都会引起销毁Servlet对象并调用destroy方法。
//实例化
public MyLifeServlet(){
System.out.println("MyLifeServlet创建了...");
}
//servlet的初始化
@Override
public void init(ServletConfig config) throws ServletException {
//ServletConfig 配置对象----tomcat创建对象,它可以获取web.xml中当前Servlet配置信息
String name = config.getServletName();
System.out.println("当前配置对象获取到的servlet名称是:"+name);
System.out.println("MyLifeServlet被初始化了....");
}
//服务 程序入口 业务访问方法
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("MyLifeServlet调用业务功能....进入业务服务方法了...");
}
//servlet的销毁
@Override
public void destroy() {
System.out.println("MyLifeServlet销毁了...");
}
三.Servlet执行流程
四.Servlet执行原理
五.Servlet涉及到的重点对象
5.1ServletConfig对象:servlet配置对象
//1.获取ServletConfig对象
//getServletConfig()方法,继承自他的父类
ServletConfig config = this.getServletConfig();
String servletName = config.getServletName();
System.out.println(servletName);
//2.getInitParameter(String name):通过初始化参数名称获取初始化参数值
String path = config.getInitParameter("path");
String value = config.getInitParameter("AAA");
System.out.println(path+"------"+value);
System.out.println("-----------------------------------");
//getInitParameterNames() 获取当前servlet所有的初始化参数的名称
Enumeration<String> en = config.getInitParameterNames();
while (en.hasMoreElements()){
String name = en.nextElement();//获取每一个参数名称
//getInitParameter(String name):
String value1 = config.getInitParameter(name);
System.out.println(name+"---------"+value1);
}
5.2ServletContext对象:全局对象
5.2.1获取上下文路径
5.2.2获取全局参数 web.xml中配置
public class ServletContextDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取全局对象ServletContext
//ServletContext getServletContext()
ServletContext context = this.getServletContext();
//2.获取当前web应用程序上下文路径 getContextPath()
String path = context.getContextPath();
//简写方式 HttpServletRequest里面封装的方法 getContextPath()
//String path = request.getContextPath();
System.out.println(path);
System.out.println("---------------------");
//获取web.xml全局参数 getInitParameter(String name)
String encoding = context.getInitParameter("encoding");
System.out.println(encoding);
//给浏览器响应一句话
response.setContentType("text/html;charset="+encoding+"");
response.getWriter().write("读取到web.xml文件的全局参数");
}
5.2.3请求转发 :通过Servlet获取业务数据,将业务数据交给前端
public class ServletContextDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取全局对象ServletContext
ServletContext context = this.getServletContext();
//2.通过全局对象获取请求分发对象 getRequestDispatcher(String path)
RequestDispatcher rd = context.getRequestDispatcher("/adv.html");
//3.进行分发 RequestDispatcher
//forward(ServletRequest request, ServletResponse response)
rd.forward(request,response);
//上面代码的简写格式:
//HttpServletRequest它的父接口ServletRequest 请求对象-->
//getRequestDispatcher(String path);
//request.getRequestDispatcher("/adv.html").forward(request,response);
//请求转发访问WEB-INF下的资源文件
// request.getRequestDispatcher("/WEB-INF/my.html").forward(request,response);
System.out.println("请求转发成功");
}
5.2.4域对象:可以在不同Servlet之间进行数据共享
//存储数据
public class ServletContextDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取全局对象
ServletContext context = this.getServletContext();
//给域对象存储数据 setAttribute(String name , Object object);
context.setAttribute("name","王琳凯");
//储存一个数据
//request.setAttribute("name","高圆圆");
request.getRequestDispatcher("/get.jsp").forward(request,response);
System.out.println("储存数据成功");
}
}
//获取数据
public class ServletContextDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取全局对象
ServletContext context = this.getServletContext();
//通过域对象获取属性对应的内容
String name = (String) context.getAttribute("name");
System.out.println("数据是:"+name);
}
}
六.Servlet接收前端表单数据
方式一:
public class GetParameterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决post乱码
request.setCharacterEncoding("utf-8");
//HttpServletRequest它的父接口中有这个方法
//public String getParameter(String name) 通过参数名称获取参数值
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username+"----"+password);
}
}
方式二:
public class GetDataServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//post请求中文乱码
request.setCharacterEncoding("utf-8") ;
//响应乱码
response.setContentType("text/html;charset=utf-8");
//通过HttpServletRequest ---String getParameter(String name):参数名称获取参数值
//其他方式
//post: key1=value1&key2=value2
//get:地址栏上 url?key1=value1&key2=value2
//Map<String, String[]> getParameterMap(); 通过request对象获取前端提交的参数的Map集合
Map<String, String[]> map = request.getParameterMap();
//遍历map
//方式一:Set <K> keySet() ---遍历键 通过 Object get(K key) :通过键获取值
//方式二:Set<Map.entry<K,V>> entrySet(); 通过getKey() getValue()
Set<String> keySet = map.keySet();
for(String key:keySet){
//通过键获取值
String[] value = map.get(key);
System.out.println(key+"---"+ Arrays.toString(value));
}
System.out.println("---------------------------------------");
//Enumeration<String> getParameterNames();获取前端请求所有的参数名称
Enumeration<String> en = request.getParameterNames();
while(en.hasMoreElements()){
String name = en.nextElement(); //获取每一个参数名称
// String getParameter(String var1); 通过参数名称获取值
String value = request.getParameter(name); //获取单个参数
System.out.println(name+"---"+value);
}
}
}
七.JSP
7.1概念
Java Server Pages :Java服务页面,通过java语言编写动态脚本,快速和后端数据进行交互,以html静态页面为模板使用jsp的指令以及一些核心库完成动态内容的生成!
能够书写Java代码的html页面
7.2执行原理
1)浏览器发送请求 地址http://localhost:8080/Servlet_Jsp_war_exploded/hello.jsp
2)服务器解析hello.jsp
2.1)hello.jsp----->翻译 hello_jsp.java文件 ---
public Ũnal class hello_jsp extends org.apache.jasper.runtime.HttpJspBase
class HttpJspBase extends HttpServlet ---jsp本质就是Servlet
2.2)hello_jsp.java 通过jvm 编译 ----hello_jsp.class字节码文件
我们书写<%jsp脚本 %>---都是这个_jspService()jsp的程序入口里面的局部变量....
7.3JSP九大内置对象
从小到大的四个域对象(重点)
PageContext pageContext (page域)
pageContext对象是javax.servlet.jsp.PageContext 类的实例,拥有作用域,用来代表整个JSP页面。
当前页面的作用域对象,一旦跳转则失效
通过setAttribute("name",value);存储值
通过getAttribute("name");获取值
用于获取其他8个内置对象或者操作其他对象的作用域
<%
pageContext.getRequest();//返回request内置对象
pageContext.getResponse();//返回response内置对象
pageContext.getServletConfig();//返回config内置对象
pageContext.getException();//返回exception内置对象
pageContext.getPage();//返回page内置对象
pageContext.getOut();//返回out内置对象
pageContext.getServletContext();//返回application内置对象
pageContext.getSession();//返回session内置对象
%>
HttpServletRequest request对象(request域) 使用居多
HttpSession session域(会话对象) 使用居多
ServletContext application域:代表整个web应用程序
HttpServletResponse 响应对象
ServletConŨ g 配置对象
JspWriter out:输出对象 out.write() /out.print(xx)
Object page(this)代表jsp页面(当前类对象)
Throwable 异常
7.4JSP三大指令
7.4.1page指令
语法:<%@ page attribute1="value1" attribute2="value2" %>
Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。
属性 | 描述 |
---|---|
contentType | 指定当前JSP页面的MIME类型和字符编码格式 |
errorPage | 指定当JSP页面发生异常时需要转向的错误处理页面 |
isErrorPage | 指定当前页面是否可以作为另一个JSP页面的错误处理页面 |
import | 导入要使用的Java类 |
language | 定义JSP页面所用的脚本语言,默认是Java |
session | 指定JSP页面是否使用session。默认为true立即创建,false为使用时创建 |
pageEncoding | 指定JSP页面的解码格式 |
7.4.2include指令
语法:<%@ include file = "被包含的JSP路径"%>
通过include指令来包含其他文件。
被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是当前JSP文件的一部分,会被同时编译执行(静态包含)。
7.4.3taglib指令
语法:<%@taglib prefix="前缀的名称" uri="具体的地址"%>
在项目中需要导入jstl(jsp的核心标签库的jar以及standard.jar 标准库)
<%--引入taglib指令--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
7.5el表达式
概念:EL使JSP写起来更简单、简洁。主要用于获取作用域中的数据
作用:用于替换作用域对象.getAttribute(“name”);
el的应用(获取基本类型,字符串)
${scope.name} 获取具体某个作用域中的数据
${name} 获取作用域中的数据,逐级查找(pageContext、request、session、application)
7.6动作标签
include
<jsp:include page="index.jsp"/>
<jsp:include >动作元素会将外部文件输出结果包含在JSP中(动态包含)。
前面已经介绍过include指令,它是将外部文件的输出代码复制到了当前JSP文件中。而这里的jsp:include动作不同,是将外部文件的输出结果引入到了当前JSP文件中。
useBean
<jsp:useBean id="user" class="com.qf.entity.User"/>
jsp:useBean 动作用来加载一个将在JSP页面中使用的JavaBean。
在类载入后,我们可以通过 jsp:setProperty 和 jsp:getProperty 动作来修改和获取bean的属性。
setProperty
<jsp:useBean id="user" class="com.qf.entity.User" />
<jsp:setProperty name="user" property="name" value="gavin" />
可以在jsp:useBean元素之后使用jsp:setProperty进行属性的赋值
getProperty
<jsp:useBean id="user" class="com.qf.entity.User" />
<jsp:setProperty name="user" property="name" value="gavin" />
<jsp:getProperty name="user" property="name" />
jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出
forward
<jsp:forward page="index.jsp" />
jsp:forward动作把请求转到另外的页面。
param
<jsp:forward page="index.jsp">
<!-- http请求参数传递-->
<jsp:param name="sex" value="nan" />
</jsp:forward>
在转发动作内部使用,做参数传递