第九周总结

第九周总结

1._Servlet

1.1_Servlet的结构体系

Servlet的结构体系
		
	GenericServlet implements Servlet
		
	HttpServlet extends GenericServlet
		复写:Service方法
			通过不同提交方式 request.getMethod()====String method
				执行不同doXXX()
		
	自定义一个类BaseSevlet 继承自HttpServlet		
		
		业务中:我们通过自己方法完成自己的业务
		覆盖HttpServlet中的service方法
		//通过反射的获取获取当前类的字节码对象
		//创建该类实例
				
		http://localhost:8080/xxx/xxxServlet?methodName=xx
		String method = request.getParameter("methodName") ;
		//获取Method----字节码文件对象.getMethod(method,HttpServletRequest.class,HttpServletResponse.class)
		调用invoke(当前类的实例,传递当前的实际参数)
				
				
		class UserServlet extends BaseServlet{
				
			public void register注册(){
				
			}----
		}
				
				
				
			doGet()
			doPost()

1.2_会话管理

程序中的会话:
	浏览器和服务器交互---产生的一些数据(内容)
会话技术:

cookie:存储在浏览器端
	小甜点,小饼干---JavaEE:会话管理的一种技术

	应用场景:
		可以记录用户访问过商品id
		记录用户上一次访问过得系统时间
		
	使用步骤:
		1)在服务器端
			创建Cookie对象
			public Cookie(String name, String value)
			Cookie c = new Cookie(String name, String value)
			
		2)Cookie信息保存在浏览器端:服务器将cookie响应给浏览器端
			public void addCookie(String name,String value)
		
		3)下一次:浏览器向服务器发送请求:
			就会将上一次携带的cookie数据,来访问服务器
				后台获取数据所有的cookie数据
			HttpServletRequest
		public Cookie[] getCookies():获取当前浏览器请求的所有cookie信息(cookie数组)
		
		
Session:存储在服务器端
	应用场景:
		前台:用户登录,需要将所有用户存储到session中
		验证码:使用画布技术---画出线条---产生一些数据  将产生的4个字符---存储到Session中
		
		
	
	
1.1.1_Cookie
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 
 * Cookie: 
 *   小甜点,小饼干  ----- JavaEE:会话管理的一种技术
 *   
 * 生活中的会话:
 * 		张三跟李四打招呼,李四回复张三...
 * 
 * 程序中的会话:
 * 		浏览器和服务器交互-----产生的一些数据(内容)
 * 
 * 会话技术:
 * 		Cookie
 * 				存储在浏览器端
 * 
 * 使用步骤:
 * 		1)在服务器端:
 * 			创建Cookie对象
 * 			public Cookie(String name, String value)
 * 			Cookie c = new Cookie(String name,String value)
 * 
 * 		2)Cookie信息保存在浏览器端:服务器将cookie响应给浏览器端
 * 		public void addCookie(Cookie cookie):将cookie添加响应中
 * 
 * 	
 * 		3)下一次:浏览器向服务器发送请求:
 *    就会将上一次携带的cookie数据,来访问服务器
 *    		后台获取数据所有的cookie数据
 *    HttpServletRequest
 *    	public Cookie[] getCookies():获取当前浏览器请求的所有的cookie信息(cookie数组)
 * 
 * 		Session技术
 * 
 *
 */


@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		//第一次浏览器访问服务器端:没有cookie数据
		//服务器端:创建Cookie对象
		//public Cookie(String name, String value)
		Cookie cookie = new Cookie("msg","hello_Cookie") ;
		
		//2)需要将cookie对象添加到响应中
		//public void addCookie(Cookie cookie):将cookie添加响应中
		response.addCookie(cookie); //浏览器会将服务器响应的cookie对象保存起来
		System.out.println("服务器响应成功,将cookie已经发携带到浏览器端");
		
		
		//3)当浏览器第二次访问的时候:
		//就可以携带Cookie数据到服务器端
		//请求对象获取所有的请求的信息(cookie)
//		public Cookie[] getCookies()
		Cookie[] cookies = request.getCookies() ;
		if(cookies !=null) {
			for(Cookie c :cookies) {
				//获取当前cookie的名称和cookie的内容
//				public String getName()
				//public String getValue()
				String name = c.getName() ;
				String value = c.getValue() ;
				System.out.println(name+"---"+value);
				System.out.println("获取到了cookie内容");
			}
		}else {
			System.out.println("当前没有cookie内容...");
		}
	
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 
 * 
 * Cookie的使用过程:
 * 	1)当前第一次请求服务器:  第一次没有cookie数据(浏览器端没有cookie数据 的)
 * 		http://localhost:8080/Cookie_Session_Jsp/CookieDemo1
 * 		服务器端:创建当前url-pattern=CookieDemo1的Servlet对象(反射的方式)
 * 		通过反射的方式调用doGet(....)
 * 		
 * 		解析:方法体的内容
 * 			Cookie c = new Cookie("msg","hello") ; //在内存创建Cookie对象
 * 	
 * 		将当前Cookie对象添加到响应信息
 * 				response.addCookie(c) ;
 * 		相当于:<===>
 * 				设置一个响应头
 * 				response.setHeader("Set-Cookie","msg=hello") ;
 * 
 * 		携带到浏览器端存储起来
 * 		Set-Cookie: msg=hello
 * 
 * 	 2)当前浏览器第二次请求服务器的时候:
 * 		http://localhost:8080/Cookie_Session_Jsp/CookieDemo1
 * 		
 * 		将上面的存储的cookie的名称和内容添自动添加到请求头中
 * 			
 * 		Cookie: msg=hello
 * 
 * 	3)浏览器发送请求到服务器端
 * 			后台可以通过请求对象获取所有的cookie的数据
 * 			request.getCookie()----->Cookie[] cookies
 * 
 * 
 * public void setMaxAge(int expiry):设置Cookie的最大存活时间:单位为秒!
 * 
 * 
 * public void setPath(String uri):设置Cookie的有效路径
 * 		
 * 当前设置成指定有路径,cookie才起作用,一般默认就是下文路径 /xxxweb工程名称
 */

@WebServlet("/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		//第一次浏览器访问服务器端:没有cookie数据
		//服务器端:创建Cookie对象
		//public Cookie(String name, String value)
		Cookie cookie = new Cookie("msg","张三") ;
		
		
		//默认的会话结束时间:就是浏览器关闭的时候!
		//设置cookie的最大存活(生存)时间
		//public void setMaxAge(int expiry)
		cookie.setMaxAge(60*60*24*30);//一个月
		
		//2)需要将cookie对象添加到响应中
		//public void addCookie(Cookie cookie):将cookie添加响应中
		response.addCookie(cookie); //浏览器会将服务器响应的cookie对象保存起来
		System.out.println("服务器响应成功,将cookie已经发携带到浏览器端");
		
		
		//3)当浏览器第二次访问的时候:
		//就可以携带Cookie数据到服务器端
		//请求对象获取所有的请求的信息(cookie)
//		public Cookie[] getCookies()
		Cookie[] cookies = request.getCookies() ;
		if(cookies !=null) {
			for(Cookie c :cookies) {
				//获取当前cookie的名称和cookie的内容
//				public String getName()
				//public String getValue()
				String name = c.getName() ;
				String value = c.getValue() ;
				System.out.println(name+"---"+value);
				System.out.println("获取到了cookie内容");
			}
		}else {
			System.out.println("当前没有cookie内容...");
		}
	
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * 一次发送多个cookie数据
 *
 */
@WebServlet("/CookieDemo3")
public class CookieDemo3 extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		//创建Cookie对象
		Cookie c1 = new Cookie("msg1","lisi") ;
		Cookie c2 = new Cookie("msg2","wangwu") ;
		Cookie c3 = new Cookie("msg3","zhaoliu") ;
		
		//添加到响应头中
		response.addCookie(c1); 
		response.addCookie(c2); 
		response.addCookie(c3); 
		
		
		//获取数据
		Cookie[] cookies = request.getCookies() ;
		if(cookies!=null)
			for(Cookie cookie :cookies) {
				//通过cookie对象获取名称和内容
				String cookieName = cookie.getName() 	;
				String cookieValue = cookie.getValue() ;
				System.out.println(cookieName+"----"+cookieValue);
		}else {
			System.out.println("没有cookie数据");
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 使用Cookie记住用户上一次访问的系统时间
 * 
 * 分析:
 * 		设置响应的编码格式:
 * 		1)先获取当前cookie数据,request.getCookies()--->Cookie[]
 * 			
 * 		1.1)如果Cookie数组中不为null并且当前cookie数组的 长度>0 ,说明名称cookie
 * 				并且判断:当前cookie的名称 是否为  指定的名称 "lastTime"
 * 
 * 				//创建日期对象Date对象							"lastTime","2020-11-23 HH:mm:ss"
 *				使用SimpleDateFormat对象格式Date----String 日期文本
 *				
 				//将当前String日期文本格式:加密   URLEncoder
 				设置cookie有效期:一个月
 				通过Cookie的setValue(String value):设置value
 				发送浏览器端
 				 提示:用户上一次访问的系统时间是:  value 
 				 
 				 
 		2)如果当前Cookie数组为null或者长度=0
 			说明第一次访问
 				
 			直接创建Date对象  
 			使用SimpleDateFormat对象进行格式化操作----String 日期文本格式
 			创建Cookie对象		名称"lastTime",上面日期文本格式
 			设置cookie存活时间: 一个月
 			发送到浏览器端:response.addCookie(Cookie对象)
 			
 			response.getWriter().write("<h1>欢迎第一次访问,当前系统时间是: +cookie对象.getValue()</h1>")
 */




@WebServlet("/test")
public class CookieTest extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		
		//设置响应的中文乱码
		response.setContentType("text/html;charset=utf-8");
		
		//获取cookie数据:判断返回值中是否有值
		Cookie[] cookies = request.getCookies() ;
		// CookieUtils工具类: 
		//public static String getCookie(HttpServletRequest request,String cookieName)
		//定义标记:开始没有数据 (没有cookie数据)
		boolean flag = false ;
		
		//不是第一次访问
		if(cookies!=null && cookies.length>0) {
			if(cookies!=null) {
//				遍历 获取cookie数据
				for(Cookie cookie :cookies) {
					//获取内容
					//cookie的名称: lastTime
					String name = cookie.getName() ;
					//判断当前名称是否和lastTime一致
					if("lastTime".equals(name)) {
						
						//更改标记
						flag = true ;//表示存在数据
						
						//创建日期对象
						Date date = new Date() ;
						//将日期对象格式化
						SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
						String date_str = sdf.format(date) ; //日期文本:中间有空格(cookie不能存储空格字符)
						System.out.println("加密之前:"+date_str);
						//加密 :加密工具:URLEocoder
						 date_str = URLEncoder.encode(date_str, "utf-8") ;
						//加密之后
						 System.out.println(date_str);
						//设置cookie的内容
						cookie.setValue(date_str);
						
						//设置cookie的有效时间
						cookie.setMaxAge(60*60*24*30); //一个月
						//写回浏览器端:response
						response.addCookie(cookie);
						
						//获取内容
						String value = cookie.getValue() ;
						System.out.println("解密之前:"+value);
						
						//通过URLDecoder:工具类进行解密
						value = URLDecoder.decode(value, "utf-8") ;
						//提示
						response.getWriter().write("<h3>欢迎回来,您上一次访问的系统时间是:"+value+"</h3>");
						
						//提示:当前系统时间是....
					}
					
					
				}
				
			}
			
		}
		
		
		//另一种情况:获取的cookie数组长度为0或者是内容为null (没有"lastTime")
		//第一次访问
		if(cookies ==null || cookies.length ==0 || flag ==false) {
			//第一次访问
			//系统时间
			Date date = new Date() ;
			
			//格式化
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
			String str = sdf.format(date) ;
			//加密
			str = URLEncoder.encode(str, "utf-8") ;
			
			System.out.println(str);
			//创建Cookie对象:
			Cookie c = new Cookie("lastTime", str) ;
			//设置存活时间
			c.setMaxAge(60*60*24*30); //一个月
			
			//写回
			response.addCookie(c);
			//提示
			response.getWriter().write("<h3>您好,您是首次访问,时间是:"+URLDecoder.decode(c.getValue(), "utf-8")+"</h3>");
			
		}
		
		
		
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

CookieUtils

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

/**
 * 获取指定cookie内容的工具类
 *
 */
public class CookieUtils {
	
	
	public static String getCookie(HttpServletRequest request,
			String cookieName) {
		//获取所有的cookie数据
		Cookie[] cookies = request.getCookies() ;
		if(cookies!=null) {
			for(Cookie cookie :cookies) {
				if(cookieName.equals(cookie.getName())) {
					//获取当前cookie名称对应的内容
					return cookie.getValue() ;
				}
			}
		}
		return null ;
	}
	
	public static void main(String[] args) {
		//CookieUtils.getCookie(request, "lastTime")
	}
	
	
}

1.2.1_Session

Cookie和Session进行对比

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 * Cookie和Session进行对比
 * 
 * Cookie特点
 * 	1)存储在浏览器端
 * 	2)存储的内容都只能是String类型:
 * 		存储中文(特殊符号:空格 必须使用URLEncoder/URLDecoder:进行加密和加密)
 *  3)cookie存储的数据量有限制:一个站点:20-30cookie左右
 *  4)cookie相对:不太安全
 *  
 *  
 *  Session:
 *  	1)存储在服务器端
 *  	2)存储的内容可以是任意类型的数据
 *  		  因为它是一个域对象:可以进行数据共享
 *  			setAttribute(String name,Object obj)
 *  	3)Session存储的数据没有限制的 
 *  4)相对cookie:session更安全
 *  
 *  Session依赖于Cookie存在   
 *  		标识:JSESSIONID
 *  
 *  HttpSession:  
 *  			可以作为域对象
 *  
 *  
 *  sesison对象在内存默认的时间:30分钟
 *  tomcat的安装目录
 *  		web.xml文件
 *  			配置 :defaulServelt
 *         session过期时间
 *    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    
 */
@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, 
			HttpServletResponse response) 
					throws ServletException, IOException {
		//创建HttpSession对象:
		//getSession():通用方法:获取Session对象 (推荐),如果没有session对象,会创建session对象
		
		//getSession(boolean create)
		//如果参数为true:创建创建一个新的会话
		//如果false:说明当前请求过程会话对象存在
		HttpSession session = request.getSession() ;
		
		//public void setAttribute(String name, Object value):给Session对象设置属性以及绑定的参数值
		List<String> list = new ArrayList<>() ;
		list.add("张三") ;
		list.add("李四 ") ;
		list.add("赵博") ;
		session.setAttribute("list", list);
		
		System.out.println("存储成功了....");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *  public void setMaxInactiveInterval(int interval):单位秒
    设置session最大的有效时间
 *
 */
@WebServlet("/SessionDemo3")
public class SessionDemo3 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, 
			HttpServletResponse response) throws ServletException, IOException {
		//用户第一次访问后台Servlet:创建Session对象
		HttpSession session = request.getSession() ;
		System.out.println(session);
		//org.apache.catalina.session.StandardSessionFacade@629b1485
		
		//设置session超时时间
		/**
		 * session的销毁
		 * 1)tomcat正常关闭
		 * 2)设置的超时时间(有效时间)时间到了
		 * 3)手动删除session
		 *  
    public void invalidate():手动删除session  
		 */
		session.setMaxInactiveInterval(600); //单位秒
		//如果为负整数/0:永远不会超时!
		
	
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/SessionDemo4")
public class SessionDemo4 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//Session依赖于Cookie存在
		//Cookie:的名称:
		//JSESSIONID	
		//获取session
		HttpSession session = request.getSession() ;
		System.out.println(session);
		System.out.println(session.getId());
		
		//创建Cookie对象
		//HttpSession
		//获取当前唯一id的标识符   public String getId();
		Cookie cookie = new Cookie("JSESSIONID", session.getId()) ;
		
		//设置cookie的有效期
		cookie.setMaxAge(60*60*24);
		//写回浏览器端
		response.addCookie(cookie);
		System.out.println("cookie已写回...");
		
		
		System.out.println("---------------------------");
		
		//session对象设置属性
		session.setAttribute("name", "eric");
		System.out.println("设置数据完毕!");
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

//手动删除session:将session对象销毁掉
@WebServlet("/SessionDemo5")
public class SessionDemo5 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取session对象
		HttpSession session = request.getSession() ;
		System.out.println("获取session对象了...");
		 
		//判断session是否为空
		if(session!=null) {
			String str = (String) session.getAttribute("name") ; 
			//有数据
			//手动删除session
			session.invalidate();
			
			System.out.println(str); //null
		}else {
			System.out.println("session已经销毁了...");
		}
		
		System.out.println("session销毁了");	
	}

	/**
	 * @;see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

2._JSP

2.1_Jsp简介

什么是JSP:Java Server Page:Java服务页面 能够编写Java代码html页面

在当前jsp页面上,可以使用java语言处理

Jsp:Java Server Page: Java服务页面   能够编写Java代码html页面

在当前jsp页面上,可以使用Java语言处理业务的需求!
本质是什么:
		结论:本质就是一个 Servlet
		
		
<%

		Jsp脚本:能够编写Java代码
%>

<%--
	Jsp的脚本注释:不会被解析
	@page :page指令: 指定相关jsp页面的属性
		
 --%>
 
 
 
 xxx_jsp.java extends  org.apache.jasper.runtime.HttpJspBase extends  
 	javax.servlet.http.HttpServlet
 	
 	
 这个Jsp的本质就是Servlet
 
 
 
 写好的jsp文件
 
 	经过两个阶段:
 	http://localhost:8080/Cookie_Session_Jsp/xxx.jsp
 		1)翻译阶段
 		将xxx.jsp文件---->翻译成 xxx_jsp.java文件
 	生命 周期
 	
 		_jspInit()	:Jsp的初始化 
 				访问jsp页面:创建Jsp对象
 		
 		_jspService(final javax.servlet.http.HttpServletRequest request,final javax.servlet.http.HttpServletResponse response	)
	
			//解析jsp中body内容
			
		_jspDestroy()
			销毁方法
				服务器正常关闭的时候销毁!
				
				
	编译成:class:
		xxx_jsp.java-----xxx_jsp.class文件  (反射的方式调用初始化,服务,以及销毁的方法)
				
				
	
	
el----表达式就是替代了<%=%>jsp输出表达式

${pageScope.属性名称}    	===等价于  <%=pageContext.getAttribute("属性名称")%>
${requestScope.属性名称}    ===等价于  <%=request.getAttribute("属性名称")%>
${sessionScope.属性名称} 	 ===等价于  <%=session.getAttribute("属性名称")%>
${applicationScope.属性名称} ===等价于  <%=application.getAttribute("属性名称")%>
Jsp中四个域对象								类型
	page域			pageScope					pageContext	
	request域		requestScope				HttpServletRequest
	session域		sessionScope				httpSession
	application域	applicationScope			ServletContext
				
<%@ page language="java" import="java.util.Date" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>这是我第一个Jsp页面</title>
</head>
<body>
	<%
		//创建日期对象
		//局部变量
		Date date = new Date() ;
		System.out.println(date) ;
	%>
	<%!
		//全局变量
		int i = 100 ;
		
	%>
	<%=i %>
	
	<!-- 
		html注释
	 -->
<%--
	Jsp的输出表达式
 --%>
 <%=date %>
</body>
</html>

2.2_Jsp的执行流程

1)发送请求到服务器http://localhost:8080/xxx/xx.jsp
2)服务器解析路径:xx.jsp
3)然后对xxx.jsp----将jsp文件翻译成Java文件------
	保存在tomcat安装目录下面的work
		 Catalina
		 localhost
			本地上所有的jsp文件
			xxx.java (向浏览器输出内容:JspWriter.write("\r\n..") 拼接所有的内容.)
			jsp里面局部变量:_jspService()
				<%
				int i = 100 ;
				%>
				<%! 
				int num =20 ;
				%>
														
4)能够运行Java文件---就必须编译----->
包名.类名	反射技术
	举例:
	org.apache.jsp.el._02_005fel_jsp   ----获取当前类的字节码文件对象  
					创建该类实例
					获取Method----调用_jspService()

2.3_Jsp的使用

jsp的脚本:
<% java代码的 %>
<%= jsp的输出表达式 %>

<%!-- jsp的注释 --%>  <!--html注释-->html注释在jsp中慎用:会被解析出来


2.4Jsp三大指令9大内置对象

Jsp三大指令
@page
	很多属性
	import属性
	pageError
	content-type编码格式
@include	  静态导入:导入jsp页面
@taglib---	需要结合:jstl(jsp核心标签库一块使用)  
----- 导入jstl.jar+stared.jar


在jsp页面中引入jsp的核心标签库
 <c:if>
 <c:foereach>
 
 
 
 Jsp9大内置对象
 
 
 
Jsp中的四个域对象分别是什么
		pageScope				pageContext
		requestScope			HttpServletRequest
		sessionScope			HttpSession
		applicationScope		ServletContext

2.4.1_@page指令:

page指令:
	language属性:只支持Java语言
	contentType:文本类型:html格式:utf-8(响应的文本内容)
	pageEncoding:当前jsp的默认编码格式:指定utf-8
	buffer:当前使用流的缓冲大小 默认8kb(了解)
	errorPage:当前jsp页面如果发生异常了,就跳转到错误页面上
	isElIgnored:是否忽略el表达式:默认值是false(不忽略)true(表示忽略)
		el表达式
			就为了书写简单:替代jsp表达式
			通用写法${域对象.属性名称}
			
	session:是否启用session true:不启用 false:启用
	
	isErrorPage:指定当前页面是否错误页面
<!--
	三大指令
	page指令
  
  language属性:只支持Java语言
  contentType:文本类型:html格式:utf-8 (响应的文本内容)
  pageEncoding:当前jsp的默认编码格式:指定utf-8
 
  buffer:当前使用流的缓冲大小 默认8kb(了解)
  
  errorPage:当前jsp页面如果发生异常了,就跳转到 错误页面上
  
  isELIgnored:是否启用el表达式: 默认值是false(不忽略)
  					true:表示忽略
  		el表达式
  				就为了书写简单:替代jsp表达式
  				通用写法:${域对象.属性名称}
  				
  				
  session::是否启用session
  			true:不启用
  			false:启用session
  			
  isErrorPage:指定当前页面是否错误页面
  		
  -->
<%@ page language="java" import="java.util.*" buffer="8kb" 
errorPage="error.jsp"
 contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"
    isELIgnored="false"
    session="false"
    isErrorPage="false"
    %>
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
	<%
		List<String> list = new ArrayList<String>() ;
		
		//int i = 10 / 0 ;
	
		list.add("hello") ;
		list.add("world") ;
		
		//将list集合存储到request域中
		request.setAttribute("list",list);
		
		//创建Session对象
		HttpSession session = request.getSession() ;
		System.out.println(session) ;
	%>
	<%=list %><%--
			等价于:response.getWriter().wrtie("xxx") ;
			本质:流: 字符流打印流 
			
	 --%>
	 <hr/>
	 
	 <%--
	 	没有使用EL表达式之前的写法:
	 	使用jsp输出 
	  --%>
	  <%=request.getAttribute("list") %>
	  <hr/>
	 ${requestScope.list}
	 
	 <hr/>
	 <%--
	 	el表达式:直接输出域对象中存储的属性名称
	  --%>
	  ${list }
</body>
</html>

2.4.2_@include指令:静态包含

include指令:静态包含
	静态包含:
		不会单独针对被包含jsp进行翻译和编译
	动态包含:jsp的动作标签库
		jsp:include:会单独针对被包含的jsp进行翻译和编译
	@include指令:
		file属性:被包含的jsp页面"/"---webContent
		
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
 <%--
	静态包含:
			不会单独针对被包含jsp进行翻译和编译 (比较节省内存空间)
			
	而动态包含:jsp的动作标签库
			jsp:include:会单独针对被包含的jsp页面进行翻译和编译
			
	@include指令:
			file属性:被包含的jsp页面  "/"----webContent
--%>


<%@include file="/include/header.jsp" %>
<%@include file="/include/footer.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>静态包含</title>
</head>
<body>
<!-- jsp的动作标签库:
	转发到指定页面  page属性:指定页面地址
 
 include:动态包含  page:被包含的页面地址
 -->
<%-- 
<jsp:forward page=""></jsp:forward>
<jsp:include page=""></jsp:include>
 --%>

</body>
</html>

2.4.3_@taglib指令结合jstl去使用

c:if  
    test="${判断}" 
    
c:choose
   c:when test="xxx"
   
   c:otherwise
   

常用:遍历
c:foreach  
   类似普通for循环
	begin
	end
	step:步长语句
	var:循环中的变量
	varStatus:status  
				index:获取索引号
				count:获取序号
				
  c:foreach   另一种用法 (常用的)
  	items="${属性名称}" var="p" 循环中变量名 varStatus="status"
      从后台获取数据,展示数据(遍历)		
 			${p.属性}
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%--
	jsp第三个指令
	taglib指令
	
	    引入jstl核心jar包以及标准jar包
	    
	    jstl	:核心标签库
	    
	         核心库:core   
	        函数库:function..
	    sql语句:sql库
 --%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>jstl引入</title>
</head>
<body>
<%
	//给request域对象中存储一些list数据
	List<String> list = new ArrayList<String>() ;
	//添加数据
	list.add("hello") ;
	list.add("world") ;
	list.add("javaEE") ;
	
	request.setAttribute("list",list) ;
	
	request.setAttribute("number", 7) ;
%>
<%--
	c:if标签:jstl判断语句 
	  属性:test			结合el表达式去使用  ${属性名称 判断表达式}
	  						结果是true,执行c:if标签的语句体;如果false,不执行标签体
	  						
	  		注意事项:
	  					没有c:else标签	
	  							针对两种结果进行判断:必须写两次c:if			
	  		
 --%>
<c:if test="${number %2== 0}">
		<h3>当前number是偶数</h3>
</c:if>
<c:if test="${number %2!=0 }">
	<h3>当前number是奇数</h3>
</c:if>

<hr/>
<%--
		c:if标签中:
	test属性:   关键字 empty 判断集合/数组是否为空 (判断对象)
		test=${not empty 属性名称}  判断当前属性绑定的对象不为空  :
					true  执行语句体,否则不执行
		test=${empty 属性名称}:判断当前属性绑定的对象为空:
			true执行语句体,否则不执行
 --%>
<c:if test="${not empty list }">
		<h3>当前集合不为空存在数据!</h3>
</c:if>
<c:if test="${empty list }">
	<h3>当前集合为空!</h3>
</c:if>
</body>
</html>

2.5使用EL表达式替代了jsp的输出表达式

<%= jsp的输出表达式 %>

格式:
{域对象.属性}
EL表达式的一些使用
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>el表达式</title>
</head>
<body>
<%
	//给page域中存储属性以及内容
	pageContext.setAttribute("name1", "张三") ;
	//给Request域中存储属性以及内容
	request.setAttribute("msg", "helloEL") ;
	//给session存储内容
	session.setAttribute("name2", "李四") ;
	//给application域中存储内容
	application.setAttribute("msg2", "Javaee") ;
%>

<hr/>

${pageScope.name1 }  <br/>
${requestScope.msg}  <br/>
${sessionScope.name2} <br/>
${applicationScope.msg2 }<br/>



</body>
</html>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>el表达式</title>
</head>
<body>
<%
	//给page域中存储属性以及内容
	//pageContext.setAttribute("name1", "张三") ;
	//给Request域中存储属性以及内容
	//request.setAttribute("name1", "helloEL") ;
	 //给session存储内容
	session.setAttribute("name1", "李四") ;
	//给application域中存储内容---servletContext
	application.setAttribute("name1", "Javaee") ; 
%>


<%--
	现在使用el表达式直接书写属性名称
	就会在当前所有的域对象中寻找名称是否为name1数据,
	从小到大的范围找 ----->findAttribute("属性"):范围最小存在这个值就直接使用!

	简写方式
		${属性}
		
 --%>
 
 ${name1}
</body>
</html>
<%@ page language="java" import="com.qf.entity.User" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>javabean导航</title>
</head>
<body>
<%
	//创建User对象
	User user = new User() ;
    user.setName("张三") ;
    user.setPassword("123456") ;
    
    //将user对象存储到request对象
    request.setAttribute("user", user) ;
 %>
 <%--
 	jsp的el表达式:可以直接操作javaBean属性
 	${属性名称.去掉get方法名的前缀将后面首字母小写去掉()}   
 	相当于:属性名.getName() 
 	      属性名称.getPassword() 
 
  --%>
  ${user.name }   -    ${user.password }
 
</body>
</html>

2.6_jstl核心标签库中常用的标签

c:if  
    test="${判断}" 
    
c:choose
   c:when test="xxx"
   
   c:otherwise
   

常用:遍历
c:foreach  
   类似普通for循环
	begin
	end
	step:步长语句
	var:循环中的变量
	varStatus:status  
				index:获取索引号
				count:获取序号
				
  c:foreach   另一种用法 (常用的)
  	items="${属性名称}" var="p" 循环中变量名 varStatus="status"
      从后台获取数据,展示数据(遍历)		
 			${p.属性}
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%--
	引入jsp的核心标签库
 --%>
 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>choose标签</title>
</head>
<body>
<%
	//给request域对象中存储整数
	request.setAttribute("number", 3) ;
%>
<%--
		jsp中的c:choose标签 类似于 Java中选择结构语句
				<c:choose>
						<c:when test="${xxx}">标签体1</c:when>
						<c:when test="${xxx}">标签体2</c:when>
						<c:when test="${xxx}">标签体3</c:when>
						<c:otherwise>标签体n</c:otherwise>
				</c:choose>
				
				c:choose: 相当于Java中的switch语句
						c:when:相当于switch语句中的case语句
						c:otherwise:相当于switch语句default语句
	el表达式:本身操作运算符
			比较运算符(使用居多)
			算术运算符
			逻辑运算符...
 --%>
<c:choose>
	<c:when test="${number== 1 }">星期一</c:when>
	<c:when test="${number== 2 }">星期二</c:when>
	<c:when test="${number== 3 }">星期三</c:when>
	<c:when test="${number== 4 }">星期四</c:when>
	<c:when test="${number== 5 }">星期五</c:when>
	<c:when test="${number== 6}">星期六</c:when>
	<c:when test="${number== 7}">星期日</c:when>
	<c:otherwise>对不起,没有匹配的结果!</c:otherwise>
</c:choose>

</body>
</html>
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%--
	导入jstl核心标签库
 --%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>foreach标签</title>
</head>
<body>
<%--
		c:foreach标签: 类似于Java中的普通for循环
						for(int x = 1; x <=10 ; x ++){....}
		
				1)基本的用法:当前普通循环使用
					属性
						var:循环中的变量名
						begin:开始循环中的数据
						end:结束时候的数据值
						
						step:步长语句
						varStatus:循环中的变量的状态 status
								内置的属性count:序号
								  index:索引
						
						
						

 --%>
 <c:forEach var="i" begin="1" end="10" varStatus="status">
 	<%-- c:foreach标签体中
 		需要使用el表达式获取里面的循环中的数据
 	 --%>	
 	 
 	 	${status.count}		- 	${i }	 <br/>
 </c:forEach>
 
 <hr/>
 
 <%--
 	2)另外一种用法:
 			获取后台携带集合数据(请求转发过来的数据),将集合数据的内容遍历出来
 			
  --%>
  <%
  			//创建List集合数据
  			List<String> list = new ArrayList<String>() ;
  			//给集合中添加数据
  			list.add("JavaEE") ;
  			list.add("Python") ;
  			list.add("PHP")  ;
  			list.add("Go") ;
  			
  			//存储request域中:
  			request.setAttribute("name", list) ;
  			
  	
 %>
 <%--
 	items属性:
 			从域对象获取属性绑定的内容  ${属性名称}
 	var:循环中的变量名
 	varStatus:循环中变量的状态
 			属性值.count:序号
 			属性值.index:索引
 	
  --%>
 <c:forEach items="${name }" var="p" varStatus="status">
        ${status.count }	-	 ${p } <br/>
 </c:forEach>
 
</body>
</html>

2.7针对MVC设计思想—代码分层

M:model
V:view
C:Contoller
   web层  
         servlet----springmvc
         	接收参数
         	调用service
         	调用dao层
         	返回获取结果数据
         	
           请求转发/重定向



MVC:架构思想
M:model:模型	
		业务数据
V:view:视图层
C:Contoller:控制层

	servlet+jsp:最佳实践
	
servlet:不应该输出页面
jsp:不应该写大量的java代码



数据库的设计:
实体类:
	com.work.entity
		Product
		
	com.work.web
		ProductContoller
	
	com.work.service
		业务接口层
		
	com.work.service.impl
		业务接口实现层
		
	com.work.dao
		ProductDao:数据访问接口层
		
	com.work.dao.impl
		ProductDao.impl:数据的访问接口实现层	

2.8_过滤器:Filter

过滤器:----JavaWEB三大组件之一

程序中的过滤器:
	执行通用的操作
一般应用场景:
	登录的使用
	解决全局乱码问题
	
过滤器:
	两种配置方式
	1)注解方式
		@WebFilter
	2)web.xml文件配置方式
	<filter>
		<filter-name></filter-name>
		<filter-class></filter-calss>
	</filter>
	<filter-mapping>
   		过滤器名称
   		<url-pattern>/xxx.jsp/.html</url-pattern>
   	</filter-mapping>
<!-- Filter的xml配置方式 -->
   <!--过滤器的基本配置  -->
   <filter>
   	<filter-name>FilterDemo2</filter-name>
   	<filter-class>com.qf.filter_01.FilterDemo2</filter-class>
   </filter>
    <!--  
   
   	服务器启动的时候
  	 http://localhost:8080/Jsp_Filter/xxx.jsp 
   
   		//被过滤器拦截-web.xml找到url--pattern
   		就要找到对应过滤器名称
   		基本配置  ----FilterDemo
   		
   		filter-class 
   		       com.qf.filter_01.FilterDemo2
   		       
   		     Class clazz = Class.forName(" com.qf.filter_01.FilterDemo2") ;
   			//创建该类对象
   			Object obj = clazz.newIntance() ;
   			//获取Method
   			Method m = clazz.getMethod("init",FilterConfig.class) ;
   			m.invoke(obj,fConfig) ;
   			
   			....
   -->
  
   <!--过滤器的映射配置  -->
   <filter-mapping>
   	<filter-name>FilterDemo2</filter-name>
   	<url-pattern>/*</url-pattern>
   </filter-mapping>




过滤的过滤方式

<filter>
	<filter-name>xx</filter-name>
	<filter-class>xx</filter-class>
</filter>
<filter-mapping>
	<filter-name>xx</filter-name>
	<url-pattern>xx</url-pattern>
	<dispatcher>REQUEST</dispatcher>
</filter-mapping>
url-pattern
	
	@WebFilter("/xx")
			属性
					String[] value() ;
					String[] url-patterns() ;
					
配置方式
		1)具体的路径  :只要当前请求到具体的jsp页面的时候,过滤器才会被执行!
				/index.jsp
				/xxx.jsp
		2)指定目录  :当前请求"/user/updatServlet"的时候,过滤器才会被执行
				/user/findAllServlet
				/user/updateServlet
				
		3)指定后缀名的方式: 只有当请求后缀名为.jsp的时候,过滤器的会被执行
				*.jsp   
				
		4)通用方式: /*  :
				请求所有的地址,过滤器都会被执行 (全局的乱码操作!)  
				
				
				
Filter里面过滤的方式

@WebFilter里面的属性
DispatcherType[] dispatcherTypes()  
返回值DispatcherType 枚举类型
	public enum DispatcherType {
      REQUEST,  ---默认: 直接请求的时候,过滤器作用
      FORWARD,   ---  请求转发页面跳转的时候,过滤器器起作用

    INCLUDE,   --- 某个页面被包含的时候,过滤器会被执行
    ASYNC,     --- 非同步请求的时候,过滤器会被执行
    ERROR     ---  错误页面跳转,过滤器会被执行
}
			
过滤链:
	执行多个过滤器
	
	过滤器1 和过滤器2
	
@WebFilter("/xx.jsp*")
class FilterDemo5

@WebFilter("/xx")
class FilterDemo6


AFilter				BFilter   注解的方式:多个过滤器:类名的每一个字符进行比较,小的先执行,大的后执行!
					
filterDemo5进来了...  
FilterDemo6执行了...
index.jsp
FilterDemo6回来了...
filterDemo5回来了..	

过滤器的应用场景:
执行一写通用的操作

	1)登录的过滤
	2)解决web工程下所有的资源乱码问题 


import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * 手动方式
 * 1)自定义一个类  实现Filter接口 重写三个方法
 * 2)方式
 * 		注解方式
 * 	@WebFilter("/*")
 * 
 * 3)在测试doFilter方法
 */
//@WebFilter("/*")
public class FilterDemo1 implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		
	}
	
	//过滤的方法
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		//针对请求Request做一些增强
		
		System.out.println("FileDemo1进来了。。");
		
		//放行....
		chain.doFilter(request, response);
		
		//可以针对响应对象Response对象做一些增强
		
		System.out.println("FileDemo1回来了....");
	}

	@Override
	public void destroy() {
		
	}

}

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
/**
 * 直接使用自带插件
 * 
 * 直接生成Filter类
 *
 */

//@WebFilter("/*")
public class FilterDemo2 implements Filter {

	//销毁
	public void destroy() {
	}

	
	//过滤
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		System.out.println("FilterDemo2执行了...");
		//放行
		chain.doFilter(request, response);
		
		System.out.println("FilterDemo2回来了...");
	}
	
	//初始化
	public void init(FilterConfig fConfig) throws ServletException {
	}

}

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

//当我们访问index.jsp,过滤器才会执行
//@WebFilter("/index.jsp") //:只要当前请求到具体的jsp页面的时候,过滤器才会被执行!

public class FilterDemo3 implements Filter {

	//无参构造方法
	/**
	 * 在服务器启动的时候,创建了该过滤器对象
	 * 其实就是反射创建该类实例的
	 */
    public FilterDemo3() {
    	System.out.println("Filter对象创建了...");
    }

    /**
     * 初始化 仅仅执行一次
     */
    public void init(FilterConfig fConfig) throws ServletException {
    	System.out.println("init...");
	}

	/**
	 *过滤
	 *当前请求的是地址:index.jsp,过滤器执行了
	 *进来之后,执行 "filter执行了"  
	 *       一旦放行-----访问资源文件
	 *       
	 * 再次回到过滤任务中
	 * 
	 * doFilter:可以执行多次
	 *
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

		System.out.println("filter执行了...");
		//通过request对象完成一些需求
		
		//放行
		chain.doFilter(request, response);
		//可以通过response对象完成一些需求
		//回来
		System.out.println("filter回来了...");
	}

	
	/**
	 * 销毁
	 *  执行一次:正常关闭服务器  
	 *     将过滤器的对象从内存中回收掉!
	 */
	public void destroy() {
		System.out.println("destroy...");
	}

}

import java.io.IOException;

import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

//@WebFilter(value="/user/FindAllServlet",dispatcherTypes=DispatcherType.REQUEST) //拦截所有   /user/FindAllServlet
//指定目录  :当前请求"/user/updatServlet"的时候,过滤器才会被执行

//如果过滤方式:DispatcherType.FORWARD :请求转发到某个页面的时候,过滤器才被执行
/*@WebFilter(value="/index.jsp",
	dispatcherTypes=DispatcherType.FORWARD)*/

//如果当前index.jsp是通过请求转发过来,这个时候过滤器被执行

//@WebFilter(value="/index.jsp",
//dispatcherTypes=DispatcherType.REQUEST) //直接访问jsp,过滤器就被执行


//请求转发到index.jsp或者直接访问的index.jsp,过滤器会被执行
//@WebFilter(value="/index.jsp",dispatcherTypes= {DispatcherType.REQUEST,DispatcherType.FORWARD})
public class FilterDemo4 implements Filter {


	public void destroy() {
	}
	
	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("FilterDemo4执行了...");
		chain.doFilter(request, response);
	}
	public void init(FilterConfig fConfig) throws ServletException {
	}

}

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter("/index.jsp")
public class FilterDemo5 implements Filter {

	public void destroy() {
	}
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("filterDemo5进来了...");
		
		chain.doFilter(request, response);
		System.out.println("filterDemo5回来了...");
	}
	public void init(FilterConfig fConfig) throws ServletException {
	}

}

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter("/*")
public class FilterDemo16 implements Filter {

    public FilterDemo16() {
    }

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("FilterDemo6执行了...");
		chain.doFilter(request, response);
		System.out.println("FilterDemo6回来了...");
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

2.8.1_Filter的生命周期

xxxFilter implements Filter{
	服务器启动的时候:就会通过创建过滤器对象以及初始化(执行一次)
	init(FilterConfig config){}
	doFilter(ServletRequest req,ServletResponse res,DoChain chain){}
	
}

2.8.2_过滤器的url-pattern的配置

url-pattern
	
	@WebFilter("/xx")
			属性
					String[] value() ;
					String[] url-patterns() ;
					
配置方式
		1)具体的路径  :只要当前请求到具体的jsp页面的时候,过滤器才会被执行!
				/index.jsp
				/xxx.jsp
		2)指定目录  :当前请求"/user/updatServlet"的时候,过滤器才会被执行
				/user/findAllServlet
				/user/updateServlet
				
		3)指定后缀名的方式: 只有当请求后缀名为.jsp的时候,过滤器的会被执行
				*.jsp   
				
		4)通用方式: /*  :
				请求所有的地址,过滤器都会被执行 (全局的乱码操作!)  
				
				
				
Filter里面过滤的方式

@WebFilter里面的属性
DispatcherType[] dispatcherTypes()  
返回值DispatcherType 枚举类型
	public enum DispatcherType {
      REQUEST,  ---默认: 直接请求的时候,过滤器作用
      FORWARD,   ---  请求转发页面跳转的时候,过滤器器起作用
      
   
  
   
   
    INCLUDE,   --- 某个页面被包含的时候,过滤器会被执行
    ASYNC,     --- 非同步请求的时候,过滤器会被执行
    ERROR     ---  错误页面跳转,过滤器会被执行
}
			

2.8.3_过滤链的规则(了解)


过滤链:
	执行多个过滤器
	
	过滤器1 和过滤器2
	
@WebFilter("/xx.jsp*")
class FilterDemo5

@WebFilter("/xx")
class FilterDemo6


AFilter				BFilter   注解的方式:多个过滤器:类名的每一个字符进行比较,小的先执行,大的后执行!
					
			
filterDemo5进来了...  
FilterDemo6执行了...
index.jsp
FilterDemo6回来了...
filterDemo5回来了..	

过滤器的应用场景:
执行一写通用的操作

	1)登录的过滤
	2)解决web工程下所有的资源乱码问题 


3._bootstrap:前端框架

在任何设备上,所有页面:响应式页面 

大屏幕:显示器屏幕分辨率大

中等屏幕

小屏幕

超小屏幕

针对bootstrap:全局CSS样式:图片
class="img-rounded" 
class="img-circle"
class="img-thumbnail"
自适应: 在各个设备(移动设备)
 "img-responsive" 响应式属性

起步---引入css文件.Jquery,js文件

官网
全局cSS样式
   栅格系统
   表格
   表单
  组件;
  	导航条
  	分页条
   
   轮播图:插件
样式:如果想去使用某个样式,看官网里面样式说明
表格样式:
   class="table table-bordered"
   
   
 
全局样式:栅格系统
在外层里面指定页面容器  class="container"
   在内层div  : class="row"    一行12列
   
   		  //使用div分层布局
   		  在不同的设备之间:响应式
   		  class属性: col-设备参数-当前一  所占的格子数/12
   		  
   		  设备参数:
   		    xs:超小屏幕(手机屏幕)
   		    sm: 小屏幕(平板 pad)
   		    md:中等屏幕(一般的桌面显示器)
   		    lg:大屏幕(大显示器)>=1200px
   		    
  
 表单样式
       划分种类
          水平方向表单样式
          基本表单样式
          内联样式表单
          
          用户名                密码     

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="utf-8">
	    <meta http-equiv="X-UA-Compatible" content="IE=edge">
	    <meta name="viewport" content="width=device-width, initial-scale=1">
	    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
	    <title>Bootstrap 101 Template</title>
	
	    <!-- Bootstrap --CSS样式 -->
	    <link href="css/bootstrap.min.css" rel="stylesheet">
		
		 <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
		    <script src="js/jquery-3.2.1.min.js"></script>
		    <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
		    <script src="js/bootstrap.min.js"></script>
	  
	  </head>
		<!-- 
		 
				boostrap前端框架  (会用)------响应式页面
				
				针对各种各样的设备(大屏幕,中等屏幕,小屏幕,超小屏幕) 移动端/web-app
						
				框架
						半成品的工具
						
				三个环境
					1)全局CSS样式   css文件
					2)里面boostrap自带的js库  js文件
					3)依赖于Jquery的js库		jquery
						
			在官网上将组件/插件,引入之后更改!
			
			
						
		 -->
		 <!-- 导入boostrap相关的csss,js,主题,Jquery-->
	
	<body>
		<!-- 
			clsss= "img-responsive"针对图片可以自适应
			class="img-rounded" 图片的四个边角是圆角
			class="img-circle" 图片的圆形
			class="img-thumbnail"相框型的
		 -->
		<img src="img/865816ec969ed2498a22213d56cce952.jpg" class="img-responsive" /> 
		<hr />
		<img src="img/865816ec969ed2498a22213d56cce952.jpg" class="img-rounded img-responsive" />
		<hr />
		<img src="img/865816ec969ed2498a22213d56cce952.jpg" class="img-circle img-responsive" />
		<hr />
		<img src="img/865816ec969ed2498a22213d56cce952.jpg" class="img-thumbnail img-responsive"  />
	</body>
</html>

3.1_boostrap中的其他全局CSS样式

栅格系统 
   分辨率不同:不同设备
 表格
 表单
 
 <!DOCTYPE html>
<html>
<head>
	    <meta charset="utf-8">
	    <meta http-equiv="X-UA-Compatible" content="IE=edge">
	    <meta name="viewport" content="width=device-width, initial-scale=1">
	    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
	    <title>_boostrap之_栅格系统</title>
	
	    <!-- Bootstrap --CSS样式 -->
	    <link href="css/bootstrap.min.css" rel="stylesheet">
		
		 <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
		    <script src="js/jquery-3.2.1.min.js"></script>
		    <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
		    <script src="js/bootstrap.min.js"></script>
	  
	  </head>
	<body>
		<!-- 定义页面容器 -->
		<div class="container-fluid">
				<!-- 定义了了一行 -->
			<div class="row">
				<!-- 
					大屏幕一行12个格子
					小屏幕 一行6个格子
					
				 -->
			<!-- 	 <div class="col-lg-1 col-sm-2 table-bordered">栅格</div>
				 <div class="col-lg-1 col-sm-2 table-bordered" >栅格</div>
				 <div class="col-lg-1 col-sm-2 table-bordered">栅格</div>
				 <div class="col-lg-1 col-sm-2 table-bordered">栅格</div>
				 <div class="col-lg-1 col-sm-2 table-bordered">栅格</div>
				 <div class="col-lg-1 col-sm-2 table-bordered">栅格</div>
				 <div class="col-lg-1 col-sm-2 table-bordered">栅格</div>
				 <div class="col-lg-1 col-sm-2 table-bordered">栅格</div>
				 <div class="col-lg-1 col-sm-2 table-bordered">栅格</div>
				 <div class="col-lg-1 col-sm-2 table-bordered">栅格</div>
				 <div class="col-lg-1 col-sm-2 table-bordered">栅格</div>
				 <div class="col-lg-1 col-sm-2 table-bordered">栅格</div> -->
				 
				 
				 <div class="col-md-4">栅格</div>
				 <div class="col-md-4">栅格</div>
				 <div class="col-md-4">栅格</div>
			</div>
			
			
		</div>
	</body>
</html>

<!DOCTYPE html>
<html>
<head>
	    <meta charset="utf-8">
	    <meta http-equiv="X-UA-Compatible" content="IE=edge">
	    <meta name="viewport" content="width=device-width, initial-scale=1">
	    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
	    <title>_boostrap之_栅格系统</title>
	
	    <!-- Bootstrap --CSS样式 -->
	    <link href="css/bootstrap.min.css" rel="stylesheet">
		
		 <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
		    <script src="js/jquery-3.2.1.min.js"></script>
		    <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
		    <script src="js/bootstrap.min.js"></script>
	  
	  </head>
	<body>
		<!-- 
			class属性
				btn btn-default:默认样式(没有任何特殊颜色标记)
		 -->
		<a class="btn btn-default" href="#" role="button">登录</a>
		<button class="btn btn-default" type="submit">注册</button>
		<input class="btn btn-default" type="button" value="Input">
		<input class="btn btn-default" type="submit" value="Submit">
		
		<hr />
		<hr />
		
		<!-- 
			按钮的预定义样式
			
			btn btn-primary
			btn btn-success
			btn btn-danger
			btn btn-warning
		 -->
		
		<!-- Standard button -->
		<button type="button" class="btn btn-default">(默认样式)Default</button>
		
		<!-- Provides extra visual weight and identifies the primary action in a set of buttons -->
		<button type="button" class="btn btn-primary">(首选项)Primary</button>
		
		<!-- Indicates a successful or positive action -->
		<button type="button" class="btn btn-success">(成功)Success</button>
		
		<!-- Contextual button for informational alert messages -->
		<button type="button" class="btn btn-info">(一般信息)Info</button>
		
		<!-- Indicates caution should be taken with this action -->
		<button type="button" class="btn btn-warning">(警告)Warning</button>
		
		<!-- Indicates a dangerous or potentially negative action -->
		<button type="button" class="btn btn-danger">(危险)Danger</button>
		
		<!-- Deemphasize a button by making it look like a link while maintaining button behavior -->
		<button type="button" class="btn btn-link">(链接)Link</button>
	</body>
</html>

<!DOCTYPE html>
<html>
<head>
	    <meta charset="utf-8">
	    <meta http-equiv="X-UA-Compatible" content="IE=edge">
	    <meta name="viewport" content="width=device-width, initial-scale=1">
	    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
	    <title>_boostrap之_表格</title>
	
	    <!-- Bootstrap --CSS样式 -->
	    <link href="css/bootstrap.min.css" rel="stylesheet">
		
		 <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
		    <script src="js/jquery-3.2.1.min.js"></script>
		    <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
		    <script src="js/bootstrap.min.js"></script>
	  
	  </head>
	<body>
		<!-- <table border="1px" width="500px" height="400px" align="center"> -->
			<!-- table样式基本属性
			   class="table"
			 -->
			<!-- <table class="table"> -->
			<!-- table table-striped :表格的斑马条纹样式 -->
			<!-- <table class="table table-striped"> -->
			
			<!-- 带边框的表格
				table-bordered
				
				table-hover:鼠标悬停有一个响应状态
			 -->
			<table class=" table table-bordered table-hover">
			<tr>
				<th>编号</th>
				<th>姓名</th>
				<th>性别</th>
				<th>年龄</th>
			</tr>
			<tr class="active"><!-- 指定具体的鼠标悬停之后选中 -->
				<td>001</td>
				<td>张钰</td>
				<td></td>
				<td>20</td>
			</tr>
			<tr class="danger"> <!-- 设置dange颜色-->
				<td>002</td>
				<td>赵博</td>
				<td></td>
				<td>22</td>
			</tr>
			<tr class="warning"> <!-- 设置警告的颜色-->
				<td>003</td>
				<td>袁一鸣</td>
				<td></td>
				<td>23</td>
			</tr>
			<tr class="info"><!-- 设置普通信息颜色 -->
				<td>004</td>
				<td>张三</td>
				<td></td>
				<td>25</td>
			</tr>
							
		</table>
		
		
		<hr/>
		
		<hr/>
		
		<hr/>
		
		<!-- 
			全局CSS表单样式
			
			//基本实例
			表单form标签
				一进来: 控件  div 指定属性 class="form-group"
				每一lable元素和input/select元素/textarea(文本域) 包裹在
				form-group 这个空间,可以获得更好的排版!
			
		 -->
		 <form>
		   <div class="form-group">
		     <label for="exampleInputEmail1">Email address</label>
		     <input type="email" class="form-control" id="exampleInputEmail1" placeholder="Email">
		   </div>
		   <div class="form-group">
		     <label for="exampleInputPassword1">Password</label>
		     <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
		   </div>
		   <div class="form-group">
		     <label for="exampleInputFile">File input</label>
		     <input type="file" id="exampleInputFile">
		     <p class="help-block">Example block-level help text here.</p>
		   </div>
		   <div class="checkbox">
		     <label>
		       <input type="checkbox"> Check me out
		     </label>
		   </div>
		   <button type="submit" class="btn btn-default">Submit</button>
		 </form>
		 
		 
		 <hr />
		 <hr />
		 <hr />
		 
		 <!-- 
			水平排列的表单
			class="form-horizontal" 设置下面的所有的表单项水平方向的
			
			注意实行:
			即使使用的bootrap给定的模板:
			里面所有的标签的id属性不能重复!
		 -->
		 <form class="form-horizontal">
		   <div class="form-group">
		     <label for="inputEmail3" class="col-sm-2 control-label">用户名</label>
		     <div class="col-sm-10">
		       <input type="email" class="form-control" id="inputUsername" placeholder="Email">
		     </div>
		   </div>
		   <div class="form-group">
		     <label for="inputPassword3" class="col-sm-2 control-label">密码</label>
		     <div class="col-sm-10">
		       <input type="password" class="form-control" id="inputPassword" placeholder="Password">
		     </div>
		   </div>
		   
		   <div class="form-group">
		     <label for="inputPassword3" class="col-sm-2 control-label">邮箱</label>
		     <div class="col-sm-10">
		       <input type="text" class="form-control" id="inputEamil" placeholder="Password">
		     </div>
		   </div>
		   
		   <div class="form-group">
		     <div class="col-sm-offset-2 col-sm-10">
		       <div class="checkbox">
		         <label>
		           <input type="checkbox"> 记住用户名
		         </label>
		       </div>
		     </div>
		   </div>
		   <div class="form-group">
		     <div class="col-sm-offset-2 col-sm-10">
		       <button type="submit" class="btn btn-default">登录</button>
		     </div>
		   </div>
		 </form>
		
		
	</body>
</html>

3.2_boostrap中的组件

导航条
分页条
<!DOCTYPE html>
<html>
<head>
	    <meta charset="utf-8">
	    <meta http-equiv="X-UA-Compatible" content="IE=edge">
	    <meta name="viewport" content="width=device-width, initial-scale=1">
	    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
	    <title>boostrap之_组件_导航条</title>
	
	    <!-- Bootstrap --CSS样式 -->
	    <link href="css/bootstrap.min.css" rel="stylesheet">
		
		 <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
		    <script src="js/jquery-3.2.1.min.js"></script>
		    <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
		    <script src="js/bootstrap.min.js"></script>
	  
	  </head>
	<body>
		
		<!-- 
			导航条:bootstrap的组件
		
		navbar navbar-default:导航条的默认样式:背景色是白色
		
		反射导航条样式
			.navbar-inverse
		-->
		<!-- <nav class="navbar navbar-default "> -->
		<nav class="navbar navbar-inverse ">
		  <div class="container-fluid">
		    <!-- Brand and toggle get grouped for better mobile display -->
			
		    <div class="navbar-header">
				<!-- 定义了一个汉堡按钮
					随着屏幕分辨率边小的,导航条中间的内容就会隐藏到汉堡按钮下面
				 -->
		      <button type="button" class="navbar-toggle collapsed"  data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
		        <span class="sr-only">Toggle navigation</span>
		        <span class="icon-bar"></span>
		        <span class="icon-bar"></span>
		       <!-- <span class="icon-bar"></span> -->
		      </button>
		      <a class="navbar-brand" href="#">我的首页</a>
		    </div>
		
		    <!-- Collect the nav links, forms, and other content for toggling -->
		    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
		      <ul class="nav navbar-nav">
		        <li class="active"><a href="#">手机数码 <span class="sr-only">(current)</span></a></li>
		        <li><a href="#">户外商品</a></li>
		      </ul>
			  
			  <!-- 
				导航条样式后面
				
				pull-right:将整个表单组件放置在右边
			   -->
		      <form class="navbar-form navbar-left pull-right">
		        <div class="form-group">
		          <input type="text" class="form-control" placeholder="Search">
		        </div>
		        <button type="submit" class="btn btn-default">搜索</button>
		      </form>
		    </div><!-- /.navbar-collapse -->
		  </div><!-- /.container-fluid -->
		</nav>
		
		
		<hr/>
		
		<hr/>
		
		<hr />
		
		<!-- 分页条-->
		<nav aria-label="Page navigation">
		  <ul class="pagination">
			  
			  <!--当前默认在第一页,上一个不能再点击了
			  这个时候当前上一页添加禁用状态
			  class ="disabled"
			   -->
		    <li class="disabled">
		      <a href="#" aria-label="Previous">
		        <span aria-hidden="true">上一页</span>
		      </a>
		    </li>
			<!--
				给第1页添加默认激活状态(选中)
				class="active"
			 -->
		    <li class="active"><a href="#" >1</a></li>
			
		    <li><a href="#">2</a></li>
		    <li><a href="#">3</a></li>
		    <li><a href="#">4</a></li>
		    <li><a href="#">5</a></li>
		    <li>
		      <a href="#" aria-label="Next">
		        <span aria-hidden="true">下一页</span>
		      </a>
		    </li>
		  </ul>
		</nav>
		
		<span  style="font-size: 25px;">共有20条记录 共4页</span>
		
	</body>
</html>

3.3_boostrap中插件

轮播图
<!DOCTYPE html>
<html>
<head>
	    <meta charset="utf-8">
	    <meta http-equiv="X-UA-Compatible" content="IE=edge">
	    <meta name="viewport" content="width=device-width, initial-scale=1">
	    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
	    <title>06_boostrap之_插件_轮播图</title>
	
	    <!-- Bootstrap --CSS样式 -->
	    <link href="css/bootstrap.min.css" rel="stylesheet">
		
		 <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
		    <script src="js/jquery-3.2.1.min.js"></script>
		    <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
		    <script src="js/bootstrap.min.js"></script>
	  
	  </head>
	<body>
		<div id="carousel-example-generic" 
		 class="carousel slide" data-ride="carousel">
		  <!-- Indicators -->
		  <ol class="carousel-indicators">
		    <li data-target="#carousel-example-generic" data-slide-to="0" class="active"></li>
		    <li data-target="#carousel-example-generic" data-slide-to="1"></li>
		    <li data-target="#carousel-example-generic" data-slide-to="2"></li>
		  </ol>
		
		  <!-- Wrapper for slides -->
		 <div class="carousel-inner" role="listbox">
		     <div class="item active">
		       <img src="img/1.jpg" alt="...">
		       <div class="carousel-caption">
		         ...
		       </div>
		     </div>
		     <div class="item">
		       <img src="img/2.jpg" alt="...">
		       <div class="carousel-caption">
		         ...
		       </div>
		     </div>
			 <div class="item">
			   <img src="img/3.jpg" alt="...">
			   <div class="carousel-caption">
			     ...
			   </div>
			 </div>

		   </div>
		
		  <!-- Controls -->
		  <a class="left carousel-control" href="#carousel-example-generic" role="button" data-slide="prev">
		      <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
		      <span class="sr-only">Previous</span>
		    </a>
		    <a class="right carousel-control" href="#carousel-example-generic" role="button" data-slide="next">
		      <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
		      <span class="sr-only">Next</span>
		    </a>
		</div>
		
	</body>
</html>

3.4_响应式页面

<!DOCTYPE html>
<html>
<head>
	    <meta charset="utf-8">
	    <meta http-equiv="X-UA-Compatible" content="IE=edge">
	    <meta name="viewport" content="width=device-width, initial-scale=1">
	    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
	    <title>响应式页面</title>
	
	    <!-- Bootstrap --CSS样式 -->
	    <link href="css/bootstrap.min.css" rel="stylesheet">
		
		 <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
		    <script src="js/jquery-3.2.1.min.js"></script>
		    <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
		    <script src="js/bootstrap.min.js"></script>
	  
	  </head>
	<body>
		<!-- 
			三个大的div
			第一个div:存放导航条部分
			第二个div:轮播图
			第三个div
				放入一些超链接或者p标签
			
		 -->
		 <div class="container-fluid">
		 <!-- 导航条-->
		 <div class="row">
			 
			 <nav class="navbar navbar-inverse ">
			   <div class="container-fluid">
			     <!-- Brand and toggle get grouped for better mobile display -->
			 	
			     <div class="navbar-header">
			 		<!-- 定义了一个汉堡按钮
			 			随着屏幕分辨率边小的,导航条中间的内容就会隐藏到汉堡按钮下面
			 		 -->
			       <button type="button" class="navbar-toggle collapsed"  data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
			         <span class="sr-only">Toggle navigation</span>
			         <span class="icon-bar"></span>
			         <span class="icon-bar"></span>
			        <!-- <span class="icon-bar"></span> -->
			       </button>
			       <a class="navbar-brand" href="#">我的首页</a>
			     </div>
			 
			     <!-- Collect the nav links, forms, and other content for toggling -->
			     <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
			       <ul class="nav navbar-nav">
			         <li class="active"><a href="#">手机数码 <span class="sr-only">(current)</span></a></li>
			         <li><a href="#">户外商品</a></li>
			       </ul>
			 	  
			 	  <!-- 
			 		导航条样式后面
			 		
			 	   -->
			       <form class="navbar-form navbar-left">
			         <div class="form-group">
			           <input type="text" class="form-control" placeholder="Search">
			         </div>
			         <button type="submit" class="btn btn-default">search</button>
			       </form>
			     </div><!-- /.navbar-collapse -->
			   </div><!-- /.container-fluid -->
			 </nav>
			 
		 </div>
		 
		 <div class="row">
			 
			 <div id="carousel-example-generic"
			  class="carousel slide" data-ride="carousel">
			   <!-- Indicators -->
			   <ol class="carousel-indicators">
			     <li data-target="#carousel-example-generic" data-slide-to="0" class="active"></li>
			     <li data-target="#carousel-example-generic" data-slide-to="1"></li>
			     <li data-target="#carousel-example-generic" data-slide-to="2"></li>
			   </ol>
			 
			   <!-- Wrapper for slides -->
			  <div class="carousel-inner" role="listbox">
			      <div class="item active">
			        <img src="img/1.jpg" alt="...">
			        <div class="carousel-caption">
			          ...
			        </div>
			      </div>
			      <div class="item">
			        <img src="img/2.jpg" alt="...">
			        <div class="carousel-caption">
			          ...
			        </div>
			      </div>
			 	 <div class="item">
			 	   <img src="img/3.jpg" alt="...">
			 	   <div class="carousel-caption">
			 	     ...
			 	   </div>
			 	 </div>
			 
			    </div>
			 
			   <!-- Controls -->
			   <a class="left carousel-control" href="#carousel-example-generic" role="button" data-slide="prev">
			       <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
			       <span class="sr-only">Previous</span>
			     </a>
			     <a class="right carousel-control" href="#carousel-example-generic" role="button" data-slide="next">
			       <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
			       <span class="sr-only">Next</span>
			     </a>
			 </div>
		 </div>
		 
		 
		 <div class="row">
			 <!-- 三个div:每一个div
				p标签
				中等屏幕:一行3个格子
				小屏幕:一行6个格子
				大屏幕:12个格子
			 -->
			 <div class="col-md-4 col-sm-2 col-lg-12">
				 <p>非你莫属</p>
				 <a class="btn btn-danger">more</a>
			 </div>	
			 <div class="col-md-4 col-sm-2 col-lg-12">
			 				 <p>非你莫属</p>
			 				 <a class="btn btn-danger">more</a>
			 </div>	
			 <div class="col-md-4 col-sm-2 col-lg-12">
			 				 <p>非你莫属</p>
			 				 <a class="btn btn-danger">more</a>
			 </div>	
			  	
		 </div>
		 
		 </div>
	</body>
</html>

4.关于Servlet+jsp+JDBC:后台管理

4.1用户管理系统

list页面: 展示所有用户列表   

实体类: User类           
数据库:user表
		id
		name
		gender
		age
		address
		qq
		email
		username
		password

index.jsp---->点击查询所有 ---->findAllUserServlet
                            service
                            dao
                            
登录页面
	 用户名
	 
	 密码
	 
	 加入验证码
	 
	  增加用户
	  删除用户
	  修改用户....
	  
	  
	  
	  
1.登录过滤任务

loginFilter
路径:/*

将用户登录的相关资源,排除掉(放行)
   /login.jsp
   /loginServlet
   /checkCodeServlet
   /css
   /js
   /fonts
   /img...
   
   获取http://lcalhost:8080/Admin_Project/index.jsp
   
   过滤器doFilter(ServletRequest/ res,ServletRespons resp,ChainFitler...)
   	//需要将ServletRequest/ServletResponse---->HttpServletRequest,HttpServletResponse
   	rquest.getURI ;-----String uri
   	//进行判断即可是否是上面的这些登录的相关资源
   	   放行
   	   
   	 如果不是登录相关的资源
   	    判断,用户是否登录过,
   	    从session中获取用户---->如果用户不为null,
   	    登录过,放行
   	    如果用户为null
   	    设置登录页面提示"用户还没有登录过"
   	    请求转发到登录页面login.jsp  

4.1_查询所有用户

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.qf.entity.User;
import com.qf.service.UserService;
import com.qf.service.impl.UserServiceImpl;

/**
 * 
 *Title: FindAllUserServlet 
 * Description: 查询所有用户 <  
 */
@WebServlet("/findAllUserServlet")
public class FindAllUserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) 
					throws ServletException, IOException {
		
		//调用service
		//创建UserService对象
		UserService userService = new UserServiceImpl() ;
		//调用
		List<User> users = userService.findAll() ;
		
		//user不为空,将users集合数据存储到request域对象中
		if(users!=null) {
			request.setAttribute("users", users);
			//请求转发到list.jsp
			request.getRequestDispatcher("/list.jsp").forward(request, response);
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

4.2_添加用户

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;

import com.qf.entity.User;
import com.qf.service.UserService;
import com.qf.service.impl.UserServiceImpl;
/**
 * 
 * Title: AddUserServlet  
 * Description:添加用户  
 */
@WebServlet("/addUserServlet")
public class AddUserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		//1.手动解决post乱码
		request.setCharacterEncoding("utf-8");
		//2)接收前台参数
		//一次接收一个/接收map集合
		Map<String, String[]> map = request.getParameterMap() ;
		
		//3)封装User对象
		User user = new User() ;
		System.out.println(user);
		
		//4)使用Apache 提供的工具类:commons-beanUtils
		//导入两个jar 
		//一个核心jar包+一个日志记录jar包
		try {
			//将前台输入的参数封装到User对象中
			BeanUtils.populate(user, map);
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		System.out.println(user);
		
		//调用service
		UserService userService = new UserServiceImpl() ;
		userService.addUser(user) ;
		
		//没有业务数据,后台重定向到findAllUserServlet后台
		response.sendRedirect(request.getContextPath()+"/findAllUserServlet") ;
		
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

4.3_登录业务

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.beanutils.BeanUtils;

import com.qf.entity.User;
import com.qf.service.UserService;
import com.qf.service.impl.UserServiceImpl;

/**
 * 
 * <p>Title: LoginServlet</p>  
 * <p>Description: 登录的Servlet</p>  
 */
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		
		//解决post乱码
		request.setCharacterEncoding("utf-8");
		
		//获取前台用输入的参数
		//获取用户输入的验证码
		String inputCheckCode = request.getParameter("verifycode") ;
		//获取服务器端存储的验证码---session:
		HttpSession session = request.getSession() ;
		String CHECKCODE_SERVER = (String) session.getAttribute("CHECKCODE_SERVER") ;
	
		//比较前台输入的和后端存的验证码
		if(!CHECKCODE_SERVER.equalsIgnoreCase(inputCheckCode)||inputCheckCode ==null ) {
			//提示错误信息
			request.setAttribute("login_msg", "验证码错误!");
			//请求转发到login.jsp
			request.getRequestDispatcher("/login.jsp").forward(request, response);
			return ;
		}
		
		//如果验证码一致
		//获取用户名和密码:这些参数
		Map<String, String[]> map = request.getParameterMap() ;
		//封装User对象
		User user = new User() ;
		
		try {
			BeanUtils.populate(user, map);
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		System.out.println(user);
		
		//调用service
		UserService userService = new UserServiceImpl() ;
		
		User loginUser = userService.login(user) ;
		//判断user是否为null
		if(loginUser!=null) {
			//登录成功
			//存储到session中
			request.getSession().setAttribute("user", loginUser) ;
			//请求转发到index.jsp
			request.getRequestDispatcher("/index.jsp").forward(request, response);
		}else {
			//用户没查询到
			//错误提示信息
			request.setAttribute("login_msg", "用户名或者密码错误!");
			//请求转发到登录页面
			request.getRequestDispatcher("/login.jsp").forward(request, response);
			
		}
		
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		doGet(request, response);
	}

}

4.4_通过id查询用户

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.qf.entity.User;
import com.qf.service.UserService;
import com.qf.service.impl.UserServiceImpl;
/**
 * 通过id查询用户
 * <p>Title: FindUserServlet</p>  
 */
@WebServlet("/findUserServlet")
public class FindUserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//1.接收参数
		String id = request.getParameter("id") ;
		
		//2.调用service,通过id查询用户
		UserService userService = new UserServiceImpl() ;
		User user = userService.findUserById(id) ;
		
		//3)判断user不为null
		if(user !=null) {
			//将user对象存储request域中
			request.setAttribute("user", user);
			//请求转发到update.jsp
			request.getRequestDispatcher("/update.jsp").forward(request, response);
			
		}
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

5.后台管理系统

1)查询所有
2)添加用户
      点击添加----->    /addUserServlet
      		通过service:
      				addUser(user)---到dao层:数据库的添加操作
      				
      	   添加完毕,页面跳转:后台地址 查询所有的findAllUserServlt
2)登录功能
       
        管理员输入用户名和密码
        以及验证码(在服务器端:生产4个随机数-----存储session中)
        
        
        loinServlet
        1)获取用户输入的验证码
        2)从sesison中获取服务器端存储的验证码
        3)进行比较,如果当前数据不相等或用户输入的验证码为null
        
          3.1)提示信息
          3.2)请求转发到login.jsp
          
        4)没有问题:验证码验证成功
        接收前台用户名和密码的数据
        封装User对象
           BeanUtils.populate(Object obj,Map map) :参数2:就是前台所有的参数数据
           
         5)调用service :登录查询 login(User user)
         6)获取User loginUser = xxx
         7)判断user是否null
           如果不为null,
               将用户存储在session中 ----->Cookie:name:JESESSIONID
               请求转发到index.jsp中,显示,    "某个管理员名字 ,欢迎您"
               
            为null
                提示,
                请求转发到login.jsp:用户名或者密码错误!
         
         
         
         
         
         serivce--->dao层
        User  findUser(String username,String password)

5.1登录的过滤器

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 
 * <p>Title: LoginFilter</p>  
 * <p>Description:登录的权限校验 </p>  
 * @author ZhangYang
 * @date 2020年11月26日  
 * @Version 1.0
 */
@WebFilter("/*")
public class LoginFilter implements Filter {

	
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
		
		//1)获取请求资源地址的uri
		//过滤任务中request不是---->HtppServletRequest----父接口 ServletRequest
		//将req和resp强制转换为HtppServletRequest/HttpServletResponse
		HttpServletRequest request = (HttpServletRequest) req ;
		HttpServletResponse response = (HttpServletResponse) resp ;
		
		String uri = request.getRequestURI() ;
		//2)判断uri中是否包含登录相关的资源
		//需要将登录相关的资源排除掉,放行
		//login.jsp,/loginServlet,验证码 
		//还需要将登录相关的css,js,图片资源,fonts 资源都放行
		if(uri.contains("/login.jsp") || uri.contains("/loginServlet") 
				|| uri.contains("/checkCodeServlet")
				|| uri.contains("/css") 
				|| uri.contains("/js")
				|| uri.contains("/fonts")) {
			//放行
			chain.doFilter(request, response);
		}else {
			//访问的非登录的资源
			//就需要还要验证用户是否登录
			//用户存储在session中
			Object user = request.getSession().getAttribute("user") ;
			if(user !=null) {
				//登录过了,放行
				chain.doFilter(request, response);
			}else {
				//没有登录,跳转到login.jsp执行登录操作
				//提示信息
				request.setAttribute("login_msg", "用户尚未登录");
				//请求转发到login.jsp
				request.getRequestDispatcher("/login.jsp").forward(request, response);
			}
			
		}
		
	
	}

	public void destroy() {
	}

	public void init(FilterConfig fConfig) throws ServletException {
	}

}

5.2删除用户

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.qf.service.UserService;
import com.qf.service.impl.UserServiceImpl;

/**
 * <p>Title: DelUserServlet</p>  
 * <p>Description:根据id删除某个用户 </p>  
 */
@WebServlet("/delUserServlet")
public class DelUserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		
		//${pageContext.request.contextPath }/delUserServlet?id=${u.id}"
		//接收这个前台参数
		String id = request.getParameter("id") ;
		
		
		//调用service:根据用户id删除用户
		UserService userService = new UserServiceImpl() ;
		userService.delUser(id) ;
		
		//重新重定向到查询所有用户列表的后台: 重新查询数据库的最新消息(数据库的压力大:使用缓存技术 后面应用)
		response.sendRedirect(request.getContextPath()+"/findAllUserServlet");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

5.3修改用户

修改用户:
    两个步骤
      1)首先的通过id 查询到用户
          findUserServlet
          
          接收参数
          ----->需要通过用户封装数据
          如果查询servier--dao层:查询user
          将用户对象存储request域中,请求转发update.jsp
          
          ----将用户的信息回显到upate.jsp上面
          
         2)修改样用户的信息----->提交update.jsp----->UpdateUserServlet
         封装业务数据
           调用service
           调用dao层
          		
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;

import com.qf.entity.User;
import com.qf.service.UserService;
import com.qf.service.impl.UserServiceImpl;
/**
 * 
 * <p>Title: UpdateUserServlet</p>  
 * <p>Description:更新用户操作 </p>  
 */

@WebServlet("/updateUserServlet")
public class UpdateUserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			
			throws ServletException, IOException {
		//1)post提交乱码中
		request.setCharacterEncoding("utf-8");
		//2)接收参数
		Map<String, String[]> map = request.getParameterMap() ;
		
		//3)封装User对象
		User user = new User() ;
		try {
			BeanUtils.populate(user, map);
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		
		//4)调用service完成更新的操作
		UserService userService = new UserServiceImpl() ;
		userService.updateUser(user) ;
		
		//5)重定向到findAllUserServlet重新查询列表数据
		response.sendRedirect(request.getContextPath()+"/findAllUserServlet");
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

5.3删除选中的用户数据

1)前台:完成全选----反选

    只要当前第一个复选框和每一个列的复选框保持的checked状态(选中:true,没有选中:false)
    
2)点击超链接----超链接失效----执行点击事件跳转
   选中删除
     a href="javascript:void(0)" id="delSelected"
     //选中的条目----执行表单提交
       
       
       
  3)后台业务
  
    只需要接收这些用户id编号   String[]  ids=  request.getParamerterValues() ;
    调用service----
         delSelected(String[] ids)
         
       遍历ids
         为了防止:空指针
         if(ids!=nulll && ids.length>0){
             //遍历
             for(String id:ids){
             //调用dao层
             dao.delete(Integer.parseInt(id));
             
            }
             
         }
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.qf.service.UserService;
import com.qf.service.impl.UserServiceImpl;

/**
 * <p>Title: DelSelectedServlet</p>  
 * <p>Description:删除选中的用户操作 </p>  
 */
@WebServlet("/delSelectedServlet")
public class DelSelectedServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		
		//1)接收参数:选中哪些id
		String[] ids = request.getParameterValues("uid") ;
		
		//2)调用service完成 批量删除操作
		UserService userService = new UserServiceImpl() ;
		userService.delSelected(ids) ;
		
		//3)重定向到findAllUserServlet查询下
		response.sendRedirect(request.getContextPath()+"/findAllUserServlet");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

5.4分页查询(高级功能)

import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.qf.entity.PageBean;
import com.qf.entity.User;
import com.qf.service.UserService;
import com.qf.service.impl.UserServiceImpl;

import sun.swing.plaf.synth.Paint9Painter;
/**
 * 分页查询的后台
 * <p>Title: FindUserByPageServlet</p>  
 */
@WebServlet("/findUserByPageServlet")
public class FindUserByPageServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//处理post请求乱码
		request.setCharacterEncoding("utf-8");
		//获取前台用户输入的条件参数
		Map<String, String[]> condition = request.getParameterMap() ;
		
		
		
		//1)接收参数
		//当前页码
		String currentPage = request.getParameter("currentPage") ;
		//每页显示的条数
		String pageSize = request.getParameter("pageSize") ;
		
		//判断
		if(currentPage==null || "".equals(currentPage)) {
			currentPage = "1" ;
		}
		
		if(pageSize ==null || "".equals(pageSize)) {
			pageSize ="5" ;
		}
		
		//2)调用service
		UserService userService = new UserServiceImpl() ;
		//分页查询的方法---服务器端需要给客户端:输出 PageBean
		//PageBean<User> pb = userService.findUserByPage(currentPage,pageSize) ;
		PageBean<User> pb = userService.findUserByPage(currentPage,pageSize,condition) ;
		//System.out.println(pb);
		
		
		//3)需要将分页对象存储到request域中
		request.setAttribute("pb", pb);
		//请求转发到list.jsp上
		request.getRequestDispatcher("/list.jsp").forward(request, response);
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

5.5_验证码

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 验证码
 */
@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		
		//服务器通知浏览器不要缓存
		response.setHeader("pragma","no-cache");
		response.setHeader("cache-control","no-cache");
		response.setHeader("expires","0");
		
		//在内存中创建一个长80,宽30的图片,默认黑色背景
		//参数一:长
		//参数二:宽
		//参数三:颜色
		int width = 80;
		int height = 30;
		BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
		
		//获取画笔
		Graphics g = image.getGraphics();
		//设置画笔颜色为灰色
		g.setColor(Color.GRAY);
		//填充图片
		g.fillRect(0,0, width,height);
		
		//产生4个随机验证码,12Ey
		String checkCode = getCheckCode();
		//将验证码放入HttpSession中 //存储在服务器端
		request.getSession().setAttribute("CHECKCODE_SERVER",checkCode);
		
		//设置画笔颜色为黄色
		g.setColor(Color.YELLOW);
		//设置字体的小大
		g.setFont(new Font("黑体",Font.BOLD,24));
		//向图片上写入验证码
		g.drawString(checkCode,15,25);
		
		//将内存中的图片输出到浏览器
		//参数一:图片对象
		//参数二:图片的格式,如PNG,JPG,GIF
		//参数三:图片输出到哪里去
		ImageIO.write(image,"PNG",response.getOutputStream());
	}
	/**
	 * 产生4位随机字符串 
	 */
	private String getCheckCode() {
		String base = "0123456789ABCDEFGabcdefg";
		int size = base.length();
		Random r = new Random();
		StringBuffer sb = new StringBuffer();
		for(int i=1;i<=4;i++){
			//产生0到size-1的随机值
			int index = r.nextInt(size);
			//在base字符串中获取下标为index的字符
			char c = base.charAt(index);
			//将c放入到StringBuffer中去
			sb.append(c);
		}
		return sb.toString();
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doGet(request,response);
	}
}




6._Jquery----js库


//看官网文档
重点掌握的选择器
$("#id属性值").click=function(){
    
}
$(".class属性值")
$("标签名称")

6.1_Jquery入门

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Jquery入门</title>
		<!-- 
				Jquery---简称"JQ"  ,是一个丰富js工具库!
				特点:
				      write less ,do more :写的少,做的多!
		 
		 
		 使用步骤:
				1)导入Jqury-js库
				2)通过文档---使用jquery的函数
		 -->
		 <script src="js/jquery-3.3.1.min.js"></script>
		 
		 <script>
			 //没有使用jquery之前:
			 //原生Js
			 //给第一个加入一个点击事件
		 	// function init(){
				 //通过id="div1"获取当前标签对象
				/* document.getElementById("input").onclick = function(){
					 alert("触发点击事件") ;
				 } */
				 
			// } 
			 
			 //上面是原生js的方式
			/* function testClick(){
				 var input = document.getElementById("input") ;
				 alert(input) ; //[object HTMLInputElement] 原生js
			 } */
			 
			 
			 //原生js的页面载入事件
			/* window.οnlοad=function(){
				 alert("indow.οnlοad=function事件触发了...") ;
			 } */
			 
			 
			 //开发中:一般情况:如果页面载入事件,使用Jquery,全部Jquery
			 
			//为了简化书写方式:提供js库
			//Jquery的页面载入事件
				$(function(){
					//alert("Jquery的页面载入事件触发了...") ;
					
					//Jquery
					/* $("#input").click(function(){
						
						alert("单击点击事件触发了...");
						
					}) ; */
					var $input = $("#input") ;
					alert($input) ; //[object Object]
					
				}) ;
			 
		 </script>
	</head>
	<!-- <body οnlοad="init()"> -->
	<body>
		
			<input  type="button" id="input" onclick="testClick()" value="点击" />
			<div id="div2" onmouseover="">div2</div>
	</body>
</html>

6.2_Jquery对象和Js对象的相互转换

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>_Jquery对象和Js对象的相互转换</title>
<!-- 
	引入Js库
	
-->
<script src="js/jquery-3.3.1.min.js"></script>
<script>
		
		
		//js对象----Jq
		/*
		window.onload = function(){
			//原生Js----Jquery对象
			//获取id="d1"div标签对象
			var jsDiv = document.getElementById("d1") ;
			//jsDiv.innerHTML = "aaa" ;
			//jsDiv.html("ccc") ; //原生js对象没有这个函数
			//alert(jsDiv); //[object HTMLDivElement]
			
			//js---Jq: 通过$(原生js对象)---->
			//var $div = $(jsDiv) ;
			$div.html("bbb") ; //获取/设置标签体内容
			
		}
		*/
	   
	   //Jquery对象----原生Js对象
	   //Jq的页面载入事件
	   $(function(){
		   //id="d2"的div标签对象
		   var $div = $("#d2") ; //Jquery对象
		  // alert($div) ;//[object Object]:Jquery对象
		   
		   //html("xxx"):获取文本内容或者设置标体内容
		  // $div.html("goodStudy") ;
		  
		  //将$div对象--转换js对象
		  //get(index):通过索引值获取标签对象---js对象
		  var jsDiv =  $div.get(0) ;
		  jsDiv.innerHTML = "helloJq";
		   
		   
		   //一般开发:如果使用Jquery:定义变量:var $变量名: Jquery的方式
		   
	   }) ;
		
	
</script>
	</head>
	<body>
		
		<div id="d1">div1</div>
		<div id="d2">div2</div>
	</body>
</html>

6.3_Jq基本选择器

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>基本选择器</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
	<script  src="js/jquery-3.3.1.min.js"></script>
	<style type="text/css">
		 	div,span{
			    width: 180px;
			    height: 180px;
			    margin: 20px;
			    background: #9999CC;
			    border: #000 1px solid;
				float:left;
			    font-size: 17px;
			    font-family:Roman;
			}
			
			div .mini{
			    width: 50px;
			    height: 50px;
			    background: #CC66FF;
			    border: #000 1px solid;
			    font-size: 12px;
			    font-family:Roman;
			}
			
			div .mini01{
			    width: 50px;
			    height: 50px;
			    background: #CC66FF;
			    border: #000 1px solid;
			    font-size: 12px;
			    font-family:Roman;
			}
			
			
			
	 </style>
	 
	 <!-- 
		Jquery的id选择器
				
					引入Jquery的js库
					
					$("#id属性值")  ------$(Jquery的id选择器) :Jq对象
					
					
					id选择器"#id"----保证页面中的id属性值唯一!
					
					
		Jquery的element选择器(标签选择器)  :元素选择器
			$("标签名称")---执行对应函数即可
			
		Jquery的class选择器(类匹配)
			$(".class属性值")
			
			
		Jquery的并集选择器
		 selector1,selector2,selectorN
		 选择器和选择器之间逗号隔开
		 
	 -->
	 
	 <script>
		 
		 //页面载入事件
		 $(function(){//Jquery的入口函数
			 
			 
			 //业务
			 //返回值:jQueryclick(fn)
			 $("#b1").click(function(){
				  //获取id="b1"的input标签对象
				  //改变 id 为 one 的元素的背景色为 红色
				 
				 //选中id="one"的标签
				 //Jquery对象.css("css属性样式",value值) ;
				 $("#one").css("backgroundColor","red") ;
				 
			 }) ;
			
			 
			 //id="b2"的input标签设置点击事件
			 $("#b2").click(function(){
			 	 // 改变元素名为 <div> 的所有元素的背景色为 红色
			 	$("div").css("backgroundColor","pink") ;
			 }) ;
			 
			 
			 //改变 class 为 mini 的所有元素的背景色为 红色
			 $("#b3").click(function(){
				 
				 $(".mini").css("backgroundColor","greenyellow") ;
			 }) ;
			 
			 //改变所有的<span>元素和 id 为 two 的元素的背景色为红色
			 $("#b4").click(function(){
				 
				 $("span,#two").css("backgroundColor","blue") ;
				 
			 }) ;
			 
		 }) ;
	 
	 </script>
	
	</head>
	 
	<body>
				
		 <input type="button" value="保存"  class="mini" name="ok"  class="mini" />
		 <input type="button" value="改变 id 为 one 的元素的背景色为 红色"  id="b1"/>
		 <input type="button" value=" 改变元素名为 <div> 的所有元素的背景色为 红色"  id="b2"/>
		 <input type="button" value=" 改变 class 为 mini 的所有元素的背景色为 红色"  id="b3"/>
		 <input type="button" value=" 改变所有的<span>元素和 id 为 two 的元素的背景色为红色"  id="b4"/>
		
 
		 <h1>Good Good Study,Day Day Up</h1>
		 
		 
	    <div id="one">
	    	 id为one       
		 </div>
		
		 <div id="two" class="mini" >
	    	   id为two   class是 mini 
		       <div  class="mini" >class是 mini</div>
		 </div>
		
		 <div class="one" >
		 	    class是 one 
		       <div  class="mini" >class是 mini</div>
			   <div  class="mini" >class是 mini</div>
		 </div>
		 <div class="one" >
		 	  class是 one 
		       <div  class="mini01" >class是 mini01</div>
			   <div  class="mini" >class是 mini</div>
		</div>
		

		<span class="spanone">class为spanone的span元素</span>
		<span class="mini">class为mini的span元素</span>
		

		<input type="text" value="zhang" id="username" name="username">
	
	</body>
	
	
	
</html>

6.4_Jq层次选择器

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>层次选择器</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
	<script  src="js/jquery-3.3.1.min.js"></script>
	<style type="text/css">
		 	div,span{
			    width: 180px;
			    height: 180px;
			    margin: 20px;
			    background: #9999CC;
			    border: #000 1px solid;
				float:left;
			    font-size: 17px;
			    font-family:Roman;
			}
			
			div .mini{
			    width: 50px;
			    height: 50px;
			    background: #CC66FF;
			    border: #000 1px solid;
			    font-size: 12px;
			    font-family:Roman;
			}
			
			div .mini01{
			    width: 50px;
			    height: 50px;
			    background: #CC66FF;
			    border: #000 1px solid;
			    font-size: 12px;
			    font-family:Roman;
			}
			
	 </style>
	 
	 
	 <script>
		 /**
		  * 层级选择器:
		  * 		常用:后代选择器
		  *          选中父标签的所有的子标签 
		  * 		selecto1 selector2
		  * body内有的div
		  * $("body div")
		  * 
		  * 子元素选择器
		  * parent > child
		  * 
		  */
		 //改变 <body> 内所有 <div> 的背景色为红色
		 $(function(){
			 
			 $("#b1").click(function(){
				$("body div").css("backgroundColor","red") ; 
			 });
			 
			 //改变 <body> 内子 <div> 的背景色为 红色"
			 $("#b2").click(function(){
				 
				 $("body > div").css("backgroundColor","red") ;
				 
				 
			 }) ;
		 }) ;
	 </script>
    
   
	</head>
	 
	<body>
				
		 <input type="button" value="保存"  class="mini" name="ok"  class="mini" />
		 <input type="button" value=" 改变 <body> 内所有 <div> 的背景色为红色"  id="b1"/>
		 <input type="button" value=" 改变 <body> 内子 <div> 的背景色为 红色"  id="b2"/>
		
 
		 <h1>Good Good Study,Day Day Up!</h1>
		 
		 
	     <div id="one">
	    	 id为one  
		     
		 </div>
		
		 <div id="two" class="mini" >
	    	   id为two   class是 mini 
		       <div  class="mini" >class是 mini</div>
		</div>
		
		 <div class="one" >
		 	    class是 one 
		       <div  class="mini" >class是 mini</div>
			   <div  class="mini" >class是 mini</div>
		 </div>
		 <div class="one">
		 	  class是 one 
		       <div  class="mini01" >class是 mini01</div>
			   <div  class="mini" >class是 mini</div>
		</div>
		
		
		<span class="spanone">    span
		</span>
		
	</body>
	
	
</html>

6.5_Jq过滤选择器

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>基本过滤选择器</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
	<script  src="js/jquery-3.3.1.min.js"></script>
	<style type="text/css">
		 	div,span{
			    width: 180px;
			    height: 180px;
			    margin: 20px;
			    background: #9999CC;
			    border: #000 1px solid;
				float:left;
			    font-size: 17px;
			    font-family:Roman;
			}
			
			div .mini{
			    width: 50px;
			    height: 50px;
			    background: #CC66FF;
			    border: #000 1px solid;
			    font-size: 12px;
			    font-family:Roman;
			}
			
			div .mini01{
			    width: 50px;
			    height: 50px;
			    background: #CC66FF;
			    border: #000 1px solid;
			    font-size: 12px;
			    font-family:Roman;
			}
	 </style>
	<script>
		/**
		 * 基本的过滤选择器
		 * 		:first:获取第一个元素
		 * 		:not(selector):去除相关匹配的元素 (不是...)
		 * 		:even:匹配偶数的元素
		 * 		:odd 匹配的奇数元素
		 *      :eq(index):匹配等于 (索引值:从0计数)
		 * 		:gt(index):匹配大于给定元素的索引值
		 * 		:lt(index):匹配所有小于给定索引值的元素
		 * 		:last():最后一个元素
		 * 		:header:匹配所有的诸如:h1,h2,h3....标题元素
		 * 		
		 */
		$(function(){
			$("#b1").click(function(){
				
				// 改变第一个 div 元素的背景色为 红色"
				$("div:first").css("backgroundColor","red") ;
				
			}) ;
			//改变最后一个 div 元素的背景色为 红色
		$("#b2").click(function(){
			
			// 改变第一个 div 元素的背景色为 红色"
			$("div:last").css("backgroundColor","blue") ;
			
		}) ;
			
			//改变class不为 one 的所有 div 元素的背景色为 红色
			$("#b3").click(function(){
				
				// 改变第一个 div 元素的背景色为 红色"
				$("div:not(.one)").css("backgroundColor","blue") ;
				
			}) ;
			
			//改变索引值为偶数的 div 元素的背景色为 红色
			$("#b4").click(function(){
				
				// 改变第一个 div 元素的背景色为 红色"
				$("div:even").css("backgroundColor","red") ;
				
			}) ;
			
			//改变索引值为奇数的 div 元素的背景色为 红色
			$("#b5").click(function(){
				
				// 改变第一个 div 元素的背景色为 红色"
				$("div:odd").css("backgroundColor","green") ;
				
			}) ;
			//改变索引值为等于 3 的 div 元素的背景色为 红色
			$("#b7").click(function(){
				
				// 改变第一个 div 元素的背景色为 红色"
				$("div:eq(3)").css("backgroundColor","green") ;
				
			}) ;
			
			// 改变所有的标题元素的背景色为 红色
			$("#b9").click(function(){
				
				// 改变第一个 div 元素的背景色为 红色"
				$(":header").css("backgroundColor","green") ;
				
			}) ;
			
		}) ;
		
		
	</script>

	</head>
	 
	<body>
				
		 <input type="button" value="保存"  class="mini" name="ok"  class="mini" />
		 <input type="button" value=" 改变第一个 div 元素的背景色为 红色"  id="b1"/>
		 <input type="button" value=" 改变最后一个 div 元素的背景色为 红色"  id="b2"/>
		 <input type="button" value=" 改变class不为 one 的所有 div 元素的背景色为 红色"  id="b3"/>
		 <input type="button" value=" 改变索引值为偶数的 div 元素的背景色为 红色"  id="b4"/>
		 <input type="button" value=" 改变索引值为奇数的 div 元素的背景色为 红色"  id="b5"/>
		 <input type="button" value=" 改变索引值为大于 3 的 div 元素的背景色为 红色"  id="b6"/>
		 <input type="button" value=" 改变索引值为等于 3 的 div 元素的背景色为 红色"  id="b7"/>
		 <input type="button" value=" 改变索引值为小于 3 的 div 元素的背景色为 红色"  id="b8"/>
		 <input type="button" value=" 改变所有的标题元素的背景色为 红色"  id="b9"/>
		 
		
		 <h1>Good Good Study,Day Day Up!</h1>
		 
	     <div id="one">
	    	 id为one  
		     
		 </div>
		
		 <div id="two" class="mini" >
	    	   id为two   class是 mini 
		       <div  class="mini" >class是 mini</div>
		</div>
		
		 <div class="one" >
		 	    class是 one 
		       <div  class="mini" >class是 mini</div>
			   <div  class="mini" >class是 mini</div>
		 </div>
		 <div class="one" >
		 	  class是 one 
		       <div  class="mini01" >class是 mini01</div>
			   <div  class="mini" >class是 mini</div>
		</div>
	
	</body>
   
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值