JavaScript,Servlet,jsp

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()+"日&ensp;") ;
	//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()+
			"&ensp;&ensp;"+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检索字符串中指定的值。返回找到的值,并确定其位置。如果没有发现匹配,则返回
testnull。检索字符串中指定的值。返回 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">
					用户&ensp;&ensp;名:<input type="text"
					 placeholder="请输入用户名" οnblur="checkUserName()" id="username" /><span id="userTip"></span>
				</div>
				<div id="pwdDiv">
					密&ensp;&ensp;&ensp;&ensp;码:<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">
					邮&ensp;&ensp;&ensp;&ensp;箱:<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>
	在转发动作内部使用,做参数传递

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值