XML部分
1. 概念定义
基本概念
- **可扩展的标签语言**- **标签自定义**- **作用**:储存数据。(配置文件)- **书写规范:**- **区分大小写**- **应该有一个根标签**- **标签必须关闭**- <xx></xx>- <xx/>- **属性必须用引号引起来**- <xx att="value"/>- **标签体中的空格或者换行或者制表符等内容都是数据**。- <xx>aa</xx>- <xx> aa </xx>- **特殊字符必须转义**- < > &- **后缀名**- .xml- 满足上面规范的文件我们称为一个格式良好的xml文件,可以通过浏览器浏览- **xml组成部分:**- **声明**:- **作用:**告诉别人我是一个xml文件- **格式:**<br /> <?xml ....... ?>- **例如:**<br /> <?xml version="1.0" encoding="UTF-8"?><br /> <?xml version="1.0" encoding="UTF-8" standalone="yes|no"?><br /> //最后一个东西是用来判断这个文件是否是独立的文件- **要求:**<br /> 必须在xml文件的第一行<br /> 必须顶格写- **元素(标签)**:- **格式**:<br /> <xx></xx><br /> <xx/>- **要求:**<br /> 1.必须关闭<br /> 2.标签名不能 xml Xml XML 等等开头<br /> 3.标签名中不能出现" "或者":"等特殊字符(加空格意思是属性)- **属性:**- **格式:**<br /> <xx 属性名="属性值"/>- **要求:**<br /> 属性必须用引号引起来- **注释:**- **和html一样**<br /> <!-- 注释内容 -->- **CDATA:**- **xml文件的特殊字符必须转义**(转移炒鸡麻烦)<br /> 通过cdataky保证数据原样输出- **格式**:<br /> <![CDATA[<br /> 原样输出的内容<br /> ]]>- **xml解析:**- **解析方式(常用)**: <br /> dom:一次性将文档加载到内容中,形成一个dom树,可以对dom树curd操作- **解析技术(常用)**: <br /> dom4j:比较常用的解析开发包,hibernate底层使用。- **使用dom4j技术进行查询操作**- 导入jar包- 创建一个核心对象 SAXReader- 将xml文档加载到内存中形成一棵树- 获取根节点- 通过根节点就可以获取其他结点(文本节点,属性节点,元素节点)
Web概念
1. 概念简述
- 
2. 服务器软件分类
- 
tomcat服软
1. 目录介绍
- 文件夹概述- - 启动- - 关闭- 
2. 使用
- 配置- - 启动注意点- 左上角新建模组(注意这几点)<br />- 项目更新(勾上这两个会自动更新)<br />- 新建html<br />- 默认文件<br />
Servlet概述
1. 执行原理
- 机制- - 方法- - 类中实现接口并重载<br />- 路径的配置
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><servlet><servlet-name>demo1</servlet-name><servlet-class>sss</servlet-class></servlet><servlet-mapping><servlet-name>demo1</servlet-name><url-pattern>/demo1</url-pattern></servlet-mapping></web-app>
- 运行之后直接在网址的后边加上名字就可以运行了,运行结果在编译器中。<br /><br /><br />
2. 方法详解
- 方法中有三个比较重要,其余了解<br />
```java import javax.servlet.*; import java.io.IOException;
public class sss implements Servlet {
//初始化方法//在servlet被创建时执行,只会执行一次 ------重点@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("init.....");}//获取servletConfig对象//ServletConfig:servlet的配置对象@Overridepublic ServletConfig getServletConfig() {return null;}//提供服务的方法// 每一次Servlet被访问时执行,执行多次。------重点@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("asdasdasd");}//获取Servlet的一些信息(版本作者啥的)@Overridepublic String getServletInfo() {return null;}//服务器正常退出时执行一次。------重点@Overridepublic void destroy() {System.out.println("destroy.....");}
}
- 生命周期方法(还是放在老地方)- 被创建:执行init方法,只执行一次(默认时第一次访问时被被创建)<br />init方法只执行一次说明,servlet在内存只有一个对象,是单例的<br />- 提供服务:执行service方法,执行多次<br />- 被销毁:执行destroy方法,只执行一次<br />- Servlet3.0- 好处:支持注解配置,可以不需要web.xml了- 步骤<br /><br />注意虚拟路径<br /><br /><br />- IDEA与tomcat的相关配置- - Servlet的体系结构- - 路径的配置(http直接复写方法即可,doget)<br />- 实验<br />```javapackage cn.demo1;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 java.io.IOException;@WebServlet("/user")public class Servlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.printf("大傻子");}}
HTTP
1. 概念
- 传输协议:定义了,客户端和服务器端通信时,发送数据的格式- 特点:- 基于TCP/IP的高级协议- 默认端口号:80- 基于请求/响应模型的:一次请求对应一次响应- 无状态的:每次请求之间相互独立,不能交互数据- 历史版本:- 
2. 请求
- 请求消息数据格式- 请求行<br />演示(在web/html中写入get时)<br /><br /><br /><br />**演示(在web/html中写入post时)**<br /><br /><br />- **请求头(客户端浏览器告诉服务器一些信息)<br />**- **请求空行:用来分隔post请求的请求头和请求体的**- **请求体(正文):封装post请求消息的请求参数的**- 请求格式<br />
3. HTTP协议
- 请求消息:客户端发送给服务器端的数据- 数据格式- 请求头- 请求头- 请求空行- 请求体- 响应消息:服务器端发送给客户端的数据- 数据格式- 响应行<br />- 响应头<br />- 响应空行- 响应体:传输的数据- 响应字符串格式(响应头+响应尾)<br />- 
request功能
1. 获取请求消息数据
(1)获取请求行数据
- URI:统一资源定位符:http://localhost/day14/demo1 ---中华人民共和国<br />URL:统一资源标识符:/day14/demo1 ---共和国- - 快速创建servlet<br /><br />- 请求方法示例<br />
package Servlet;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 java.io.IOException;@WebServlet("/servletDemo1")public class ServletDemo1 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.获取请求方式:getString method = request.getMethod();System.out.println(method);//2.获取虚拟目录 ---重要String contextPath = request.getContextPath();System.out.println(contextPath);//3.获取servlet路径String servletPath = request.getServletPath();System.out.println(servletPath);//4.获取get方式请求参数String queryString = request.getQueryString();System.out.println(queryString);//5.获取请求URI ---重要String requestURI = request.getRequestURI();StringBuffer requestURL = request.getRequestURL();System.out.println(requestURI);System.out.println(requestURL);//6.获取协议以及版本String protocol = request.getProtocol();System.out.println(protocol);//7.获取客户机的IP地址String remoteAddr = request.getRemoteAddr();System.out.println(remoteAddr);}}
- 结果(网址后边加上?name=lisi)<br />
(2)获取请求头数据
- 
package Servlet;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 java.io.IOException;import java.util.Enumeration;@WebServlet("/ServletDemo2")public class ServletDemo2 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//演示获取所有请求头数据//1.获取所有请求头名称Enumeration<String> headerNames = request.getHeaderNames();//2.遍历while(headerNames.hasMoreElements()){String name = headerNames.nextElement();//根据名称获取请求头的值String value = request.getHeader(name);System.out.println(name+"---"+value);}}}
- 结果<br />
(3)单独获取头数据
- user-agent 代码(获取浏览器信息)
package Servlet;ximport sun.management.resources.agent;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 java.io.IOException;import java.util.Enumeration;@WebServlet("/ServletDemo3")public class ServletDemo3 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//演示获取所有请求头数据:user-agentString agent = request.getHeader("user-agent");//判断agent的浏览器版本if(agent.contains("Chrome")){//谷歌System.out.println("谷歌浏览器来了");}else{//其他浏览器System.out.println("这是什么鬼浏览器");}}}
- 结果<br />- referer 代码(获取转跳网址的信息,盗链直接通过这个处理)<br />先配置转跳信息,通过login转跳到那里才能获取<br />
package Servlet;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 java.io.IOException;@WebServlet("/ServletDemo4")public class ServletDemo4 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//演示获取所有请求头数据:refererString referer = request.getHeader("referer");System.out.println(referer);}}
- 结果<br /><br />
(4)获取请求体数据
- 请求体:只有post请求方法,才有请求体,在请求体中封装了post请求的请求参数- 步骤- 获取流对象<br />- 再从流对象中拿数据- 演示(html文件)<br /><br />demo5数据<br /><br />页面+结果<br /><br />
2. 其他功能
(1)获取请求参数的通用方式:无论get或post
- String getParameter(String name):根据参数名称获取参数名(单独获取多个)- - - - String[ ] getParameterValues(String name):根据参数名称获取参数值的数组(打勾)- - - - Enumeration<String> getParameterNames():获取所有请求的参数名称(继而获取值)- - - - Map<String,String[ ]> getParameterMap():获取所有参数的map集合(有效获取所有数据)- - - - 注:- 修改get,post的方式是再html中修改类型- doget中的方法体其实与dopost一样所以直接(可以结案哼)- 中文乱码问题- 在get方式中不会乱码(内部解决)- 在post方式中会乱码<br />在设置参数之前设置编码即可<br /><br />然后就行了<br />
(2)请求转发
- 概念:一种在服务器内部的资源转跳方式- 步骤:- 通过request对象获取请求转发器对象- 使用requestDispatcher对象来进行转发<br /><br />demo4<br /><br />结果<br />- 特点:- 浏览器地址栏路径没发生变化- 只能转发到当前的服务器内部的资源中(不能跳转到外网)- 转发是一次请求,另一次请求在内部实现
(3)共享数据
- 域对象:一个有作用范围的对象,可以共享数据- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据- 方法- void setAttribute(String name,Object obj):储存数据- object getAttribute(String name):通过键获取值- void removeAttribute(String name):通过键移除键值对 <br />添加<br /><br />获取<br /><br />结果<br />- 获取ServletContext:- 获取并输出<br /><br />输出<br />
Response对象
1. 设置响应行
- 格式与状态码的设置 :- - **案例一**:完成重定向(重定向是网址访问的推诿,从一个网站转跳到另一个网站)- 复杂的重定向<br />- 简单的重定向<br />- 结果<br />- 重定向的特点- 地址栏发生变化- 重定向可以访问其他站点(服务器)的资源- 重定向是两次请求(中间返回,不能用request共享对象)- 转发的特点- 转发地址栏路径不发生改变- 转发只能访问当前服务器下的资源- 转发是一次请求(可以共享数据)- 路径的写法- 相对路径<br />- 绝对路径<br />- 获取动态虚拟目录(然后直接拼接到重定向方法中)<br />- 路径使用注意点- 
2. 设置响应头
- 格式- - **案例三:向浏览器输出验证码**- **创建图片对象<br />美化图片<br />将图片输出到页面展示**- **代码**
package Servlet;import javax.imageio.ImageIO;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.swing.*;import java.awt.*;import java.awt.image.BufferedImage;import java.io.BufferedReader;import java.io.IOException;import java.io.PrintWriter;import java.util.Enumeration;import java.util.Map;import java.util.Random;import java.util.Set;@WebServlet("/ServletDemo5")public class ServletDemo5 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {int height=50;int width=100;//1.创建一对象,在内存中存储(验证码图片对象)BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//2.美化图片//2.1填充背景色Graphics g = image.getGraphics(); //画笔对象g.setColor(Color.pink); //设置画笔颜色g.fillRect(0,0,width,height); //填充长方形//2.2画边框g.setColor(Color.blue);g.drawRect(0,0,width-1,height-1);String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefjhijklmnopqrstuvwxyz0123456789";//生成随机角标Random ran = new Random();for(int i = 1;i<=4;i++){int index=ran.nextInt(str.length());//获取字符char ch = str.charAt(index); //生成随机字符//2.3写验证码g.drawString(ch+"",width/5*i,height/2);}//2.4画干扰线g.setColor(Color.green);//随机生成坐标点for(int i = 0 ; i < 10; i++){int x1 = ran.nextInt(width);int x2 = ran.nextInt(width);int y1 = ran.nextInt(height);int y2 = ran.nextInt(height);g.drawLine(x1,y1,x2,y2);}//3.将图片输出到页面展示ImageIO.write(image,"jpg",response.getOutputStream());}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}}
3. 设置响应体
- 获取输出流- - 使用输出流,将数据输出到客户端浏览器- **案例二:**服务器输出字符数据到浏览器(注意中文乱码问题,这里设置了编码格式)(主要输出字符)- - 服务器输出字节数据到浏览器(主要输出照片等格式)- 
ServletContext对象
- 概念:代表整个web应用,可以和程序的容器(服务器)通信- 获取:- 通过request对象获取- 通过HHttpServlet获取(静态方法)<br /><br />结果<br />- 功能- **获取MIME类型**<br />类型介绍<br /><br />使用<br /><br />结果<br />- **域对象:共享数据(所有用户都可以共享数据,不推荐,会造成数据压力)<br /><br />演示(需要先启动4,再使用5才能获取到)<br /><br />使用<br />**- **获取文件的真实(服务器)路径(情况挺多的)**
会话
1. 概念
- **会话**:一次会话中包含多次请求和响应(一次会话从第一次请求开始,直到一方断开)- **功能**:在一次会话范围内的多次请求间共享数据- **方式**:- **客户端对话技术**:Cookie- **服务端对话技术**:Session
2. Cookie
(1)基本概念
- **概念**:客户端会话技术,将数据保存到客户端- **入门:**- **创建Cookie对象,绑定数据**<br />new Cookie(String name,String value)- **发送Cookie对象**<br />response.addCookie(Cookie cookie)- **获取Cookie,拿到数据**<br />Cookie[ ] request.getCookies()- **使用示例<br /><br /><br />结果<br />**- **实现原理:基于响应头set-cookie和响应头cookie实现**
(2)细节及实现
- **cookie的细节**- 一次可不可以发送多个cookie?- 可以- 可以创建多个cookie对象,使用response调用多次addCookie方法发送cookie- cookie可以在浏览器中保存多长时间- 默认情况下当浏览器关闭之后,cookie数据被销毁- 持久化储存- <br />关闭浏览器30秒之后cookie无法访问(储存到本地之后又删除了)<br />- cookie能不能存中文?- - cookie共享问题?- 假设在一个tomcat服务器中,部署了多个web项目,那么可否共享cookie?- 不同的tomcat服务器间cookie共享问题?<br />- **Cookie的特点和作用**- **特点**- **cookie存储数据在客户端浏览器**- **浏览器对于单个cookie的大小有限制(4KB)以及对同一个域名下的cookie总数(20)**- **作用**- **cookie一般用于存储少量的不太敏感的数据**- **在不登陆的情况下,完成服务器对客户端的身份识别**- **使用:**- **注意:cookie的名称如果相同的话,值就会被覆盖掉**- **注意:正常的cookie无法储存特殊字符,需要转码为URL编码然后储存<br />**
package Servlet;import javax.imageio.ImageIO;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;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.swing.*;import java.awt.*;import java.awt.image.BufferedImage;import java.io.BufferedReader;import java.io.File;import java.io.IOException;import java.io.PrintWriter;import java.net.URLDecoder;import java.net.URLEncoder;import java.text.SimpleDateFormat;import java.util.*;@WebServlet("/ServletDemo5")public class ServletDemo5 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置响应的消息体的数据格式+编码response.setContentType("text/html;charset=utf-8");//1.获取所有cookieCookie[] cookies = request.getCookies();boolean flag = false; //没有cookie为lastTime//2.遍历cookie数组if(cookies != null && cookies.length > 0){for (Cookie cookie : cookies) {//3.获取cookie的名称String name = cookie.getName();//4.判断名称是否是:lastTimeif("lastTime".equals(name)){//有该cookie,不是第一次访问flag = true;//设置cookie的value//获取当前时间,重新设置cookie的值,重新发送cookieDate date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String str_date = sdf.format(date);System.out.println("编码前: "+str_date);//URL编码str_date = URLEncoder.encode(str_date,"utf-8");System.out.println("编码后: "+str_date);cookie.setValue(str_date);//设置cookie的存活时间一个月cookie.setMaxAge(60*60*24*30);response.addCookie(cookie);//响应数据//获取cookie的value时间String value = cookie.getValue();System.out.println("解码前: "+value);//URL解码value = URLDecoder.decode(value,"utf-8");System.out.println("解码后: "+value);response.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+value+"</h1>");break;}}}if(cookies==null||cookies.length==0||flag==false){//第一次访问//设置cookie的value//获取当前时间,重新设置cookie的值,发送cookieDate date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String str_date = sdf.format(date);System.out.println("编码前: "+str_date);//URL编码str_date = URLEncoder.encode(str_date,"utf-8");System.out.println("编码后: "+str_date);Cookie cookie = new Cookie("lastTime",str_date);//设置cookie的存活时间一个月cookie.setMaxAge(60*60*24*30);response.addCookie(cookie);response.getWriter().write("<h1>欢迎首次访问</h1>");}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}}
- 效果(舒服)<br />
3. Session
(1)概念+入门
- **概念**:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。- **快速**(和cookie很像):- 获取HttpSession对象<br />**HttpSession session = request.getSession();**- 使用HttpSession对象<br />**object getAttribute(String name)<br />void setAttribute(String name,Object value)<br />void removeAttribute(String name)**- **原理**- **session的实现依赖于cookie(使用cookie来存储ID来确认身份)**- **细节**- **当客户端关闭后,服务器不关闭,两次获取session是否为同一个?**- 不是!!!- **如果想要相同,必须储存cookie来村春ID<br />**- **客户端不关闭,服务器关闭后,两次获取的session是否相同**- 不是!!!,但是这个一定要确保数据不能丢失- **session的钝化:**- 在服务器关闭之前将session对象序列化到硬盘上- **session的活化:**- 在服务器启动后,将session文件转化为内存中的session对象- **使用tomcat服务器直接启动的话会自动完成session的钝化和活化,以后不必担心**- **客户端什么时候被销毁**- 服务器被关闭- session对象调用invalidate();- session默认失效时间:30(打开30分钟不做任何操作,但是可以进行修改)**<br />**- **特点:**- session用于存储一次会话的多次请求的数据,存在服务器端- session可以存储任意类型 任意大小的数据- **session与Cookie的区别**- session存储在服务器端,Cookie存储在客户端- session没有数据大小限制,Cookie有- session数据安全,Cookie相对不安全 **<br />
